1. 背景说明:
K/3 Cloud 为保存、删除处理,各自封装了多个重载方法。
很多人因为对这些重载方法的用途不了解,随意调用了不适合的重载方法保存、删除数据,造成数据不完整等问题,后续修复起来非常困难。
2. 错误案例:
如下帖中反馈的问题:
https://vip.kingdee.com/article/148837
IDeleteService接口删除单据时未清除T_BF_INSTANCEENTRY
此贴反馈,明明已经调用了K/3 Cloud封装的删除服务删除单据,却发现,相关的业务流程数据却没有被删除,导致随后再次下推,控制错误。
这个帖子,反馈的问题原因,就是因为删除服务有3个重载,伙伴使用了错误的删除服务。
此贴调用的删除服务,只传入了单据ORM模型,以及单据内码,系统只会基于ORM模型,删除其物理表格中的数据,不做相关性处理。
简单的说,这个服务,就相当于后台删除单据数据表中的记录,其他相关数据,没有删除,因此造成数据删除不完整。
3. 保存服务(ISaveService.Save)介绍
保存服务接口为Kingdee.BOS.Contracts.ISaveService,Save方法,定义了两个重载。
3.1 重载一:参数中带单据元数据 BusinessInfo
Kingdee.BOS.Core.DynamicForm.IOperationResult Save(
Kingdee.BOS.Context ctx,
Kingdee.BOS.Core.Metadata.BusinessInfo info,
Kingdee.BOS.Orm.DataEntity.DynamicObject[] dataObject,
[Kingdee.BOS.Orm.OperateOption option = null],
[string operationNumber = ""])
参数说明:
ctx: 数据库上下文
info:单据元数据
dataObject : 待保存的单据数据包
option : 操作操作选项,可以通过这个对象,传入一些特殊的控制选项,如是否忽略警告信息等
operationNumber : 保存操作编码(只有在单据上挂了多个保存操作时,才需要传入)
返回值:
返回单据保存操作执行结果,如操作是否成功,失败原因等
用途:
此方法,是基于单据元数据的,执行单据上定义的保存操作;
完成的功能包括:
1. 执行操作校验
2. 执行操作上挂的服务;
3. 触发操作插件;
4. 保存单据本身数据(此为基本功能);
5. 记录单据关联数据,执行对源单的反写;
此方法,适合于保存单据。
3.2 重载二:参数中仅仅包括orm数据包
Kingdee.BOS.Orm.DataEntity.DynamicObject[] Save(
Kingdee.BOS.Context ctx,
Kingdee.BOS.Orm.DataEntity.DynamicObject[] dataObject)
参数说明:
ctx: 数据库上下文
Ids: 待保存的orm数据包
返回值:
保存成功的orm数据包
用途:
此方法,仅仅执行:
1. 自动为orm数据包,产生主键
2. 保存orm数据包中的数据,到orm模型对应的物理表格中
此方法,不能用于保存单据。
K/3 Cloud定义了很多与单据无关的ORM模型,如消息模型、日志模型、网控模型等,可以用此方法保存这些数据。
4. 删除服务(IDeleteService.Delete)介绍
删除服务接口为Kingdee.BOS.Contracts.IDeleteService,Delete方法,定义了三个重载。
4.1 重载一:参数中带单据元数据 BusinessInfo
Kingdee.BOS.Core.DynamicForm.IOperationResult Delete(
Kingdee.BOS.Context ctx,
Kingdee.BOS.Core.Metadata.BusinessInfo info,
object[] Ids,
[Kingdee.BOS.Orm.OperateOption option = null],
[string operationNumber = ""])
参数说明:
ctx: 数据库上下文
info:单据元数据
Ids : 待删除的单据内码
option : 操作操作选项,可以通过这个对象,传入一些特殊的控制选项,如是否忽略警告信息等
operationNumber : 删除操作编码(只有在单据上挂了多个删除操作时,才需要传入)
返回值:
返回单据删除操作执行结果,如操作是否成功,失败原因等
用途:
此方法,是基于单据元数据的,执行单据上定义的删除操作;
完成的功能包括:
1. 执行删除操作校验
2. 执行删除操作上挂的服务;
3. 触发删除操作插件;
4. 删除单据本身数据(此为基本功能);
5. 删除单据关联数据,撤销对源单的反写;
此方法,适合于删除单据。
4.2 重载二:参数中带单据标识FormId
Kingdee.BOS.Core.DynamicForm.IOperationResult Delete(
Kingdee.BOS.Context ctx,
string formid,
object[] Ids,
[Kingdee.BOS.Orm.OperateOption option = null],
[string operationNumber = ""])
参数说明:
formid : 单据标识,系统会根据单据标识,自动加载单据元数据;
其他参数同重载一;
返回值:
返回单据删除操作执行结果,如操作是否成功,失败原因等
用途:
此方法,系统会根据单据标识,加载单据元数据,然后基于单据元数据的,执行单据上定义的删除操作;
完成的功能同重载一完全相同,而且参数准备,比重载一更加简单,不需要自行加载单据元数据。
此方法,也适合删除单据。
4.3 重载三:参数中仅仅包括ORM模型
void Delete(
Kingdee.BOS.Context ctx,
object[] Ids,
Kingdee.BOS.Orm.Metadata.DataEntity.DynamicObjectType dynamicObjectType)
参数说明:
ctx: 数据库上下文
Ids: 待删除数据内码
dynamicObjectType : ORM模型
返回值:
无
用途:
此方法,仅仅执行:
1. 删除orm模型对应物料表格中的数据,其他无关数据,不做任何处理
此方法,不能用于删除单据,适用于删除与单据无关的数据。
K/3 Cloud定义了很多与单据无关的ORM模型,如消息模型、日志模型、网控模型等,可以用此方法删除数据。
5. 小结
综上所述,本帖介绍的错误案例,应该选用带BusinessInfo参数的删除方法重载一。
推荐阅读