多次调用 BAPI 之后,最后一次性 COMMIT WORK,会有什么问题吗?

举报
汪子熙 发表于 2022/11/06 21:32:20 2022/11/06
【摘要】 有朋友问我这个问题:调用 MIRO 的 BAPI, 调用多次,最后一次性 COMMIT WORK,可以执行成功,但是调用一百次以上,最后再 COMMIT WORK,会有什么问题吗?我建议先阅读这两篇文章了解一些预备知识:什么是 SAP BAPISAP ABAP COMMIT WORK 关键字的一些使用要点假设一个 BAPI A 的伪代码实现如下:* 进行一些计算,搜集出要插入数据库的记录,存...

有朋友问我这个问题:

调用 MIRO 的 BAPI, 调用多次,最后一次性 COMMIT WORK,可以执行成功,但是调用一百次以上,最后再 COMMIT WORK,会有什么问题吗?

我建议先阅读这两篇文章了解一些预备知识:

假设一个 BAPI A 的伪代码实现如下:


* 进行一些计算,搜集出要插入数据库的记录,存在内表 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 之后, 会产生多次不同的数据库的插入或者删除操作。此时一定要确认,这种多次不同的数据库插入或者删除操作,真的是期望的行为吗?

总之,多次调用相同的 BAPI,最好先搞清楚,是代码编写中出现了 bug,造成一个 BAPI 被重复调用,还是开发者有意为之呢?

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。