公司今年計划大批擴建門店,需要自動化維護相關主數據,其中就有一步通過調用 WB01的BDC錄屏來自動創建地點,前台跑沒有問題,但后台JOB死活不行,屏幕是以前同事錄好的,只能硬着頭皮修改。
后台任務日志:

拋RAISE_EXCEPTION異常。
用ST22進去跟蹤出錯的代碼:


出錯的地方:

結合前台調式,發現了出錯屏幕:

即SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕出問題,經查證原因是屏幕上的ALV是OO方式寫的
解決辦法:后台時跳過該屏幕,但處理邏輯不能省。由於屏幕只是個交互過程,可以在后台代碼直接將有用戶輸入的值給賦值上,屏幕自然就可以不要了,具體實現就是將原屏幕PAI與PBO相關的代碼摳出來直接調用,而不再Call 屏幕
查找該屏幕被調用的地方:

發現兩處調用:

將這兩處都打上斷點:


然后斷點調試看是哪個地方,SM37進去:

勾上出錯的JOB,輸入JDBG事務碼,回車:

看調用棧,這樣就知道是哪個調用了吧,就是DISPLAY_PLANT_COPY_CUSTOMIZING函數,然后進該函數,找到調用
SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕的位置進行代碼修改。(
注:在按F8調試完JOB后,發現報
OBJECTS_OBJREF_NOT_ASSIGNED異常

但先不要去解決這個問題,本人就因為去解決這個問題耗費了大量時間,這個問題的本質還是因為OO方式的ALV在后台無法構建出的問題,與前面的問題其實是同一問題,只是運行方式不一樣:前面的
RAISE_EXCEPTION異常是直接通過任務跑出來的,這個
OBJECTS_OBJREF_NOT_ASSIGNED異常是通過再一次調試該任務出來的。
可以ST22查看出錯點:

)
下面就繼續修改代碼,但代碼是標准的程序,一般是不讓改的,但我司是老的SAP系統,都不會再升級或打補丁了,再說SAP出來了新的S/4產品,都明確說過,以后不再對老的SAP產品進行維護,就像Windows XP一樣,所以想維護想修改BUG的話,就自己來吧
在修改標准程序前,還需要破解程序,不然是修改不了的,我想搞過的人都知道吧,這里就不說破解的事了
但要注意的是,修改標准程序不要影響其他的程序,所以最好在主調程序調用WB01錄屏之前,設置一些標記,將這些標記傳到標准程序中,然后在修改標准程序的地方,讀取這些標記,能讀到,則修改,否則還是走原來的邏輯。
下面是自己的程序,就是該程序調用WB01錄屏的:

下面是已修改的標准程序:

(注:ok_code = 'BSTV'.,因為從后面可以看出該Code還要繼續傳到外面去,調用它的程序應該需要用到)
上面紅框中的代碼就是
SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕 的處理邏輯,我們可以打開1000屏幕,將它的PBO,以前PAI摳出來,再這里進行直接進行調用,這樣雖然去掉了1000屏幕的交互過程,但后台邏輯我們並沒有省略,這樣數據就不會出問題。
其實到這里還沒有完,當再次定義JOB跑時,上面的1000屏幕已成功去掉,但相應的數據沒問題,但是,出現了新的問題:

那我們再進SAPLSTRD標准程序的0300屏幕,找出錯原因。
先入到
進SAPLSTRD的0300屏幕,在PBO與PAI都打上斷點:


為什么要選擇這兩個Module進行斷點呢?原因就是因為該屏幕出問題,但不知道是PBO里,還是PAI里出問題,所以兩個都斷點一下,再調試看看屏幕的走向。
斷點打好后,
同樣再調試該JOB:

F8到下面斷點暫定,然后F6看屏幕一步步走的軌跡:

繼續F6,發現所有屏幕都退出,PAI模塊根本沒調用,直接退到我們自己的主調程序里:


此時sy-subrc為1001狀態,查看返回消息內表PT_MESSTAB[],找到出錯Message ID以及錯誤號:

SE91查看詳細錯誤消息:


沒有屏幕 & & 的批輸入數據
對應的英文:

No batch input data for screen & &
選中,看長文本:

還是看不懂,雲里霧里,只能暫停............
從上面調式300屏幕仔細來看,只走了PBO模塊,PAI沒有走,沒觸發PAI,錄屏中已傳OKCODE,即使這里手動設置還是不行.............
很久后,硬是沒找到問題...................
沒觸發PAI,這問題真是難找,原來的別人的錄屏又那么復雜,沒有適當數據,重錄出來的屏幕流程與原來又不一樣,產品還沒找出原因,干脆一不做二不休,將出問題的這個300屏幕也從屏幕流中干掉,屏我也懶得重錄了
通過上面可以看出,問題出在SAPLSTRD的300屏幕:

從前台調試,可以得知是300屏幕是如下傳輸請求屏幕:

現在要跳過300屏幕,與前面跳過1000屏幕一樣,先要找到調用這300屏幕的地方,其實從上面圖就可以看出,是在 TRINT_ORDER
_CHOICE調用的,所以打開這個函數,再次進行代碼修訂:

與略掉1000屏幕一樣,將300里PAI與PBO相應影響數據的Module調用Form扣出來,在這里直接調用,不走屏幕的PAI與PBO。
修改后,繼續跑后台測試,很不幸,還是出問題:

初看起來與前面
SAPLSTRD的300屏幕問題一樣,也是沒有什么批輸入數據什么的,但經過下面調試,發現還真不一樣,前面是沒有觸發PAI,這里又是什么情況呢,繼續調試上面出錯的JOB,調試前,與前面一樣,在SAPMWBE3的101屏幕中的PAI與PBO各打上一個斷點,查看屏幕的走向邏輯:

繼續調試上面出錯的JOB,F8直到上面兩處斷點地方,繼續調試JOB:

經過F6一步步調試,Module調用順序 :PBO --> PAI --> PBO,這與前面1000屏幕不一樣,PAI觸發過(1000屏幕只執行過PBO),問題有所變化:雖然都是 沒有屏幕 && 的批輸入數據 的問題,但可能引發的原因不一樣,以經過一段時間的思考,這里應該是屏幕沒有退出,因為PBO執行了第二次,問題的原因應該是在修改標准函數
TRINT_ORDER
_CHOICE引起的。下面那就在TRINT_ORDER_CHOICE函數里修改的地方打上斷點:

然后繼續調試上面JOB,F8直到上面的斷點地方:

F6一步步執行,發現當執行完 PERFORM append_to_order. 后,直接退到了上面第二行,即調用0101屏幕的地方:

現在可以看出,函數 TRINT_ORDER_CHOICE 就直接退到0101屏幕了,說明該函數中有 LEAVE SCREEN 語句,退出了401屏幕:

按理來說,TRINT_ORDER_CHOICE 函數的調用不應該退出401屏幕,因這個函數是在 PERFORM append_to_order. form中調用的,該函數是我們修改標准程序調用的,而修改的目的是不走屏幕流程,即屏幕以及流程跳轉語句應該也要屏蔽掉,所以繼續看append_to_order Form,發現最后面有 LEAVE SCREEN 語句:

也將其
屏蔽掉

再次以JOB跑,結果成功:

總結:出現
No batch input data for screen & &問題
1、BDC輸入沒有轉到錄屏,比如下面紅框注掉,但流程中有這個屏(注:如果有相關的BDC錄屏,但沒有對應的屏幕,不會出這種問題):

(現在上面圖中1000與300 BDC錄屏的代碼,對於后台可以留着,也可以去掉,但前面需要,所以還是留着吧)
2、屏幕沒有結束,就像上面0101屏幕那樣,
PBO --> PAI --> PBO,屏幕未退出,會導致屏幕流不能正常結束
最后,解決此問題花費了大量時間,硬是將一個只能前台跑的Tcode,改成了后台,反反復復調試了N遍,也可能是剛開始思路的問題,很長一段時間未能解決,但后來堅信一個總體思路:解決有問題的屏幕,不能解決的直接跳過它,直接將其PBO和PAI的代碼摳出來直接調用,略過屏幕。可能解決這個屏幕,又會出新的問題,那再按這個思路解決新的屏幕問題.........
唉,ABAP真是各種苦,在我快要放棄的時候,又出現了轉機。如是Java我想問題早已得以解決..........
所以,ABAP注定是孤獨的...............