二开案例.表单插件.获取多选基础资料的编码和名称
【应用场景】
多选基础资料字段,因为要实现其多选的特性,其值是采用单独的数据表存储,也因为这个特殊的设计,导致其无法在列表上查询和显示,也不支持设置数据规则等等。。
如果要在列表上查询和显示多选基础资料,目前的变通方式为,在多选基础资料字段所在单据体上新增一个文本字段,专门用于存储多选基础资料字段的编码或者名称,然后用该字段代替多选基础资料字段进行查询,显示或者其他多选基础资料字段无法完成的功能。
【案例演示】
采购订单,新增多选基础资料字段-供应商,新增两个文本字段分别用于存储供应商编码和供应商名称。
【实现步骤】
<1>编写表单插件,代码如下。
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System.ComponentModel;
using System.Linq;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【表单插件】获取多选基础资料的编码和名称
/// </summary>
[Description("【表单插件】获取多选基础资料的编码和名称"), HotUpdate]
public class GetMultiBaseDataNumberAndNameFormPlugIn : AbstractDynamicFormPlugIn
{
public override void DataChanged(DataChangedEventArgs e)
{
base.DataChanged(e);
if (e.Field.Key.EqualsIgnoreCase("F_Jac_MulBase"))
{
var value = this.View.Model.GetValue("F_Jac_MulBase") as DynamicObjectCollection;
if (value == null || value.Count == 0)
{
this.View.Model.SetValue("F_Jac_TextCode", "");
this.View.Model.SetValue("F_Jac_TextName", "");
}
else
{
var numbers = string.Join(",", value.Select(o => ((DynamicObject)o["F_Jac_MulBase"])["Number"].ToString()));
var names = string.Join(",", value.Select(o => ((DynamicObject)o["F_Jac_MulBase"])["Name"].ToString()));
this.View.Model.SetValue("F_Jac_TextCode", numbers);
this.View.Model.SetValue("F_Jac_TextName", names);
}
}
}
}
}
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>BOSIDE扩展采购订单,新增多选基础资料字段-供应商,新增两个文本字段,注册表单插件,保存元数据,开发完毕。
【功能验证】
<1>登录业务站点,打开采购订单编辑界面,录入供应商,即可自动获取供应商的编码和名称。
【历史数据处理】
如果冗余的文本字段不是和多选基础资料字段一起创建的,则可能存在历史数据需要同步更新,仍以本案例中的采购订单上的多选供应商字段为例,演示如何更新历史数据。
<1>确认多选基础资料字段的存储表和其所在单据体的存储表
SELECT a.* FROM Jac_t_Cust_Entry100202 a JOIN T_PUR_POORDER b ON a.FID=b.FID WHERE b.FBILLNO='CGDD000577'
此例中:
多选基础资料字段的存储表:Jac_t_Cust_Entry100202
多选基础资料字段所在单据体的存储表:T_PUR_POORDER
关联外键:FID
多选基础资料的内码对应的列名:F_JAC_MULBASE
<2>基于多选基础资料字段的存储表和其所在单据体的存储表,创建自定义函数如下:
-- =============================================
-- Author: <Jack>
-- Create date: <2021-11-30>
-- Description: <创建自定义函数,用于获取采购订单的多选供应商字段的编码或名称>
-- =============================================
CREATE FUNCTION F_GetPOOrderSupplier
(
@TypeId INT,--0取内码(默认)1取编码2取名称
@Id INT,--采购订单的内码
@SplitChar VARCHAR(10)--分割符
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @Rval NVARCHAR(4000)
SET @Rval=''
IF @TypeId=1
BEGIN
SELECT @Rval=(CASE WHEN @Rval='' THEN @Rval ELSE @Rval+@SplitChar END)+b.FNUMBER FROM Jac_t_Cust_Entry100202 a
JOIN T_BD_SUPPLIER b ON a.F_JAC_MULBASE=b.FSUPPLIERID
WHERE a.FID=@Id
END
ELSE IF @TypeId=2
BEGIN
SELECT @Rval=(CASE WHEN @Rval='' THEN @Rval ELSE @Rval+@SplitChar END)+b.FNAME FROM Jac_t_Cust_Entry100202 a
JOIN T_BD_SUPPLIER_L b ON a.F_JAC_MULBASE=b.FSUPPLIERID AND b.FLOCALEID=2052
WHERE a.FID=@Id
END
ELSE
BEGIN
SELECT @Rval=(CASE WHEN @Rval='' THEN @Rval ELSE @Rval+@SplitChar END)+CAST(a.F_JAC_MULBASE AS NVARCHAR(100)) FROM Jac_t_Cust_Entry100202 a
WHERE a.FID=@Id
END
RETURN @Rval
END
<3>执行以下SQL,验证生成的供应商编码和名称数据是否正确。
SELECT dbo.F_GetPOOrderSupplier(0,FID,',') AS 多选供应商内码
,dbo.F_GetPOOrderSupplier(1,FID,',') AS 多选供应商编码
,dbo.F_GetPOOrderSupplier(2,FID,',') AS 多选供应商名称
,* FROM dbo.T_PUR_POORDER
<4>执行以下SQL,完成数据更新(执行前建议先备份账套)。
UPDATE T_PUR_POORDER SET F_Jac_TextCode=dbo.F_GetPOOrderSupplier(1,FID,','),F_Jac_TextName=dbo.F_GetPOOrderSupplier(2,FID,',')
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】
二开案例.表单插件.获取多选基础资料的编码和名称
本文2024-09-23 04:18:39发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164489.html