1. 程式人生 > 其它 >多次呼叫 BAPI 之後,最後一次性 COMMIT WORK,會有什麼問題嗎?

多次呼叫 BAPI 之後,最後一次性 COMMIT WORK,會有什麼問題嗎?

有朋友問我這個問題:

呼叫 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 被重複呼叫,還是開發者有意為之呢?