天天看點

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

場景:

abap開發中,資料庫更新一般在最後儲存的時候更新所有資料并及時進行資料庫的送出回退來避免資料更新不一緻。但是增強中由于要保持資料一緻性,一般禁止進行資料庫送出復原操作,此時需要考慮到資料更新一緻性的情況,如何保證增強中寫的更新語句不被隐式的送出而是和最終資料的更新保持一緻,或者增強中會觸發隐式送出的代碼的處理。

SAP LUW 中有兩種文法

PERFORM subr ON { {COMMIT [LEVEL idx]} | ROLLBACK }

CALL FUNCTION update_function IN UPDATE TASK

                              [EXPORTING p1 = a1 p2 = a2 ...]

                              [TABLES t1 = itab1 t2 = itab2 ...].
           

可以比較好的應對上述場景

這兩種文法簡單來說就是在執行commit/rollback的時候再去執行form 或者更新子產品内的更新語句。

測試如下:

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

此時測試表1中資料為空,由于perform中的語句未執行,是以即使有隐式送出的代碼也不會影響到測試表1的資料的送出

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

當有I類型消息時,系統會觸發隐式送出(僅僅做DB commit,不進行SAP LUW的送出),此時測試表1的資料送出資料庫,無法保證測試表123資料的更新一緻性,而測試表2暫未更新。

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

此時測試表1資料已有,測試表2資料仍為為空

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)
SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

繼續執行COMMIT時,會執行之前的on commit的perform,此時測試表3的資料未送出

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

在COMMIT 執行結束後,測試表2和測試表3的資料均會存入,資料一緻性得到保證。

SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)
SAP LUW 應用場景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

可以考慮的使用情況:

1.在四代增強使用時,增強代碼中含隐式送出,比如調用rfc進行某種操作且要保證在最終其它業務資料送出資料庫時同時同步執行,可以使用該文法。使用perform...on要慎重,form中有問題(如dump)時會影響最終其它資料的最終送出。

2.增強中需要儲存資料時,且要和其它資料在最後一起儲存,使用該文法避免中間的标準代碼中觸發隐式送出的操作,導緻資料不一緻。

3.進行複雜的功能開發的時候也可以使用該文法控制邏輯流程。

注意:

1. form或者function中執行代碼注意異常處理,避免影響整體資料最終的送出。

2. form無法進行參數傳值,隻能使用全局變量或者記憶體(抛入抛出的記憶體或者共享記憶體都可以)使用全局變量時,使用的是最終執行commit時的變量資料,而不是perform執行時的變量資料。

3. function可以使用import參數和表參數進行傳值,必須勾選值傳遞,傳出參數無效。

4. 如果同一個form 在commit 之前多次使用perform ... on commit ,則隻會執行執行一次。

PS:隐式送出:

(1) When the system displays an SAP Screen

(2) When the system sends a dialog message(Okay: E,W, I;)

(3) Whenever there are synchronous and asynchronous RFC calls

(4) With call transaction <tcode> or SUBMIT <program> statement

最主要的是第一種,第三種,如果submit 程式時沒有螢幕切換操作,也不會導緻隐式送出,比如submit 一個隻有選擇螢幕的程式(或者在選擇螢幕處有校驗(非E))時并不會觸發隐式送出。另外調用windows打開檔案浏覽器也會觸發隐式送出。