二开案例.表达式函数.在中文环境下获取英文词条

【应用案例】在表达式中,如何在中文环境下获取英文词条?
【场景描述】有单选辅助资料字段【F_kin_Assistant】(经验方式)和文本字段【F_kin_Text】(经验方式(英文)),怎么将辅助资料的名称中的英文名称(LocaleID=1033)携带到文本字段上呢?

方案1:Python语法实现。
编写表达式首先应该了解数据包的结构以及多语言文本在当前数据包中的具体位置,如下图所示:

例如:
F_kin_Text = filter(lambda x:x[1]==1033, F_kin_Assistant.MultiLanguageText)[0][2]
如果多语言文本所在字段的值有可能为null,则使用以下表达式:
F_kin_Text = ((filter(lambda x:x[1]==1033, F_kin_Assistant.MultiLanguageText)[0][2]) if (F_kin_Assistant<>null) else '')
更糟糕的,如果多语言文本的指定语言也可能为null(比如英文压根就没有启用),则使用以下表达式:
F_kin_Text = ((filter(lambda x:x[1]==1033, F_kin_Assistant.MultiLanguageText)[0][2]) if (F_kin_Assistant<>null and F_kin_Assistant.MultiLanguageText<>null and len(filter(lambda x:x[1]==1033, F_kin_Assistant.MultiLanguageText))>0) else '')
优点:简单。
缺点:难理解,代码不够健壮。
方案2:编写自定义函数实现。
例如:
F_kin_Text = GetLocaleValue (F_kin_Assistant.MultiLanguageText ,1033)
优点:容易理解,代码想多健壮都可以。
缺点:需编写C#组件。
配置界面如下图所示:

方案2示例代码:
using Kingdee.BOS;
using Kingdee.BOS.Core.Metadata.Expression.FuncDefine;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using System;
namespace Jac.XkDemo.BOS.Core.Functions
{
/// <summary>
/// 【函数】获取多语言文本的指定语言下的文本
/// </summary>
[Serializable]
public class GetLocaleValueFuncDefine : AbstractFuncDefine
{
public GetLocaleValueFuncDefine()
{
}
public GetLocaleValueFuncDefine(Context ctx, dynamic obj)
{
m_ctx = ctx;
m_obj = obj;
}
public override IFuncDefine GetFunctionDefine(Context ctx, dynamic obj)
{
return new GetLocaleValueFuncDefine(ctx, obj);
}
public override object GetFuncDefine()
{
return new Func<object, int, string>(FuncDefine);
}
/// <summary>
/// 获取多语言文本的指定语言
/// </summary>
/// <param name="localeValue">多语言文本</param>
/// <param name="localeId">语言ID</param>
/// <returns></returns>
string FuncDefine(object localeValue, int localeId)
{
if (localeValue == null)
{
return null;
}
if (localeValue is LocalDynamicObjectCollection)
{
二开案例.表达式函数.在中文环境下获取英文词条
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



