首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。
- 发送端系统配置
- 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端,
D01CLNT200为接收端
2,将逻辑系统分配给对应的client
3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例
4,进入tcode-WE30,创建Idoc Type命名为YKNTYPE
将上一步创建的segment添加到YKNTYPE下,这里可以为YKNTYPE添加多层结构,本文中仅使用单层结构
5,进入tcode-WE81创建Message Type,这里命名为YKNA1_METYPE
6,进入tcode-WE82,创建Message Type 与 Idoc Type的对应关系,值得注意的是
Message Type 与 Idoc Type是多对多的关系
7,进入tcode-SM59,创建物理连接,因为出入站均为sap系统所以这里选择ABAP连接
这里创建一个与目的逻辑系统同名的RFC目标-D01CLNT200,依次设置好目标系统服务器和登陆账号后保存设置
测试一下连接是否可用
8,进入tcode-WE21,创建接收端的端口,选择事务性RFC,创建名为TO_CL200的端口
设置RFC目标-D01CLNT200
9,进入tcode-WE20,创建合作伙伴参数,这一步需要将前面几个步骤的设置整合起来,
选择逻辑系统类型,添入目标逻辑系统及代理人等参数
保存后添加伙伴参数,由于目标系统为接收端所以要添加外向型参数
依次分配目标逻辑系统,Message Type ,目标端口,Idoc Type
10,创建一个发送程序,该程序通过调用函数MASTER_IDOC_DISTRIBUTE来实现发送IDOC
*&---------------------------------------------------------------------*
*& Report YN_IDOC_DEMO01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT YN_IDOC_DEMO01.
DATA: LV_ZKNA1 TYPE ZKNA1, "IDoc数据段
LV_EDIDC TYPE EDIDC, "IDoc的控制记录
GT_EDIDC TYPE TABLE OF EDIDC,
GT_EDIDD TYPE TABLE OF EDIDD WITH HEADER LINE. "IDoc的数据记录
CLEAR LV_EDIDC.
*系统根据下面4行即可与WE20(合作和伴配置文件)设置关联起来
LV_EDIDC-MESTYP = 'YKNA1_METYPE'. "Message Type
LV_EDIDC-IDOCTP = 'YKNTYPE'. "IDOC Type
LV_EDIDC-RCVPRT = 'LS'. "接收方类型为逻辑系统
LV_EDIDC-RCVPRN = 'D01CLNT200'. "接收方合作伙伴
*添加IDOC节点
CLEAR GT_EDIDD.
GT_EDIDD-SEGNAM = 'ZKNA1'."段类型
GT_EDIDD-DTINT2 = 0.
LV_ZKNA1-KUNNR = 'Y000001'."客户
LV_ZKNA1-LAND1 = 'CN'. "国家/地区
LV_ZKNA1-ORT01 = 'BEIJING'."城市
LV_ZKNA1-NAME1 = '公司A'. "名称
GT_EDIDD-SDATA = LV_ZKNA1. "节点内容
APPEND GT_EDIDD.
*添加IDOC节点
CLEAR GT_EDIDD.
GT_EDIDD-SEGNAM = 'ZKNA1'. "段类型
GT_EDIDD-DTINT2 = 0.
LV_ZKNA1-KUNNR = 'Y000002'. "客户
LV_ZKNA1-LAND1 = 'CN'. "国家/地区
LV_ZKNA1-ORT01 = 'HANGZHOU'."城市
LV_ZKNA1-NAME1 = '公司B'. "名称
GT_EDIDD-SDATA = LV_ZKNA1. "节点内容
APPEND GT_EDIDD.
*添加IDOC节点
CLEAR GT_EDIDD.
GT_EDIDD-SEGNAM = 'ZKNA1'. "段类型
GT_EDIDD-DTINT2 = 0.
LV_ZKNA1-KUNNR = 'Y000003'. "客户
LV_ZKNA1-LAND1 = 'CN'. "国家/地区
LV_ZKNA1-ORT01 = 'SHANGHAI'."城市
LV_ZKNA1-NAME1 = '公司C'. "名称
GT_EDIDD-SDATA = LV_ZKNA1. "节点内容
APPEND GT_EDIDD.
CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' "发送IDoc
EXPORTING
MASTER_IDOC_CONTROL = LV_EDIDC "IDoc控制记录
TABLES
COMMUNICATION_IDOC_CONTROL = GT_EDIDC "接收:用来接收IDoc发送情况
MASTER_IDOC_DATA = GT_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.
ENDIF.
- 接收端系统配置
1,进入tcode-SM59,创建到发送端的物理连接D01CLNT150(与发送端的逻辑系统同名)
2,进入tcode-WE21,创建发送端的端口,
3,创建一个入站处理函数,首先参考标准函数IDOC_INPUT_BBP_IV的参数
创建函数YN_IDOC_PROCESS01,为了看到效果可以直接在代码里打一个外部断点
FUNCTION YN_IDOC_PROCESS01.
*"----------------------------------------------------------------------
*"*"本地接口:
*" 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
*"----------------------------------------------------------------------
*----------------------------------------------------------------------*
* this function module is generated *
* never change it manually, please! 22.09.1999 *
*----------------------------------------------------------------------*
DATA: LV_ZKNA1 TYPE ZKNA1. "IDoc数据段
CLEAR IDOC_CONTRL.
READ TABLE IDOC_CONTRL INDEX 1.
IF IDOC_CONTRL-MESTYP <> 'YKNA1_METYPE'.
RAISE WRONG_FUNCTION_CALLED.
ENDIF.
LOOP AT IDOC_CONTRL.
LOOP AT IDOC_DATA WHERE DOCNUM = IDOC_CONTRL-DOCNUM.
LV_ZKNA1 = IDOC_DATA-SDATA.
ENDLOOP.
"根据数据处理情况设置当前IDoc处理的状态
IF SY-SUBRC = 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.
4,进入tcode-BD51,添加入站处理函数,填入上一个步骤的函数名YN_IDOC_PROCESS01
输入类型设置为1
5,进入tcode-WE57,将Message Type和Idoc Type 分配给入站处理函数
6,进入tcode-WE42创建处理代码YCODE01
将入站处理函数分配给处理代码
7,进入tcode-WE20,创建发送端的伙伴参数文件
由于次为发送端的伙伴文件所以要添加内向参数
依次分配发送端的逻辑系统,Message Type,处理代码并保存
- 测试
在发送端client进入程序YN_IDOC_DEMO01,如果你在入站处理函数中打了外部断点,执行后会进入断点中,我们可以查看发送过来的数据
也可以进入tcode-BD87跟踪Idoc的状态