如何用插件实现操作校验
来源:互联网 发布:聚富传媒软件 编辑:程序博客网 时间:2024/06/01 16:45
用代码实现操作校验,需要派生操作插件基类,以及实现一个校验器。
代码段1:实现操作插件基类,该插件编译通过后,需要到BOS IDE中,打开单据,注册到单据的操作上。
/// <summary> /// 操作服务端插件示例 /// </summary> /// <remarks> /// 1. 示例如何强制要求加载某字段 /// 2. 示例如何注入校验器,校验器可以通用,为避免在各操作中重复编码,剥离出来,然后各操作注入剥离出的校验器 /// 3. 说明一些关键事件的用途 /// </remarks> [System.ComponentModel.Description("操作服务端插件示例")] public class OperationPlugSample : Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn { /// <summary> /// 数据加载前,确保需要的属性被加载 /// </summary> /// <param name="e"></param> /// <remarks> /// 在列表上执行操作时,单据的字段并没有被完全加载。 /// 如果操作插件用到了未被加载的字段,一定会中断; /// 本事件允许插件,强制要求加载某些字段,避免中断 /// </remarks> public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e) { // 如下代码行,指定字段xxxxx的Key,强制要求加载字段 e.FieldKeys.Add("xxxxx"); } /// <summary> /// 操作执行前,加载操作校验器 /// </summary> /// <param name="e"></param> /// <remarks> /// 在系统开始执行校验前,插件可以追加自己的校验器进入操作校验器集合 /// </remarks> public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e) { // 如下代码行,示例加入自定义的校验器 // 自定义的校验器,必须从基类 Kingdee.BOS.Core.Validation.AbstractValidator 派生 e.Validators.Add(new OperationSampleValidator()); } #region 接下来按照事件的执行事件顺序,由前向后逐一介绍各事件 /// <summary> /// 操作执行前,事务开始前事件 /// </summary> /// <param name="e"></param> /// <remarks> /// 1. 此事件在操作校验之后、操作实现代码之前执行 /// 2. 此事件在操作事务之前,即此事件中的数据库处理,不受操作的事务保护 /// 3. 通常此事件,也可以用来进行数据校验 /// </remarks> public override void BeforeExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeforeExecuteOperationTransaction e) { // TODO: .... // 如下代码,示意校验不通过时,终止操作的执行 e.CancelMessage = "测试终止操作执行"; e.Cancel = true; } /// <summary> /// 操作执行前,事务开始后事件 /// </summary> /// <param name="e"></param> /// <remarks> /// 1. 此事件在操作校验之后 /// 2. 此事件在操作事务开始之后 /// 3. 此事件在操作执行代码之前 /// 4. 此事件中的数据库处理,受操作的事务保护 /// 5. 通常此事件,可以用来做数据准备,在操作之前,提前写数据到库 /// </remarks> public override void BeginOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeginOperationTransactionArgs e) { // TODO: 进行数据准备,甚至写预处理数据到数据库 } /// <summary> /// 操作执行后,事务结束前 /// </summary> /// <param name="e"></param> /// <remarks> /// 1. 此事件在操作执行代码之后,操作的内部逻辑已经执行完毕 /// 2. 此事件在操作事务提交之前 /// 3. 此事件中的数据库处理,受操作的事务保护 /// 4. 通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护 /// </remarks> public override void EndOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e) { // TODO:进行同步数据处理 } /// <summary> /// 操作执行后,事务结束后 /// </summary> /// <param name="e"></param> /// <remarks> /// 1. 此事件在操作执行后,操作的内部逻辑已经执行完毕; /// 2. 此事件在操作事务提交之后; /// 3. 此事件中的数据库处理,不受操作的事务保护 /// 4. 通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需影响操作 /// </remarks> public override void AfterExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AfterExecuteOperationTransaction e) { // TODO:进行同步数据处理,如果同步失败,不影响操作的结果 } #endregion }
/// <summary> /// 操作校验器(示例) /// </summary> [System.ComponentModel.Description("操作校验器(示例)")] class OperationSampleValidator : Kingdee.BOS.Core.Validation.AbstractValidator { #region 重载函数 /// <summary> /// 校验主实体,以此实体数据包进行循环,逐行校验 /// </summary> public override string EntityKey { get { // 根据实际校验要求,返回单据头或者单据体Key return "FBillHead"; } } /// <summary> /// 执行校验,把校验结果注入到validateContext中 /// </summary> /// <param name="dataEntities"></param> /// <param name="validateContext"></param> /// <param name="ctx"></param> public override void Validate( Kingdee.BOS.Core.ExtendedDataEntity[] dataEntities, Kingdee.BOS.Core.Validation.ValidateContext validateContext, Kingdee.BOS.Context ctx) { foreach (var dataEntity in dataEntities) { // TODO: 逐个数据包执行校验代码 // 如下代码,示意如何注入校验提示,后续操作,会自动避开校验没通过的数据包 validateContext.AddError(dataEntity.DataEntity, new Kingdee.BOS.Core.Validation.ValidationErrorInfo( "出错字段.Key", // 出错的字段Key,可以空 Convert.ToString(dataEntity.DataEntity[0]), // 数据包内码,必填,后续操作会据此内码避开此数据包 dataEntity.DataEntityIndex, // 出错的数据包在全部数据包中的顺序 dataEntity.RowIndex, // 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0 "E1", // 错误编码,可以任意设定一个字符,主要用于追查错误来源 "错误的详细提示信息", // 错误的详细提示信息 "错误摘要", // 错误的简明提示信息 Kingdee.BOS.Core.Validation.ErrorLevel.Error)); // 错误级别:警告、错误... } } #endregion 重载函数 }
0 0
- 如何用插件实现操作校验
- 如何用实现.NET的插件机制
- 如何用jquery插件实现生日日期选择
- 如何用JAVA及AJAX技术实现交互操作
- C# 如何用按钮实现鼠标滚轮操作
- 如何用C#操作注册表
- 如何用YC++操作数据库
- 如何用YC++操作数据库
- 如何用YC++操作数据库
- 如何用YC++操作数据库
- 如何用YC++操作数据库
- 如何用Java操作注册表
- 如何用Java操作MongoDB?
- 如何用Java操作MongoDB?
- 如何用DataGrid实现分页?
- 如何用peercast实现转播
- 如何用iptables实现NAT
- 如何用iptables实现NAT
- 在列表插件中,如何读取字段值
- Android中文乱码的分析与解决
- GradleUserGuide中文版 12)图形界面 13)构建脚本 14)Tasks
- Linux下获取当前进程ID、进程名、进程路径
- 24岁生日礼物,感谢所有人
- 如何用插件实现操作校验
- Python yield 使用
- Java身份证验证方法
- 基于Sphinx的实例解析:DISCUZ全文检索
- 【翻译】Xibo官方文档4-Ubuntu Client Installation
- 【学习C++】C++ Primer Plus (第六版)第九章编程练习1-4
- 如何在服务端插件中实现交互式的提示
- HTML5标签一
- 使用网络源码框架-图片查看器-smart-image-view