关于sap:多次调用-BAPI-之后最后一次性-COMMIT-WORK会有什么问题吗

67次阅读

共计 1011 个字符,预计需要花费 3 分钟才能阅读完成。

有敌人问我这个问题:

调用 MIRO 的 BAPI, 调用屡次,最初一次性 COMMIT WORK,能够执行胜利,然而调用一百次以上,最初再 COMMIT WORK,会有什么问题吗?

我倡议先浏览这两篇文章理解一些准备常识:

  • 什么是 SAP BAPI
  • SAP ABAP 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 被反复调用,还是开发者无意为之呢?

正文完
 0