二开案例.表达式函数.获取枚举项名称
【应用场景】
在表达式中获取枚举项名称。
【案例演示】
采购订单,新增下拉列表字段,通过表达式将下拉列表选中项的枚举值对应的枚举项名称携带到文本字段。
【实现步骤】
<1>编写函数,实现获取枚举项名称的功能(代码见附件)。
using Kingdee.BOS;
using Kingdee.BOS.Core.DependencyRules;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.Expression.FuncDefine;
using Kingdee.BOS.Core.Metadata.FieldElement;
using System;
namespace Jac.XkDemo.BOS.Core.Functions
{
/// <summary>
/// 【函数】获取枚举项名称
/// </summary>
[Serializable]
public class GetEnumNameFuncDefine : AbstractFuncDefine
{
public GetEnumNameFuncDefine()
{
}
public GetEnumNameFuncDefine(Context ctx, dynamic obj)
{
m_ctx = ctx;
m_obj = obj;
}
public override IFuncDefine GetFunctionDefine(Context ctx, dynamic obj)
{
return new GetEnumNameFuncDefine(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) as ComboField;
if (field == null)
{
return null;
}
object fieldValue = null;
if (field.Entity is HeadEntity)
{
fieldValue = dynamicRowModel.Model.GetValue(field);
}
else
{
// 获取字段所在的单据体的数据包
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;
}
fieldValue = dynamicRowModel.Model.GetValue(field, currentRowIndex);
}
if (fieldValue == null || string.IsNullOrWhiteSpace(fieldValue.ToString()))
{
return null;
}
if (field is MulComboField)
{
return ((MulComboField)field).GetMulEnumItemName(fieldValue);
}
return field.GetEnumItemName(fieldValue);
}
}
}
<2>注册函数(可参考:https://vip.kingdee.com/article/74091717745675520)。
DELETE T_MDL_ELEMENTTYPE WHERE FID=888013;
INSERT INTO T_MDL_ELEMENTTYPE (FID,FIMGKEY,FTYPEID,FISVISIBLE,FELEMENTCLASS,FAPPEARANCECLASS)
VALUES (888013, '', 1, 0, 'Jac.XkDemo.BOS.Core.Functions.GetEnumNameFuncDefine,Jac.XkDemo.BOS.Core', 'BOS_GETENUMNAME');
DELETE T_MDL_DOMAINMODELELEMENTMAP WHERE FID=1200 and FELEMENTGROUPID=24 and FELEMENTTYPEID=888013;
INSERT INTO T_MDL_DOMAINMODELELEMENTMAP (FID, FENTRYID, FELEMENTTYPEID, FELEMENTGROUPID, FSEQ)
VALUES (1200, 888013, 888013, 24, 81);
DELETE T_MDL_ELEMENTTYPE_L WHERE FID=888013 AND FLOCALEID=2052;
INSERT INTO T_MDL_ELEMENTTYPE_L(FID,FNAME,FDESCRIPTION,FLOCALEID,FPKID)
VALUES (888013,N'获取枚举项名称',N'根据下拉列表字段的枚举项的值反查枚举项的名称。
使用示例:
获取枚举项名称:GETENUMNAME(''F_Jac_Combo'')
',2052,(SELECT ISNULL(MAX(FPKID), 0) + 1 FROM T_MDL_ELEMENTTYPE_L WHERE FPKID > 100000));
<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<4>BOSIDE扩展采购订单,新增多种下拉列表字段,给下拉列表字段添加值更新事件,配置表达式,将下拉列表字段的枚举项对应的名称携带到文本字段,保存元数据,开发完毕。
值更新事件计算公式:
F_Jac_Text = GETENUMNAME('F_Jac_MulCombo')
【功能验证】
登录业务系统,打开采购订单新增界面,给多选下拉列表选择下拉项,此时名称字段能自动获取下拉列表字段的枚举项的名称。
---------------------------------------------------------------------------------------------------------
【知识点】
下拉列表字段的枚举项集合的定义,不在单据的数据包中,而在下拉列表字段的元数据中,而表达式只能访问单据的数据包,不能访问单据的元数据,因此才会导致要获取其名称比较麻烦。
枚举项集合元数据:
Kingdee.BOS.Core.Metadata.FieldElement.ComboField.EnumObject
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表达式函数.获取枚举项名称
本文2024-09-23 04:08:35发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-163403.html