Implicit enhancement的簡單小應用,供MB51直接顯示ALV格式的需求使用。應該寫得還算詳細了,大家輕拍~~
一,前因
標準報表MB51只是增加了ALV function供user選擇是否需要顯示更明細,如果在background job的情況,spool只能顯示standard list。
有User提出需求,希望在后臺執行時,能夠直接跑出ALV格式的明細記錄。
Standard format
![]()
ALV format
![]()
二,需求
后臺執行時能夠直接跑出如同點擊
后,同樣格式的ALV format report。
三,方案
通過追查MB51的source program RM07DOCS,可以發現MB51在點擊
會觸發user-command‘DETAIL’,同時調用subroutine‘detail_list’。(line 2600)
該subroutine沒有任何參數,也就是說,所有的變量都是global或者local的,report display的資料來源也全部存在全局變量list[]里。
這樣就給了我們機會能夠在user跑完MB51進行list output時做modification。
在enhancement framework出來之前,針對這種狀況,我們只能期待SAP有提供享用的user-exit,或者將list[] export到parameter ID中
再終結的方法就是參考MB51全部重新寫一個ZBM51的程式出來,幸好這支report不是很復雜,不然~
然而,有了enhancement framework之后,提供可以在任何CLASS/FUNCTION/INCLUDE的begin line & end line加上自己需要的處理代碼的機會。
所以,針對此次修改的目的,找到MB51程式中默認輸出的subroutine,在end-of-selection event之后的subroutineoutput_list(line 1200)中進行修改。
修改步驟如下:
1,進入enhancement修改狀態
2,顯示implicit enhancement
![]()
點擊之后程式中會多一些這樣的橫線,這就是我們可以增加enhancement spot的地方啦~~~~
3,創建enhancement spot
Step 1.
方法1,直接右擊上圖中“引號行”,按下圖方式選擇menu
![]()
方法2,置鼠標焦點于“引號行”,從menu進行創建
![]()
Step 2.選擇enhancement mode(差別在于一個只定義,一個需要)
![]()
Step 3.創建新的enhancement implementation
![]()
Step 4. 創建composite enhancement implementation,
新建一個composite enhancement implementation,他可以用來收集一般的enhancement implementation,后續檢查除錯會比較方便。
(如無特殊需求,請不要在創建時勾選上個畫面的復選框,use this enhancement implementation without query in future,不然建好了想重來,就看不到了)
![]()
Step 5.創建enhancement implementation
4,對implementation進行coding
Step 1.
![]()
Step 2.已經可以在如下欄位寫入自己想要的代碼
![]()
代碼如下,我們只需要在background時,才會直接調用detail list,這樣spool中就會同時存在ALV/STANDARD的兩種format,看user需要啦~~
![]()
Step 3.保存&激活
![]()
5,大功告成,測試看看。
四,結果
前臺跑:
![]()
后臺跑:會比正常的多一個All spool lists
![]()
點擊all spool lists會出現兩個spool no,因為此處我既保留了原有的format,又有新的ALV format,號碼大一點的就是ALV格式的啦。
![]()