IDOC实例, Inbound IDOC
生活随笔
收集整理的這篇文章主要介紹了
IDOC实例, Inbound IDOC
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里將繼續沿用上篇文章的例子,講述I02對接收到的采購訂單信息進行的相關處理。
1,創建IDOC Type和Message Type.
與上篇Outbound Idoc中的前兩個步驟完全一樣。
2,創建一個function:Y_IDOC_PO_PROCESS.
當IDOC設置完畢之后,SAP可以自動調用該Funtion Module處理IDOC。所以這個函數的接口都是規范的。
下面步驟中將介紹的tcode:BD51中可以查詢到很多Inbound Function,比如IDOC_INPUT_BBP_IV,可參照創建我們的接口。
接下來就可以寫入我們的代碼,根據IDOC內容,創建相應的銷售訂單。為了簡化,這里我們僅僅將其存到數據庫表里面,請先創建兩個表Y02_POHEAD和Y02_POITEM,字段參考WE31中的YPOHEAD和YPOITEM。然后寫入下面代碼:
DATA: lv_subrc LIKE sy-subrc,
??????ls_chead TYPE ypohead,
??????ls_citem TYPE ypoitem,
??????ls_pohead TYPE y02_pohead,
??????lt_poitem TYPE TABLE OF y02_poitem WITH HEADER LINE. CLEAR idoc_contrl.
? READ TABLE idoc_contrl INDEX 1.
? IF idoc_contrl-mestyp <> 'YPO'.
??? RAISE wrong_function_called.
? ENDIF. LOOP AT idoc_contrl.
??? CLEAR: ls_pohead, lt_poitem[].
??? LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum.
????? CASE idoc_data-segnam.
??????? WHEN 'YPOHEAD'.
????????? CLEAR: ls_chead, ls_pohead.
????????? ls_chead = idoc_data-sdata.
????????? MOVE-CORRESPONDING ls_chead TO ls_pohead.
??????? WHEN 'YPOITEM'.
????????? CLEAR: ls_citem, lt_poitem.
????????? ls_citem = idoc_data-sdata.
????????? MOVE-CORRESPONDING ls_citem TO lt_poitem.
????????? APPEND lt_poitem.
??????? WHEN OTHERS.
????? ENDCASE.
??? ENDLOOP. lv_subrc = 0.
??? INSERT y02_pohead FROM ls_pohead.
??? IF sy-subrc = 0.
????? INSERT y02_poitem FROM TABLE lt_poitem.
????? lv_subrc = sy-subrc.
??? ELSE. "訂單號已經存在
????? lv_subrc = sy-subrc.
??? ENDIF. IF lv_subrc = 0.
????? COMMIT WORK.
????? CLEAR idoc_status.
????? idoc_status-docnum = idoc_contrl-docnum.
????? idoc_status-status = '53'. "IDOC處理成功
????? APPEND idoc_status.
??? ELSE.
????? ROLLBACK WORK.
????? CLEAR idoc_status.
????? idoc_status-docnum = idoc_contrl-docnum.
????? idoc_status-status = '51'. "IDOC不成功
????? idoc_status-msgty = 'E'. "錯誤信息
????? idoc_status-msgid = 'YMSG'.
????? idoc_status-msgno = '001'.
????? APPEND idoc_status.
??? ENDIF.
? ENDLOOP. 3,在BD51中注冊我們的Function Module. 在編輯狀態下,點擊New Entries,填入函數名Y_IDOC_PO_PROCESS,Input Type=1即可。 4,在WE57中將Function Module與IDOC Type/Message Type關聯 點擊New Entries,Function Module輸入Y_IDOC_PO_PROCESS,其下的Type填寫F;IDOC Type下的Basic?Type填寫YPOIDOC;Message Type填寫YPO;Direction填寫2(Inbound)。 5,WE42,創建Inbound Process Code. 注意該步驟必須在BD51和WE57之后,否則將出現錯誤提示。 創建新條目,Process Code輸入YPC_PO,在Option ALE下選擇Processing with ALE service,在Processing Type下選擇function module。保存后,在隨后的窗口中,輸入Inbound Module為Y_IDOC_PO_PROCESS。 6,WE20,維護Partner Profiles. 首先確保SALE中已經維護好了對應于接收方的Logical System,假設名稱為I04LS。 (WE05查看您的Inbound IDOC, 均可看到其Partner名稱,這就是我們所需要的。) 本步驟與上篇的WE20類似,不同的是,這里是維護從I04LS過來的Inbound Parameters。 Message Type輸入YPO,Process Type輸入YPC_PO,然后選中"Trigger immediately"即可。 7,至此,我們的設置已經完畢。系統接收到從I04傳來的IDOC后即會立刻處理。 同時,各位針對上篇做過練習的朋友,系統中應該會遺留幾個處于出錯狀態的IDOC吧?可以用BD87,在主界面上選中結點YPO后,點擊Process按鈕,一次性處理。處理前,順便在SE37中打開Y_IDOC_PO_PROCESS并設置幾個斷點即可調試。 補充: (1)如果狀態碼為56,則應該是您的WE20沒設置好; (2)由于上面代碼中控制了不能插入同樣的采購單號,所以只有一個Inbound IDOC將處理成功(狀態碼53),其余將失敗(狀態碼51)。只要新發送的IDOC賦于不同的采購單號即可避免。 (3)Outbound的狀態碼是0-50,03代表OK;Inbound的狀態碼則是50-99,53代表OK。
??????ls_chead TYPE ypohead,
??????ls_citem TYPE ypoitem,
??????ls_pohead TYPE y02_pohead,
??????lt_poitem TYPE TABLE OF y02_poitem WITH HEADER LINE. CLEAR idoc_contrl.
? READ TABLE idoc_contrl INDEX 1.
? IF idoc_contrl-mestyp <> 'YPO'.
??? RAISE wrong_function_called.
? ENDIF. LOOP AT idoc_contrl.
??? CLEAR: ls_pohead, lt_poitem[].
??? LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum.
????? CASE idoc_data-segnam.
??????? WHEN 'YPOHEAD'.
????????? CLEAR: ls_chead, ls_pohead.
????????? ls_chead = idoc_data-sdata.
????????? MOVE-CORRESPONDING ls_chead TO ls_pohead.
??????? WHEN 'YPOITEM'.
????????? CLEAR: ls_citem, lt_poitem.
????????? ls_citem = idoc_data-sdata.
????????? MOVE-CORRESPONDING ls_citem TO lt_poitem.
????????? APPEND lt_poitem.
??????? WHEN OTHERS.
????? ENDCASE.
??? ENDLOOP. lv_subrc = 0.
??? INSERT y02_pohead FROM ls_pohead.
??? IF sy-subrc = 0.
????? INSERT y02_poitem FROM TABLE lt_poitem.
????? lv_subrc = sy-subrc.
??? ELSE. "訂單號已經存在
????? lv_subrc = sy-subrc.
??? ENDIF. IF lv_subrc = 0.
????? COMMIT WORK.
????? CLEAR idoc_status.
????? idoc_status-docnum = idoc_contrl-docnum.
????? idoc_status-status = '53'. "IDOC處理成功
????? APPEND idoc_status.
??? ELSE.
????? ROLLBACK WORK.
????? CLEAR idoc_status.
????? idoc_status-docnum = idoc_contrl-docnum.
????? idoc_status-status = '51'. "IDOC不成功
????? idoc_status-msgty = 'E'. "錯誤信息
????? idoc_status-msgid = 'YMSG'.
????? idoc_status-msgno = '001'.
????? APPEND idoc_status.
??? ENDIF.
? ENDLOOP. 3,在BD51中注冊我們的Function Module. 在編輯狀態下,點擊New Entries,填入函數名Y_IDOC_PO_PROCESS,Input Type=1即可。 4,在WE57中將Function Module與IDOC Type/Message Type關聯 點擊New Entries,Function Module輸入Y_IDOC_PO_PROCESS,其下的Type填寫F;IDOC Type下的Basic?Type填寫YPOIDOC;Message Type填寫YPO;Direction填寫2(Inbound)。 5,WE42,創建Inbound Process Code. 注意該步驟必須在BD51和WE57之后,否則將出現錯誤提示。 創建新條目,Process Code輸入YPC_PO,在Option ALE下選擇Processing with ALE service,在Processing Type下選擇function module。保存后,在隨后的窗口中,輸入Inbound Module為Y_IDOC_PO_PROCESS。 6,WE20,維護Partner Profiles. 首先確保SALE中已經維護好了對應于接收方的Logical System,假設名稱為I04LS。 (WE05查看您的Inbound IDOC, 均可看到其Partner名稱,這就是我們所需要的。) 本步驟與上篇的WE20類似,不同的是,這里是維護從I04LS過來的Inbound Parameters。 Message Type輸入YPO,Process Type輸入YPC_PO,然后選中"Trigger immediately"即可。 7,至此,我們的設置已經完畢。系統接收到從I04傳來的IDOC后即會立刻處理。 同時,各位針對上篇做過練習的朋友,系統中應該會遺留幾個處于出錯狀態的IDOC吧?可以用BD87,在主界面上選中結點YPO后,點擊Process按鈕,一次性處理。處理前,順便在SE37中打開Y_IDOC_PO_PROCESS并設置幾個斷點即可調試。 補充: (1)如果狀態碼為56,則應該是您的WE20沒設置好; (2)由于上面代碼中控制了不能插入同樣的采購單號,所以只有一個Inbound IDOC將處理成功(狀態碼53),其余將失敗(狀態碼51)。只要新發送的IDOC賦于不同的采購單號即可避免。 (3)Outbound的狀態碼是0-50,03代表OK;Inbound的狀態碼則是50-99,53代表OK。
總結
以上是生活随笔為你收集整理的IDOC实例, Inbound IDOC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAP中的Table Control编
- 下一篇: IDOC实例,消息方式的IDOC