點選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:
-upd_flag會決定是否真正實行database update。如果其值為false,end user點選Save button後,将不會觸發真正的database 更新,在UI上會得到Data already saved的資訊。
F8之後,會發現-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能夠成功儲存:
此時第二次進入-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,由于-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:
然而最後存儲到資料庫的結果如下: