目錄
1需求場景
可以通過配置IDOC,在相同系統不同客戶端之間傳輸數據,也可以在不同SAP系統中傳輸數據。
2配置發送端IDOC
2.1定義段(WE31)
1.定義段類型,包含需要傳輸的字段
2.創建成功后設置批准
2.2定義基本類型(WE30)
1.創建開發對象
2.將段維護到基本類型
2.3定義消息類型(WE81)
1. 定義消息類型
2.WE82把基本類型分配給消息類型
2.4定義傳輸結構
1.定義一個表類型
2.定義行類型
2.5創建RFC目標(SM59)
1. 創建RFC目標連接
2輸入目標系統賬戶名密碼
2.6創建接收端端口(WE21)
2.7配置發送端邏輯系統(SALE)
1. 定義邏輯系統
2.8分配邏輯系統
1. 將邏輯系統分配到集團
在發送端不需要分配300邏輯系統到集團,但是300邏輯系統需要在接收端配置時分配
輸入城市、邏輯系統、貨幣保存
2.9維護分布模型和視圖
創建模型視圖
雙擊檢查該維護系統是否正確
添加消息類型
點擊生成合作伙伴參數文件
生成成功
點擊更改參數文件
2.10發送端程序
1. 創建一個接口,用於程序調用,發送IDOC數據到目標系統
2.源代碼
FUNCTION zmakt_idoc_send. *"---------------------------------------------------------------------- *"*"本地接口: *" TABLES *" ZTMAKT TYPE ZTMAKT OPTIONAL *" EXCEPTIONS *" NO_IDOC *" NO_MODEL *"---------------------------------------------------------------------- *常規變量 DATA: *IDoc的控制記錄 idoc_control LIKE edidc, *IDoc的數據記錄 t_idoc_data LIKE edidd OCCURS 0 WITH HEADER LINE, *MASTER_IDOC_CONTROL創建的IDoc的表 t_comm_control LIKE edidc OCCURS 0 WITH HEADER LINE, *邏輯系統的伙伴類型 c_partner_type_logical_system LIKE edidc-rcvprt, *幫助變量檢查是否必須創建IDoc h_create_idoc. * 特定的變量 DATA: * IDoc段結構 zsmakt TYPE zsmakt, * 要輸入控制記錄的數據 c_message_type LIKE edidc-mestyp VALUE 'ZMAKTMAS', c_base_idoc_type LIKE edidc-idoctp VALUE 'ZMAKT_TYPE', * 段類型 c_header_segtyp LIKE edidd-segnam VALUE 'ZMAKT'. CLEAR:zsmakt. zsmakt-matnr = '000000000123456789'. zsmakt-maktx = '測試物料描述'. APPEND zsmakt TO ztmakt. * 檢查這個IDOC是否被創建,讀取組件 CALL FUNCTION 'ALE_MODEL_DETERMINE_IF_TO_SEND' EXPORTING message_type = c_message_type * SENDING_SYSTEM = ' ' * RECEIVING_SYSTEM = ' ' * VALIDDATE = SY-DATUM IMPORTING idoc_must_be_sent = h_create_idoc. * exceptions * own_system_not_defined = 1 * others = 2. IF h_create_idoc IS INITIAL. RAISE no_model. * no message flow maintained in the model, nothing to do EXIT. ENDIF. * 將表頭放入IDOC LOOP AT ztmakt. MOVE-CORRESPONDING ztmakt TO zsmakt. * 將記錄添加到IDOC數據表 t_idoc_data-segnam = c_header_segtyp. t_idoc_data-sdata = zsmakt. APPEND t_idoc_data. ENDLOOP. idoc_control-mestyp = c_message_type. idoc_control-idoctp = c_base_idoc_type. CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' * 在更新任務中"如果應用程序文檔在更新任務中發布 EXPORTING master_idoc_control = idoc_control TABLES communication_idoc_control = t_comm_control master_idoc_data = t_idoc_data EXCEPTIONS error_in_idoc_control = 1 error_writing_idoc_status = 2 error_in_idoc_data = 3 sending_logical_system_unknown = 4 OTHERS = 5. COMMIT WORK. READ TABLE t_comm_control INDEX 1. IF sy-subrc <> 0. RAISE no_idoc. * no IDoc was created, you can react here, if neccessary ENDIF. ENDFUNCTION.
3配置接收端IDOC
以上配置都是在200系統(源系統)中配置,以下配置都是在300系統(目標系統)中配置
該文檔記錄的是在同一服務器的不通客戶端傳輸數據,又由於段類型、基本類型、消息類型都是跨Client的,所以2.1 、2.2 、2.3不需要在300系統再次配置了(但如果不是在同一服務器上,則需要像上面那樣進行配置)
3.1創建接收端RFC目標(SM59)
與發送端一致,可參考上邊操作,關聯上發送端的目標地址和實例號
3.2創建接收端的端口(WE21)
參照2.6
3.3定義邏輯系統並分配集團(SALE)
參照2.7 、2.8
3.4創建接收端程序
這個函數的參數接口是有規范的,可以從IDOC_INPUT_BBP_IV這些標准函數拷貝參數接口部分
源代碼部分:
FUNCTION ZIDOC_PO_PROCESS. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(INPUT_METHOD) LIKE BDWFAP_PAR-INPUTMETHD *" VALUE(MASS_PROCESSING) LIKE BDWFAP_PAR-MASS_PROC *" EXPORTING *" VALUE(WORKFLOW_RESULT) LIKE BDWF_PARAM-RESULT *" VALUE(APPLICATION_VARIABLE) LIKE BDWF_PARAM-APPL_VAR *" VALUE(IN_UPDATE_TASK) LIKE BDWFAP_PAR-UPDATETASK *" VALUE(CALL_TRANSACTION_DONE) LIKE BDWFAP_PAR-CALLTRANS *" TABLES *" IDOC_CONTRL STRUCTURE EDIDC *" IDOC_DATA STRUCTURE EDIDD *" IDOC_STATUS STRUCTURE BDIDOCSTAT *" RETURN_VARIABLES STRUCTURE BDWFRETVAR *" SERIALIZATION_INFO STRUCTURE BDI_SER *" EXCEPTIONS *" WRONG_FUNCTION_CALLED *" OTHERS *"---------------------------------------------------------------------- DATA: zsmakt TYPE zsmakt. CLEAR idoc_contrl. READ TABLE idoc_contrl INDEX 1. IF idoc_contrl-mestyp <> 'ZMAKTMAS'. RAISE wrong_function_called. ENDIF. LOOP AT idoc_contrl. LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum. "直接將字符賦值給結構,貶值過程中會按照結構中的字段長度來划分各字段 zsmakt = idoc_data-sdata. WRITE: / 'Head',zsmakt. "此處直接把收到的數據打印出來 ENDLOOP. "根據數據處理情況設置當前IDoc處理的狀態 IF 1 = 0. CLEAR idoc_status. idoc_status-docnum = idoc_contrl-docnum."當前正處理的IDoc idoc_status-status = '53'. "IDOC處理成功 APPEND idoc_status. ELSE. 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. ENDFUNCTION.
3.5注冊入站處理函數(BD51)
3.6將入站函數與基本類型/消息類型關聯(WE57)
3.7創建進站處理代碼(WE42)
3.8創建發送端合作伙伴配置文件(WE20)
1. 創建合作伙伴類型,添加進站消息類型
雙擊消息類型
4測試IDOC
1.運行程序,調用發送端接口,執行成功之后,運行事務代碼BD87查看結果。如果未黃燈,可以點擊處理,再次執行。
2.在接收程序里面打上斷點,處理接收的IDOC,發現進入斷點,數據也傳輸過去了