一、发送端配置出站IDoc
1、WE31 创建段类型,此处我用标准段类型 E1P0000 演示
2、WE30 创建IDoc类型,此处我用标准IDoc类型 HRMD_A09 演示
3、WE81 创建消息类型
4、WE82 关联消息类型与IDoc类型
5、WE21 创建接收端的端口,其中RFC目标为SM59创建的到接收系统的ABAP连接
6、WE20 创建合作伙伴参数文件
合作伙伴编号:SALE定义的接收端逻辑系统名称
伙伴类型:LS
Ty.:US
代理人:发送端的用户,IDoc中出现问题会向此用户发送邮件
出站参数
消息类型:步骤3 WE81创建的消息类型
接收方端口:步骤5 WE21创建的接收端端口
基本类型:步骤2 WE30创建的IDoc类型
7、编写测试程序,并执行测试程序
REPORT ytest_lcl. PARAMETERS: p_pernr TYPE p0000-pernr OBLIGATORY. START-OF-SELECTION. DATA: ls_head TYPE e1plogi, ls_item TYPE E1PITYP, ls_p0000 TYPE e1p0000, "IDoc数据段:头 ls_p0001 TYPE e1p0001, "IDoc数据段:Item ls_edidc TYPE edidc, "IDoc的控制记录 lt_edidc TYPE TABLE OF edidc, lt_edidd TYPE TABLE OF edidd WITH HEADER LINE. "IDoc的数据记录 CLEAR ls_edidc. *系统根据下面4行即可与WE20(合作和伴配置文件)设置关联起来 ls_edidc-mestyp = 'YTEST_MSG_TYP'. "Message Type ls_edidc-idoctp = 'HRMD_A09'. "IDOC Type ls_edidc-rcvprn = 'ESDCLNT150'. "partner Number of Recipient接收方合作伙伴 ls_edidc-rcvprt = 'LS'. "partner Type of Receiver接收方类型为逻辑系统 *添加IDOC节点 CLEAR lt_edidd. lt_edidd-segnam = 'E1PLOGI'."头节点 lt_edidd-dtint2 = 0. lt_edidd-sdata = ls_head. "节点内容:ls_pohead结构中的数据最后被拼接成字符串再赋值给lt_edidd-sdata,最大长度不能超过1000 APPEND lt_edidd. CLEAR lt_edidd. lt_edidd-segnam = 'E1PITYP'."头节点 lt_edidd-dtint2 = 0. lt_edidd-sdata = ls_item. "节点内容:ls_pohead结构中的数据最后被拼接成字符串再赋值给lt_edidd-sdata,最大长度不能超过1000 APPEND lt_edidd. CLEAR lt_edidd. lt_edidd-segnam = 'E1P0000'."Item节点 lt_edidd-dtint2 = 0. CLEAR ls_p0000. SELECT SINGLE * FROM pa0000 INTO CORRESPONDING FIELDS OF ls_p0000 WHERE pernr = p_pernr AND endda = '99991231'. lt_edidd-sdata = ls_p0000. "节点内容:ls_pohead结构中的数据最后被拼接成字符串再赋值给lt_edidd-sdata,最大长度不能超过1000 APPEND lt_edidd. CLEAR lt_edidd. lt_edidd-segnam = 'E1P0001'."Item节点 lt_edidd-dtint2 = 0. CLEAR ls_p0001. SELECT SINGLE * FROM pa0001 INTO CORRESPONDING FIELDS OF ls_p0001 WHERE pernr = p_pernr AND endda = '99991231'. lt_edidd-sdata = ls_p0001. APPEND lt_edidd. CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' "发送IDoc EXPORTING master_idoc_control = ls_edidc "IDoc控制记录 TABLES communication_idoc_control = lt_edidc "接收:用来接收IDoc发送情况 master_idoc_data = lt_edidd "IDoc数据记录 EXCEPTIONS " error_in_idoc_control = 1 error_writing_idoc_status = 2 error_in_idoc_data = 3 sending_logical_system_unknown = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. COMMIT WORK. WRITE: 'Idoc sent:'. LOOP AT lt_edidc INTO ls_edidc. NEW-LINE. WRITE: 'Idoc number is', ls_edidc-docnum, '; receiver partner is', ls_edidc-rcvprn, '; sender partner',ls_edidc-sndprn. ENDLOOP. ENDIF.8、BD87 查看IDoc处理结果,出现错误可重处理
二、接收端配置入站IDoc
1、WE31 创建段类型,同发送端
2、WE30 创建IDoc类型,同发送端
3、WE81 创建消息类型,同发送端
4、WE82 关联消息类型与IDoc类型,同发送端
5、WE21 创建发送端的端口,其中RFC目标为SM59创建的到发送系统的ABAP连接
6、创建入站处理函数,可参考函数IDOC_INPUT_*,入参出参固定
FUNCTION ytest_input_lcl. *"---------------------------------------------------------------------- *"*"本地接口: *" 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 *"---------------------------------------------------------------------- CLEAR idoc_contrl. READ TABLE idoc_contrl INDEX 1. IF idoc_contrl-mestyp <> 'YTEST_MSG_TYP'. RAISE wrong_function_called. ENDIF. LOOP AT idoc_contrl. LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum. CASE idoc_data-segnam. WHEN 'E1PLOGI'. "直接将字符赋值给结构,贬值过程中会按照结构中的字段长度来划分各字段 " idoc_data-sdata. WHEN 'E1PITYP'. " idoc_data-sdata. WHEN OTHERS. ENDCASE. ENDLOOP. "根据数据处理情况设置当前IDoc处理的状态 IF 1 = 1. 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 = 'B1'. idoc_status-msgno = '527'. APPEND idoc_status. ENDIF. ENDLOOP. ENDFUNCTION.7、WE51 注册入站处理函数
8、WE57 关联入站处理函数与IDoc类型和消息类型
9、WE42 创建进站处理代码,选择由函数模块处理,标识为入站处理函数名
10、WE20 创建合作伙伴参数文件
合作伙伴编号:SALE定义的发送端逻辑系统名称
伙伴类型:LS
Ty.:US
代理人:接收端的用户
入站参数
消息类型:步骤3 WE81创建的消息类型
处理代码:步骤9 WE42创建的进站处理代码11、BD87 查看IDoc处理结果,出现错误可重处理