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

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

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

【应用案例】在表达式中,如何在中文环境下获取英文词条?

【场景描述】有单选辅助资料字段【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)

            {

                DynamicObject obj;

                if (((LocalDynamicObjectCollection)localeValue).FindByLocaleId(localeId, out obj))

                {

                    if (obj.DynamicObjectType.Properties.Contains("Name"))

                    {

                        return Convert.ToString(obj["Name"]);

                    }

                    return Convert.ToString(obj[2]);

                }

                return string.Empty;

            }

            return localeValue.ToString();

        }

    }

}





/*

--函数注册脚本

DELETE T_MDL_ELEMENTTYPE WHERE FID=888002;

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

VALUES (888002, '', 1, 0, 'Jac.XkDemo.BOS.Core.Functions.GetLocaleValueFuncDefine,Jac.XkDemo.BOS.Core', 'BOS_GetLocaleValue');


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

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

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

 

DELETE T_MDL_ELEMENTTYPE_L WHERE FID=888002 AND FLOCALEID=2052;

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

VALUES (888002,N'获取多语言文本的指定语言下的文本',N'获取多语言文本的指定语言下的文本',2052,(SELECT ISNULL(MAX(FPKID), 0) + 1 FROM T_MDL_ELEMENTTYPE_L WHERE FPKID > 100000)); 

 */




自定义函数注册方法可参考:https://vip.kingdee.com/article/74091717745675520
















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

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

【应用案例】在表达式中,如何在中文环境下获取英文词条?【场景描述】有单选辅助资料字段【F_kin_Assistant】(经验方式)和文本字段【F_k...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息