电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

二开案例.服务插件.辅助资料校验编码名称重复区分大小写

来源:金蝶云社区作者:金蝶2024-09-2318

二开案例.服务插件.辅助资料校验编码名称重复区分大小写

【应用场景】辅助资料保存操作校验编码名称唯一性时,在SqlServer账套下默认是忽略大小写的,而某些应用场景需要区分大小写。

【案例演示】自定义服务插件,重写标准产品的唯一性校验器,校验编码名称重复时,区分大小写。

【实现步骤】

<1>编写服务插件,代码如下。

using Kingdee.BOS;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Core;

using Kingdee.BOS.Core.Metadata.FieldElement;

using Kingdee.BOS.Core.Validation;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Util;

using System.Collections.Generic;

using System.ComponentModel;


namespace Jac.XkDemo.BOS.App.PlugIn

{

    /// <summary>

    /// 【服务插件】辅助资料校验编码名称重复区分大小写

    /// </summary>

    [Description("【服务插件】辅助资料校验编码名称重复区分大小写"), HotUpdate]

    public class AssistantSaveOperationServicePlugIn : Kingdee.BOS.App.ServicePlugIn.Assistant.Save

    {

        /// <summary>

        /// 注册自定义校验器

        /// </summary>

        /// <param name="e"></param>

        public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e)

        {

            // 添加名称重复校验器

            var nameValidator = new IsExistNameSaveValidator();

            nameValidator.EntityKey = "FBillHead";

            e.Validators.Add(nameValidator);

            // 添加编码重复校验器

            var numberValidator = new IsExistCodeSaveValidator();

            numberValidator.EntityKey = "FBillHead";

            e.Validators.Add(numberValidator);

        }


        /// <summary>

        /// 获取SqlServer数据库符号集

        /// </summary>

        /// <param name="ctx"></param>

        /// <returns></returns>

        public static string GetCollate(Context ctx)

        {

            return DbQueryUtils.IsSqlServerDb(ctx) ? " COLLATE Chinese_PRC_CS_AS " : "";

        }


        /// <summary>

        /// 获取方言标记

        /// </summary>

        /// <param name="ctx"></param>

        /// <returns></returns>

        public static string GetCollateDialect(Context ctx)

        {

            return DbQueryUtils.IsSqlServerDb(ctx) ? "/*dialect*/" : "";

        }

    }


    /// <summary>

    /// 名称重复校验器

    /// 1、有禁用项目分类重名,则提示,是否继续新增。

    /// 2、非禁用项目分类重名,则阻止新增。

    /// </summary>

    internal class IsExistNameSaveValidator : AbstractValidator

    {

        public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx)

        {

            foreach (var dynObj in dataEntities)

            {

                //如果有重名,iExistState不为0则表示为有重名

                var exists = IsExistSameName(Context, dynObj.DataEntity);

                if (exists != 0)

                {

                    //定义错误信息

                    ValidationErrorInfo errorInfo;

                    switch (exists)

                    {

                        case 2: //有禁用项目重名,则提示,是否继续新增。ErrorLevel.Warning

                            errorInfo = new ValidationErrorInfo(

                                dynObj.DataEntity["Number"].IsNullOrEmptyOrWhiteSpace() ? "" : dynObj.DataEntity["Number"].ToString(),

                                dynObj.DataEntity["Id"].ToString(),

                                dynObj.DataEntityIndex,

                                dynObj.RowIndex,

                                dynObj.DataEntity["Id"].ToString(),

                                string.Format(Kingdee.BOS.Resource.ResManager.LoadKDString("辅助资料类别", "002006030013537", Kingdee.BOS.Resource.SubSystemType.BOS)

                                              + "\"{0}\"" + Kingdee.BOS.Resource.ResManager.LoadKDString("中已存在禁用状态的名称为", "002006030013540", Kingdee.BOS.Resource.SubSystemType.BOS)

                                              + "\"{1}\"" + Kingdee.BOS.Resource.ResManager.LoadKDString("的辅助资料,是否继续保存?", "002006030013543", Kingdee.BOS.Resource.SubSystemType.BOS),

                                    dynObj.DataEntity["FID"] == null ? "'0'" : ((DynamicObject)dynObj.DataEntity["FID"])["Name"].ToString(),

                                    dynObj.DataEntity["DataValue"]),

                                dynObj.DataEntity["Number"].IsNullOrEmptyOrWhiteSpace() ? "" : dynObj.DataEntity["Number"].ToString(),

                                ErrorLevel.Warning);

                            break;

                        default: //非禁用项目重名,则阻止新增。ErrorLevel.FatalError

                            errorInfo = new ValidationErrorInfo(

                                dynObj.DataEntity["Number"].IsNullOrEmptyOrWhiteSpace() ? "" : dynObj.DataEntity["Number"].ToString(),

                                dynObj.DataEntity["Id"].ToString(),

                                dynObj.DataEntityIndex,

                                dynObj.RowIndex,

                                dynObj.DataEntity["Id"].ToString(),

                                string.Format(Kingdee.BOS.Resource.ResManager.LoadKDString("辅助资料类别", "002006030013537", Kingdee.BOS.Resource.SubSystemType.BOS)

                                              + "\"{0}\"" + Kingdee.BOS.Resource.ResManager.LoadKDString("中已存在名称为", "002006030013546", Kingdee.BOS.Resource.SubSystemType.BOS)

                                              + "\"{1}\"" + Kingdee.BOS.Resource.ResManager.LoadKDString("的辅助资料!", "002006030013549", Kingdee.BOS.Resource.SubSystemType.BOS),

                                    dynObj.DataEntity["FID"] == null ? "'0'" : ((DynamicObject)dynObj.DataEntity["FID"])["Name"].ToString(),

                                    dynObj.DataEntity["DataValue"]),

                                dynObj.DataEntity["Number"].IsNullOrEmptyOrWhiteSpace() ? "" : dynObj.DataEntity["Number"].ToString(),

                                ErrorLevel.FatalError);

                            break;

                    }


                    //添加错误提示信息。

                    validateContext.AddError(dynObj.DataEntity, errorInfo);

                }

            }

        }


        /// <summary>

        /// 名称重复校验器

        /// </summary>

        /// <param name="ctx"></param>

        /// <param name="dynamicObject"></param>

        /// <returns>0:无重名;1:与未禁用数据重名;2:与禁用数据重名</returns>

        private int IsExistSameName(Context ctx, DynamicObject dynamicObject)

        {

            // 返回值

            var iResult = 0;

            var fEntryId = "0";

            if (dynamicObject.DataEntityState.FromDatabase)

            {

                fEntryId = dynamicObject["Id"].ToString();

            }


            // 获取父节点内码

            var parentFID = dynamicObject["FID"] == null ? "0" : ((DynamicObject)dynamicObject["FID"])["Id"].ToString();

            // 获取当前的多语言字段

            var multiLanguageText = (LocalDynamicObjectCollection)dynamicObject["MultiLanguageText"];

            var sqlParameterList = new List<SqlParam>();

            var filterList = new List<string>();

            foreach (var languageText in multiLanguageText)

            {

                if (languageText["DataValue"] == null || string.IsNullOrWhiteSpace(languageText["DataValue"].ToString()))

                {

                    continue;

                }


                var dataValue = languageText["DataValue"].ToString();

                filterList.Add(string.Format("(b.FDATAVALUE{0}=@FDATAVALUE{1} AND b.FLOCALEID={2}) ", AssistantSaveOperationServicePlugIn.GetCollate(ctx), sqlParameterList.Count, languageText["LocaleId"]));

                sqlParameterList.Add(new SqlParam("@FDATAVALUE" + sqlParameterList.Count, KDDbType.String, dataValue));

            }


            //根据语言种类,拼装所有的条件

            var strFilterString = string.Join("OR", filterList);

            if (string.IsNullOrEmpty(strFilterString))

            {

                strFilterString = "1=1";

            }


            // 只查询多语言表,判断是否有重名

            string sqlExists = string.Format(@"{0}

SELECT FIsExist=1 WHERE EXISTS(

SELECT 0 FROM T_BAS_ASSISTANTDATAENTRY a 

LEFT JOIN T_

二开案例.服务插件.辅助资料校验编码名称重复区分大小写

【应用场景】辅助资料保存操作校验编码名称唯一性时,在SqlServer账套下默认是忽略大小写的,而某些应用场景需要区分大小写。【案例演示】...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信