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 & &問題
1、BDC輸入沒有轉到錄屏,比如下面紅框注掉,但流程中有這個屏(注:如果有相關的BDC錄屏,但沒有對應的屏幕,不會出這種問題):
 (現在上面圖中1000與300 BDC錄屏的代碼,對於后台可以留着,也可以去掉,但前面需要,所以還是留着吧)

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

最后,解決此問題花費了大量時間,硬是將一個只能前台跑的Tcode,改成了后台,反反復復調試了N遍,也可能是剛開始思路的問題,很長一段時間未能解決,但后來堅信一個總體思路:解決有問題的屏幕,不能解決的直接跳過它,直接將其PBO和PAI的代碼摳出來直接調用,略過屏幕。可能解決這個屏幕,又會出新的問題,那再按這個思路解決新的屏幕問題.........
唉,ABAP真是各種苦,在我快要放棄的時候,又出現了轉機。如是Java我想問題早已得以解決..........
所以,ABAP注定是孤獨的...............



 




 

 

 

 

 


 





 

 

 

 

 

 




 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM