SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论
Created by Jerry Wang, last modified on Jul 17, 2014
點擊New Entries后,
[外鏈圖片轉存失敗(img-0Co1I8jG-1562209890702)(https://user-images.githubusercontent.com/5669954/27263153-2feebfbc-5464-11e7-9fde-fddcec97a122.png)]
輸入會觸發validation 邏輯的entry:
Maintenance view生成的function module 會被call到,
[外鏈圖片轉存失敗(img-oChB4GCP-1562209890703)(https://user-images.githubusercontent.com/5669954/27263156-2fffdfb8-5464-11e7-9fe1-9c6ca54576c0.png)]
在里面會call 到screen 0001的PAI Module:
?
<status>-upd_flag會決定是否真正實行database update。如果其值為false,end user點擊Save button后,將不會觸發真正的database 更新,在UI上會得到Data already saved的信息。?
?
F8之后,會發現<STATUS>-UPD_FLAG已經在某處被clear了,在CHECK_UPD重新判斷是否該填充: 判斷的邏輯是TOTAL internal table里是否有action不為space的entry。 如下圖,row 3即為在UI上通過點擊New Entries后輸入的entry,action為N ( New ) 因此此種情況下update flag置為X: 然后進入SAVE相應的邏輯:[外鏈圖片轉存失敗(img-4ag8eF0p-1562209890705)(https://user-images.githubusercontent.com/5669954/27263161-300ae3ea-5464-11e7-9ad1-286bab9eaeb6.png)]
這里能發現如果status update flag為false,則直接在UI上顯示Data already saved的提示信息:[外鏈圖片轉存失敗(img-v16b1coT-1562209890705)(https://user-images.githubusercontent.com/5669954/27263162-30166440-5464-11e7-8c0c-c7fb5aba688b.png)]
這里能call 到developer在before save event上實現的callback:
[外鏈圖片轉存失敗(img-1aNJBvzR-1562209890705)(https://user-images.githubusercontent.com/5669954/27263163-301a0186-5464-11e7-9bce-781cec75c7d7.png)]
Table參數EXTRACT包含了New Entries screen上Table control里的值( 包含end user輸入的entry和其他空行)
空行一共20條,是在下面這個代碼里生成的:
通過實驗,只要將新建entry的action由N改為L,即能實現即使UI報錯之后,該entry仍然處于可編輯狀態的效果:
[外鏈圖片轉存失敗(img-gAWZBjkj-1562209890706)(https://user-images.githubusercontent.com/5669954/27263135-2fa82124-5464-11e7-99df-47771a231a31.png)]
效果如下:
此時將Product type改為03,期望的效果是 03 - CRMM_PR_TAX能夠成功保存:
此時第二次進入<status>-update的判斷邏輯:
total internal table里的entry,藍色的是直接invalid的輸入,紅色是糾正后的輸入, 因此我們發現我們在UI上將product type由02改為03之后,之前02 對應的entry仍然存儲在total里沒有被框架刪除,因此需要我們手動在BEFORE SAVE的module里完成這個刪除動作。
因此在before save的處理邏輯里將invalid entry手動刪除:
?
之所以用flag si_pend_delete控制,是為了避免在第一次新建entry時,錯誤地那些action = N的entry也刪掉。?
?
然后,有時候會發現view framework并不能將用戶修改了invalid entry之后第二次重新輸入的值寫入到total table里,例如user 將product type修正為05之后,點save button: 從callstack能清楚發現開始執行save 操作:[外鏈圖片轉存失敗(img-EgKcbAPQ-1562209890710)(https://user-images.githubusercontent.com/5669954/27263140-2fbf9ebc-5464-11e7-80b9-9b03e72a6204.png)]
然而,在before save的callback里,并不包含最新輸入的05 entry:
相反,這個05 entry包含在extract internal table里,因此需要developer在before save subroutine里手動做一個merge:
merge代碼如下:
如果直接在第一次before save callback執行體內刪除invalid entry( line 50), 會導致即使第二次糾正了invalid entry(例如product type從02改正為03)后點擊save button,由于<status>-update判斷為space,此時將不會有database update,而是直接報"Data already saved"的信息。
?
在同時輸入多行且部分行valid,部分行不valid時,上述solution將很難正確處理所有可能的情況。?
?
例如:此時row 3應該刪除,因為其不valid,但是 row 5和 row 7應該保留,因為是新輸入的entry:
目前的實現這種粗暴的刪除所有action為N的做法不能區分出invalid record和新輸入的record
前兩行檢查通過,此時我將第三行entry改成 04-401-CRMM_PR_TAX:
然后選中第二行,點delete button:
然后再點save:
然而最后存儲到數據庫的結果如下:
總結
以上是生活随笔為你收集整理的SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP ABAP实用技巧介绍系列之锁住某
- 下一篇: macbook如何安装双系统_双系统安装