二开案例.表单插件.获取多选基础资料的编码和名称

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.表单插件.获取多选基础资料的编码和名称

【应用场景】

多选基础资料字段,因为要实现其多选的特性,其值是采用单独的数据表存储,也因为这个特殊的设计,导致其无法在列表上查询和显示,也不支持设置数据规则等等。。

如果要在列表上查询和显示多选基础资料,目前的变通方式为,在多选基础资料字段所在单据体上新增一个文本字段,专门用于存储多选基础资料字段的编码或者名称,然后用该字段代替多选基础资料字段进行查询,显示或者其他多选基础资料字段无法完成的功能。


【案例演示】

采购订单,新增多选基础资料字段-供应商,新增两个文本字段分别用于存储供应商编码和供应商名称。


【实现步骤】

<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二次开发案例演示】

https://vip.kingdee.com/article/94751030918525696

二开案例.表单插件.获取多选基础资料的编码和名称

【应用场景】多选基础资料字段,因为要实现其多选的特性,其值是采用单独的数据表存储,也因为这个特殊的设计,导致其无法在列表上查询和显...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息