常见问题 - 调用了错误的保存、删除重载方法
金蝶云社区-JohnnyDing
JohnnyDing
1人赞赏了该文章 4,161次浏览 未经作者许可,禁止转载编辑于2016年03月26日 09:31:55

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参数的删除方法重载一。