自定义IDOC配置

 1需求场景

可以通过配置IDOC,在相同系统不同客户端之间传输数据,也可以在不同SAP系统中传输数据。

2配置发送端IDOC

2.1定义段(WE31)

1.定义段类型,包含需要传输的字段

5cda72e327eae7468923f97bb794469e.png

2.创建成功后设置批准

a891742e7e9d796a87b0b21a11aaa496.png

2.2定义基本类型(WE30)

1.创建开发对象

0f6bbbfbf55dc4a3c2e1f4af9c46be46.png

2.将段维护到基本类型

90528c9ea4abdb13ed003cab841b0615.png

2.3定义消息类型(WE81)

1. 定义消息类型

4b3bc7730e2e88d927dd321430ef028f.png

2.WE82把基本类型分配给消息类型

7fc63d393e274a4edaac37a20cfa7d1b.png

2.4定义传输结构

1.定义一个表类型

f4bace7109717a33a0a95a4d3baa6cfe.png

2.定义行类型

6e71e88e98dac51edaca41376fc51697.png

2.5创建RFC目标(SM59)

1. 创建RFC目标连接

e4c83a653c421b8c5815cb00196e4725.png

2输入目标系统账户名密码

8fcedc7d6dbea42c886a18f421ce5f7e.png

2.6创建接收端端口(WE21)

c2fb3a8f073e873c472b10710ea5b757.png

2.7配置发送端逻辑系统(SALE)

1. 定义逻辑系统

09f38247af7373951cb14bca98335dc1.png

74319cd82da3b41bc470aac034d3b7c0.png

2.8分配逻辑系统

1. 将逻辑系统分配到集团

2d7755fe7014059b1ffe741f9e4dab59.png

在发送端不需要分配300逻辑系统到集团,但是300逻辑系统需要在接收端配置时分配

67cb9c54f907c3e5697e487eb029e60d.png

输入城市、逻辑系统、货币保存

f98792698cabf7a8c6b78cea78ae2330.png

2.9维护分布模型和视图

e2f1f1303051055a8b292ac13335d81d.png

创建模型视图

db3fac6313b5bbe3835ff38508dcaaea.png

双击检查该维护系统是否正确

a74c707139896083ad338d1571fa990a.png

添加消息类型

410f19a6766aaaade1625e3214d66f63.png

点击生成合作伙伴参数文件

b79b92512d44315bf2b013fbc0f3c5c0.png

7f9399ef21d8e5a1317e4aaf65b93b67.png

生成成功

f95ba65a8f3d07956a0f7635904eaa82.png

点击更改参数文件

ee914415d69c1bc5d2060d2c3c65e894.png

d2a999d71724c4f45894a621b4bb77b9.png

51fa1e52b25912d0fc4b43da91d7a192.png

2.10发送端程序

1. 创建一个接口,用于程序调用,发送IDOC数据到目标系统

92810eb8607644a437ec893fdefca97a.png

910d5498b5297d078999816c2bfba731.png

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)

d86f89aaf5509a7f53126cf6d5af632d.png

3.6将入站函数与基本类型/消息类型关联(WE57)

63c97dd9ce8632faeca2e06a4866194c.png

3.7创建进站处理代码(WE42)

9c102157aac81adaa8594642d413e903.png

3.8创建发送端合作伙伴配置文件(WE20)

1. 创建合作伙伴类型,添加进站消息类型

92f891f15c7970fe8d6a1224dfd21466.png

双击消息类型

feb4a4fc30a43b1bdc35f703c3f5f699.png

4测试IDOC

1.运行程序,调用发送端接口,执行成功之后,运行事务代码BD87查看结果。如果未黄灯,可以点击处理,再次执行。

059e1c57ae2365566ef12a0ceea6f9b2.png

2.在接收程序里面打上断点,处理接收的IDOC,发现进入断点,数据也传输过去了

22c110626470dd055ad0b2d7299f88bf.png

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值