二开案例.表达式函数.获取字段在上一行中的值
【应用场景】获取字段在上一行中的值,通常应用于单据体或子单据体中。
【案例演示】新增函数,用于获取字段在上一行中的值,在采购订单的明细单据体中,当录入物料时,设置当前行的采购数量等于上一行的采购数量。
【实现步骤】
<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
二开案例.表达式函数.获取字段在上一行中的值
本文2024-09-23 04:19:42发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164603.html