多次呼叫 BAPI 之後,最後一次性 COMMIT WORK,會有什麼問題嗎?
阿新 • • 發佈:2022-03-18
有朋友問我這個問題:
呼叫 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 被重複呼叫,還是開發者有意為之呢?