多次调用|多次调用 BAPI 之后,最后一次性 COMMIT WORK,会有什么问题吗()
有朋友问我这个问题:
调用 MIRO 的 BAPI, 调用多次,最后一次性 COMMIT WORK,可以执行成功,但是调用一百次以上,最后再 COMMIT WORK,会有什么问题吗?我建议先阅读这两篇文章了解一些预备知识:
- 什么是 SAP BAPI
- SAP ABAP COMMIT WORK 关键字的一些使用要点
* 进行一些计算,搜集出要插入数据库的记录,存在内表 lt_insert 中
* 进行一些计算,搜集出要更新数据库的记录,存在内表 lt_update 中
* 进行一些计算,搜集出要删除数据库的记录,存在内表 lt_delete 中* BAPI 内部调用 XXX update function module,进行数据库更新操作
* 下面这个函数 XXX 仅当 COMMIT WORK 执行时,才会在另一个所谓的 update function module 里被触发调用CALL FUNCTION 'XXX' IN UPDATE TASK
EXPORTING
it_insert = lt_insert
it_update = lt_update
it_delete = lt_delete
调用 BAPI 的代码:
CALL FUNCTION 'A'.COMMIT WORK.
文章图片
文章图片
所以当我们的报表里的源代码书写如下:
在 19 行调用 BAPI A,然后接着在 21 行 调用
COMMIT WORK
之后,上述 A,B,C,D 运行时执行的代码块的先后顺序是:C -> A -> D -> B
没错,虽然从静态源代码看,代码块 B 紧接在代码块 A 之后,但运行时 B 却在 D 即 COMMIT WORK 之后执行。
所以多次调用 BAPI,最后一次性 COMMIT WORK, 会有问题吗?这个问题不能一概而论。
假设多次调用 BAPI,每次传递的输入参数都相同,那么:
- 最安全的情况,如果这个 BAPI 每次执行的只是数据库更新操作,且 BAPI 每次执行时,代码块 A 计算出的 lt_update 都完全一致,那么多次调用 BAPI,然后再一次执行 COMMIT WORK,不会出现 side effect
- 如果重复调用的 BAPI,每次输入都相同,但是每次代码块 A 计算出的 lt_insert 或者 lt_delete 都会产生新的记录,那么这就意味着一次 COMMIT 之后, 会产生多次
不同
的数据库的插入或者删除操作。此时一定要确认,这种多次不同
的数据库插入或者删除操作,真的是期望的行为吗?
推荐阅读
- 什么是|什么是 SAP BAPI
- 隐私合规(检测第三方SDK调用的隐私权限)
- Angular如何在跨字段验证器中直接调用其它独立的验证器
- 万能PHP Curl封装类,适合多个场景,调用方便!
- SpringCloud中的Feign远程调用接口传参失败问题
- 还在写SQL做SAP二开(通过RFC调用NetWeaver,让HANA数据库操作更可靠)
- delphi|Delphi7程序调用C#写的DLL解决办法
- 一道题解(前端链式调用和事件循环)
- JavaScript函数调用经典实例代码
- 利用feign调用返回object类型转换成实体