日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论

發(fā)布時間:2023/12/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)]

輸入會觸發(fā)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后,將不會觸發(fā)真正的database 更新,在UI上會得到Data already saved的信息。

?

?

F8之后,會發(fā)現(xiàn)<STATUS>-UPD_FLAG已經(jīng)在某處被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)]

這里能發(fā)現(xiàn)如果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上實現(xiàn)的callback:

[外鏈圖片轉存失敗(img-1aNJBvzR-1562209890705)(https://user-images.githubusercontent.com/5669954/27263163-301a0186-5464-11e7-9bce-781cec75c7d7.png)]

Table參數(shù)EXTRACT包含了New Entries screen上Table control里的值( 包含end user輸入的entry和其他空行)

空行一共20條,是在下面這個代碼里生成的:

通過實驗,只要將新建entry的action由N改為L,即能實現(xiàn)即使UI報錯之后,該entry仍然處于可編輯狀態(tài)的效果:

[外鏈圖片轉存失敗(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的輸入,紅色是糾正后的輸入, 因此我們發(fā)現(xiàn)我們在UI上將product type由02改為03之后,之前02 對應的entry仍然存儲在total里沒有被框架刪除,因此需要我們手動在BEFORE SAVE的module里完成這個刪除動作。

因此在before save的處理邏輯里將invalid entry手動刪除:

?

之所以用flag si_pend_delete控制,是為了避免在第一次新建entry時,錯誤地那些action = N的entry也刪掉。

?

?

然后,有時候會發(fā)現(xiàn)view framework并不能將用戶修改了invalid entry之后第二次重新輸入的值寫入到total table里,例如user 將product type修正為05之后,點save button:

從callstack能清楚發(fā)現(xiàn)開始執(zhí)行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執(zhí)行體內(nèi)刪除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:

目前的實現(xiàn)這種粗暴的刪除所有action為N的做法不能區(qū)分出invalid record和新輸入的record

前兩行檢查通過,此時我將第三行entry改成 04-401-CRMM_PR_TAX:

然后選中第二行,點delete button:

然后再點save:

然而最后存儲到數(shù)據(jù)庫的結果如下:


總結

以上是生活随笔為你收集整理的SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。