而後斷點調試看是哪一個地方,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裏出問題,因此兩個都斷點一下,再調試看看屏幕的走向。
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 語句:
總結:出現
No batch input data for screen & &問題
一、BDC輸入沒有轉到錄屏,好比下面紅框注掉,但流程中有這個屏(注:若是有相關的BDC錄屏,但沒有對應的屏幕,不會出這種問題):
(如今上面圖中1000與300 BDC錄屏的代碼,對於後臺能夠留着,也能夠去掉,但前面須要,因此仍是留着吧)
二、屏幕沒有結束,就像上面0101屏幕那樣,
PBO --> PAI --> PBO,屏幕未退出,會致使屏幕流不能正常結束
最後,解決此問題花費了大量時間,硬是將一個只能前臺跑的Tcode,改爲了後臺,反反覆覆調試了N遍,也多是剛開始思路的問題,很長一段時間未能解決,但後來堅信一個整體思路:解決有問題的屏幕,不能解決的直接跳過它,直接將其PBO和PAI的代碼摳出來直接調用,略過屏幕。可能解決這個屏幕,又會出新的問題,那再按這個思路解決新的屏幕問題.........
唉,ABAP真是各類苦,在我快要放棄的時候,又出現了起色。如是Java我想問題早已得以解決..........
因此,ABAP註定是孤獨的...............