二开插件 - 动态调用必录校验器的方法

客户需求: 目前操作可以配置校验器,如果校验失败可以终止操作。但是操作的校验器需要在元数据中配置后才会执行,能不能根据需要动态调用校验器呢?

解决方法:
1. 通过T_MDL_FORMVALIDATIONTYPE / T_MDL_FORMVALIDATIONTYPE_L查看校验器Id。
可知必录校验器的FTYPEID=1014
2. 通过元数据,查看校验器的表达式。
可知格式为 单据体Key + 冒号 + 字段 + 分号,同一单据体的字段可以列多个。
不同单据体的字段需要创建不同的校验器。

3. 调用必录校验器的代码如下,可以动态增加必录字段。
/// <summary>
/// 为每个实体的必录字段创建必录校验器
/// </summary>
/// <param name="ctx"></param>
/// <param name="bizInfo">单据元数据</param>
/// <param name="dataEntities">数据包</param>
/// <param name="dic">多个必录校验的表达式。Key=EntityKey,Value=Express</param>
/// <param name="option">可以为null</param>
/// <returns></returns>
private static List<ValidationErrorInfo> ValidateMustInput(Context ctx, BusinessInfo bizInfo, DynamicObject[] dataEntities, Dictionary<string, string> dic, OperateOption option)
{
var lstValidation = GetMustInputValidations(dic);
var validateContext = CreateValidateContext(ctx, bizInfo, "Save", true);
validateContext.Option = option;
var validationService = CreateValidationService(ctx);
validationService.Validators = lstValidation;
//执行校验服务
List<ValidationErrorInfo> errorInfo;
validationService.TryValidate(dataEntities, validateContext, out errorInfo);
var billNoField=bizInfo.GetBillNoField();
if (!errorInfo.IsEmpty() && billNoField != null && dataEntities[0].DynamicObjectType.Properties.ContainsKey(billNoField.PropertyName))
{
List<ValidationErrorInfo> errorInfoNo = new List<ValidationErrorInfo>();
for (int i = 0, j = 0; i < dataEntities.Length; i++)
{
var dyn = dataEntities[i];
string id = ObjectUtils.Object2String(dyn["Id"]);
var lstTmp = errorInfo.Where(m => m.BillPKID == id).ToList();
if (lstTmp.IsEmpty()) continue;
string title = Kingdee.BOS.Resource.ResManager.LoadKDString("单据编号", "0025669000008480", Kingdee.BOS.Resource.SubSystemType.BOS) + dyn[billNoField.PropertyName];
foreach (var itemError in lstTmp)
{
errorInfoNo.Add(new ValidationErrorInfo(itemError.DisplayToFieldKey, itemError.BillPKID, i, j++, itemError.Id, itemError.Message, title));
}
}
return errorInfoNo;
}
return errorInfo二开插件 - 动态调用必录校验器的方法
客户需求: 目前操作可以配置校验器,如果校验失败可以终止操作。但是操作的校验器需要在元数据中配置后才会执行,能不能根据需要动态调用...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



