ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。

  • 发送端系统配置
  1. 进入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.
DATALV_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         *
*----------------------------------------------------------------------*
  DATALV_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的状态

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值