二开案例.表达式函数.获取字段在上一行中的值

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

二开案例.表达式函数.获取字段在上一行中的值

【应用场景】获取字段在上一行中的值,通常应用于单据体或子单据体中。

【案例演示】新增函数,用于获取字段在上一行中的值,在采购订单的明细单据体中,当录入物料时,设置当前行的采购数量等于上一行的采购数量。

【实现步骤】

<1>编写函数,代码如下。

using Kingdee.BOS;

using Kingdee.BOS.Core.DependencyRules;

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.Core.Metadata.Expression.FuncDefine;

using System;


namespace Jac.XkDemo.BOS.Core.Functions

{

    /// <summary>

    /// 【函数】获取字段在上一行中的值

    /// </summary>

    [Serializable]

    public class GetPreRowFieldValueFuncDefine : AbstractFuncDefine

    {

        public GetPreRowFieldValueFuncDefine()

        {

        }


        public GetPreRowFieldValueFuncDefine(Context ctx, dynamic obj)

        {

            m_ctx = ctx;

            m_obj = obj;

        }


        public override IFuncDefine GetFunctionDefine(Context ctx, dynamic obj)

        {

            return new GetPreRowFieldValueFuncDefine(ctx, obj);

        }


        public override object GetFuncDefine()

        {

            return new Func<string, object>(FuncDefine);

        }


        /// <summary>

        /// 获取字段在上一行中的值

        /// </summary>

        /// <param name="fieldKey">字段名</param>

        /// <returns>返回字段在上一行中的值</returns>

        object FuncDefine(string fieldKey)

        {

            if (string.IsNullOrWhiteSpace(fieldKey))

            {

                return null;

            }


            var businessInfo = (BusinessInfo)m_obj.ActiveInfo;

            var dynamicRowModel = (BOSDynamicRow)m_obj.ActiveObject;

            // 获取字段元数据

            var field = businessInfo.GetField(fieldKey);

            if (field == null)

            {

                return null;

            }


            // 获取字段所在的单据体的数据包

            var entityDataObject = dynamicRowModel.Model.GetEntityDataObject(field.Entity);

            if (entityDataObject == null || entityDataObject.Count == 0)

            {

                return null;

            }


            // 获取当前行的行索引

            var currentRowIndex = dynamicRowModel.Model.GetEntryCurrentRowIndex(field.EntityKey);

            if (currentRowIndex <= 0 || currentRowIndex > entityDataObject.Count - 1)

            {

                return null;

            }


            // 获取上一行的行索引

            var preRowIndex = currentRowIndex - 1;

            var preRowFieldValue = dynamicRowModel.Model.GetValue(field, preRowIndex);

            return preRowFieldValue;

        }

    }

}


<2>注册函数(可参考:https://vip.kingdee.com/article/74091717745675520)。

-- 获取字段在上一行中的值 

DELETE T_MDL_ELEMENTTYPE WHERE FID=888012;

INSERT INTO T_MDL_ELEMENTTYPE (FID,FIMGKEY,FTYPEID,FISVISIBLE,FELEMENTCLASS,FAPPEARANCECLASS)

VALUES (888012, '', 1, 0, 'Jac.XkDemo.BOS.Core.Functions.GetPreRowFieldValueFuncDefine,Jac.XkDemo.BOS.Core', 'BOS_GETPREROWFIELDVALUE');


DELETE T_MDL_DOMAINMODELELEMENTMAP WHERE FID=1200 and FELEMENTGROUPID=24 and FELEMENTTYPEID=888012;

INSERT INTO T_MDL_DOMAINMODELELEMENTMAP (FID, FENTRYID, FELEMENTTYPEID, FELEMENTGROUPID, FSEQ)

VALUES (1200, 888012, 888012, 24, 81);

 

DELETE T_MDL_ELEMENTTYPE_L WHERE FID=888012 AND FLOCALEID=2052;

INSERT INTO T_MDL_ELEMENTTYPE_L(FID,FNAME,FDESCRIPTION,FLOCALEID,FPKID) 

VALUES (888012,N'获取字段在上一行中的值',N'功能说明:获取指定的字段在其对应单据体数据包的当前行的上一行中的值。

使用示例:

GETPREROWFIELDVALUE(''FQty'')

',2052,(SELECT ISNULL(MAX(FPKID), 0) + 1 FROM T_MDL_ELEMENTTYPE_L WHERE FPKID > 100000)); 


<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<4>BOSIDE扩展采购订单,物料编码字段的值更新事件新增一个计算服务,如下图所示,保存元数据,开发完毕。

计算公式:FQty = GETPREROWFIELDVALUE('FQty')




【功能验证】

<1>登录业务站点,打开采购订单编辑界面,录入物料,此时,当前行的采购数量已自动被设置为上一行的采购数量。

--------------------------------------------------------------------------------------------------------














【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696


二开案例.表达式函数.获取字段在上一行中的值

【应用场景】获取字段在上一行中的值,通常应用于单据体或子单据体中。【案例演示】新增函数,用于获取字段在上一行中的值,在采购订单的明...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息