ABAP WB01 BDC 」No batch input data for screen & &「 」沒有屏幕 & & 的批輸入數據「


公司今年計劃大批擴建門店,須要自動化維護相關主數據,其中就有一步經過調用 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屏幕,找出錯緣由。
先入到 SAPLSTRD0300屏幕,在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 & &問題
一、BDC輸入沒有轉到錄屏,好比下面紅框注掉,但流程中有這個屏(注:若是有相關的BDC錄屏,但沒有對應的屏幕,不會出這種問題):
 (如今上面圖中1000與300 BDC錄屏的代碼,對於後臺能夠留着,也能夠去掉,但前面須要,因此仍是留着吧)

二、屏幕沒有結束,就像上面0101屏幕那樣, PBO --> PAI --> PBO,屏幕未退出,會致使屏幕流不能正常結束

最後,解決此問題花費了大量時間,硬是將一個只能前臺跑的Tcode,改爲了後臺,反反覆覆調試了N遍,也多是剛開始思路的問題,很長一段時間未能解決,但後來堅信一個整體思路:解決有問題的屏幕,不能解決的直接跳過它,直接將其PBO和PAI的代碼摳出來直接調用,略過屏幕。可能解決這個屏幕,又會出新的問題,那再按這個思路解決新的屏幕問題.........
唉,ABAP真是各類苦,在我快要放棄的時候,又出現了起色。如是Java我想問題早已得以解決..........
因此,ABAP註定是孤獨的...............
相關文章
相關標籤/搜索