[SAP ABAP开发技术总结]IDoc

目录导航

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!
原文出自:

18.4.         IDoc. 206

18.4.1.     数据段类型和数据段定义(WE31)... 206

18.4.2.     IDoc定义(WE30)... 207

18.4.3.     自定义IDoc发送与接收实例... 208

18.4.3.1.           发送端800(outbound)配置... 208

1、创建segment(WE31)... 208

2、创建IDOC Type(WE30)... 209

3、创建Message Type(WE81)... 210

4、关联Message Type和IDOC Type(WE82)... 210

5、创建接收端RFC Destination(SM59)... 210

6、创建到收端的端口(WE21)... 211

7、创建发送端Logical System并分配(SALE)... 211

8、创建接收端Logical System(SALE)... 212

9、创建接收端合作和伴配置文件Partner profile(WE20)... 212

10、通过ABAP程序发送IDOC. 213

18.4.3.2.           接收端810(Inbound)配置... 216

1、创建发送端RFC Destination(SM59)... 216

2、创建发送端的端口(WE21)... 217

3、将接收端Logical System分配到Client 810(SALE)... 217

4、创建入站处理函数... 218

5、注册入站处理函数(BD51)... 219

6、将入站函数与IDOC Type/Message Type关联(WE57)... 219

7、创建入站处理代码Inbound Process Code(WE42)... 219

8、创建发送端合作和伴配置文件Partner profile(WE20)... 219

9、测试 BD87. 220

18.4.     IDoc

IDoc是基于文档,用作异步传输数据的载体,类似于XML

18.4.1.           数据段类型和数据段定义(WE31

数据段是IDoc结构组件,是IDoc的构成的单元。它由Segment type(数据段类型)与Segm. definition(数据段定义)两部分组成,其中Segment type的名称与SAP版本无关,但Segm. definition名称是与SAP版本有关的,外部系统就是根据Segm. definition名称来确定当前数据段的版本的:

SAP提供的标准数据段类型定义中,Segment type名称以“E1”开头,而Segm. definition名称则以“E2”开头(如果为用户自定的数据段,则数据段类型名应以“Z1”开头,数据段定义名称应以“Z2”开头),且后面跟上版本号(如上面的006),如数据段类型E1FIKPF对应多个版本的数据段定义(包括最初版本在内共7个版本):

双击006版本,即可查看数据段类型F1FIKPF的最新具体定义,如上上图所示

IDoc数据段中各个字段的数据类型均为字符类型(如上上图中的Export leng),在出站时已将原数据类型都转换为字符型了。另外,在ABAP程序中,访问IDoc中的具体某个字段时,需要通过Segment type(数据段类型)名而不是Segm. definition(数据段定义)名,如:E1FIKPF-BUKRS,而不是E2FIKPF006-BUKRS之类的。

IDoc Type中的数据段类型实质会在数据字典中的创建相应的结构,如上图数据段类型E1FIKPF:

18.4.2.           IDoc定义(WE30)

IDoc类型中定义了数据段以及数据段的层级和次序

标准SAP系统提供的IDoc类型称为基本类型(Basic type),该类型可以通过IDoc扩展(Extention)进行调整,即在SAP IDoc类型结构的基础上增加新的数据段或者在数据段中增加新字段

如果是自己完全创建一个新的类型,不扩展任何类型,则选择“Basic Type”,否则如果是要从已存在类型来扩展出新的类型时,需要选择“Extension”,并且需要指定basic type

18.4.3.           自定义IDoc发送与接收实例

该实例使用800发送端向810接收端发送Idoc进行实验

18.4.3.1.       发送端800(outbound)配置

1、创建segment(WE31)

segment,类似于创建XML的节点及节点属性,即定义XML文档中的节点及节点属性。

2、创建IDOC Type(WE30)

创建IDOC Type,定义结点间的相互逻辑关系

先输入YPOIDOC,然后点击创建,紧跟着选择create new:

在主界面中,先点击创建按钮,将YPOHEAD添加,设置Mandatory seg打勾,min = 1, max = 1,代表我们每个IDOC仅包含一张采购订单:

然后在YPOHEAD下添加YPOITEM,同样的Mandatory seg打勾,min = 1, max =99999:

3、创建Message Type(WE81)

先切换到编辑状态,然后点击New Entries,输入YPO_MESS_TYPE即可。

4、关联Message Type和IDOC Type(WE82)

5、创建接收端RFC Destination(SM59)

创建一个到接收端810的物理连接,由于是该实例是在同一个SAP系统内部进行实验,所以“连接类型”选择的是ABAP Connection连接,名为ZTO810:

6、创建到收端的端口(WE21)

注:这里讲的端口不是单纯的指定Socket端口号,而是指连接到RFC目标系统的统称,包括IP、端口等信息,实质上是在SM59创建的物理连接基础之上创建的另一种逻辑名而已

基于上面第5步创建的RFC Destionation,创建端口Port,类型选TRANSACTIONAL RFC,名为TO810PORT,RFC destination则填写ZTO810

 

7、创建发送端Logical System并分配(SALE)

为发送端800创建逻辑系统 Z800LS:

 

并将逻辑系统分配到发送端800:

 

注:这里不需要为本端(Client 800)在本端创建发送端逻辑系统的合作和伴配置文件,但需要在接收端810中配置

8、创建接收端Logical System(SALE)

为接收端810创建逻辑系统 Z810LS,这将在下一步创建到接收端的合作伙伴配置文件Partner profile(WE20)时用到:

但与上面创建发送端逻辑系统不一样的是,在发送端系统800中是不需要将它分配给Client 810,而分配操作是在接收端810中进行的,这一分配操作请参考后面接收端(Inbound)配置章节

9、创建接收端合作和伴配置文件Partner profile(WE20)

合作和伴配置文件将Message Type消息类型、receiver port RFC目标端口IDoc类型关联起来

创建一个patner no为Z810LS的合作和伴配置文件,该配置文件描述了将IDoc发往何处:

上图中合作伙伴编号填上一步创建的接收端逻辑系统,类型选择LS。Ty.选择是“用户”类型,代理人为本系统(发送端800)中的用户,如果在Idoc发送过程中出现什么问题,会向此用户发送邮件。当上面信息填好后,点击保存(保存之后才可以对Outbound parmtrs进行设置)。

然后,点击outbound下方的加号,创建一个outbound parameter。Message Type为YPO_MESS_TYPE,receiver port为TO810PORT,output mode选择Transfer idoc immed.,Basic Type填写YPOIDOC,保存即可:

10、通过ABAP程序发送IDOC

程序的思路就是,把每个IDOC节点按字符串形式逐个添加,而字符串的添加次序自然也体现了IDOC节点间的逻辑关系。代码如下:

DATA: ls_pohead TYPE ypohead,"IDoc数据段:头
      ls_poitem TYPE ypoitem,"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 = ‘YPO_MESS_TYPE‘. "Message Type
ls_edidc-idoctp = ‘YPOIDOC‘. "IDOC Type
ls_edidc-rcvprn = ‘Z810LS‘. "partner Number of Recipient接收方合作伙伴
ls_edidc-rcvprt = ‘LS‘.     "partner Type of Receiver接收方类型为逻辑系统

*添加IDOC节点
CLEAR lt_edidd.
lt_edidd-segnam = ‘YPOHEAD‘."头节点
lt_edidd-dtint2 = 0.
CLEAR ls_pohead.
ls_pohead-ebeln = ‘4001122334‘."采购单号
ls_pohead-bukrs = ‘1000‘."公司代码
ls_pohead-bedat = ‘20090630‘."日期
lt_edidd-sdata = ls_pohead. "节点内容:ls_pohead结构中的数据最后被拼接成字符串再赋值给lt_edidd-sdata,最大长度不能超过1000
APPEND lt_edidd.

CLEAR lt_edidd.
lt_edidd-segnam = ‘YPOITEM‘."Item节点
lt_edidd-dtint2 = 0.
CLEAR ls_poitem.
ls_poitem-ebeln = ‘4001122334‘."采购单号
ls_poitem-ebelp = ‘0001‘."Item行号
ls_poitem-matnr = ‘000000000000004527‘."物料号
ls_poitem-menge = ‘3‘."数量
ls_poitem-meins = ‘ST‘."单位
lt_edidd-sdata = ls_poitem.
APPEND lt_edidd.

CLEAR lt_edidd.
lt_edidd-segnam = ‘YPOITEM‘."Item节点
lt_edidd-dtint2 = 0.
CLEAR ls_poitem.
ls_poitem-ebeln = ‘4001122334‘."采购单号
ls_poitem-ebelp = ‘0002‘."Item行号
ls_poitem-matnr = ‘000000000000009289‘."物料号
ls_poitem-menge = ‘5‘."数量
ls_poitem-meins = ‘M‘."单位
lt_edidd-sdata = ls_poitem.
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.

选中消息,并点击“处理”按钮后,该消息就会发往目的客户端810,状态从准备发送到成功发送:

发送的数据可以选择数据记录节点来查看:

以上都是在发送端800进行的,下面登录到接收端810去看看IDoc接收情况:

由于在接收端810未配置到发送端800的合作伙伴配置文件,所以出错。下面章节在接收端810中进行发送端800的相关配置

18.4.3.2.       接收端810(Inbound)配置

由于该实例是在同一服务器的同一实例中进行的,又由于Segment、IDoc Type、Message Type这些都是跨Client的,所以上面1、2、3、4步就不需要在810端再次配置了,这些是共享的(但如果不是在同一服务器上,则需要像上面那样进行配置)

1、创建发送端RFC Destination(SM59)

创建到发送端810的物理连接

2、创建发送端的端口(WE21)

基于上面创建的RFC Destionation,创建端口Port,类型选TRANSACTIONAL RFC,名为FRM800PORT,RFC destination则填写上面创建的RFC远程目标ZFROM800

 

3、将接收端Logical System分配到Client 810(SALE)

如果是在不同的服务器中,则接收端需要像在发送端那样:发送端逻辑系统Z800LS与接收端逻辑系统Z810LS都需要被创建,并且还需要将接收端逻辑系统Z810LS分配到Client 810,并且还需要以发送端逻辑系统Z800LS为基础创建发送端合作伙伴配置文件

由于是在同一服务器的同一实例中,所以在发送端中创建的发送端逻辑系统Z800LS与接收端逻辑系统Z810LS在此端是通用共享,这里不需要再次创建(outbound中已经创建了这两个逻辑系统了),但(outbound章节中并未分配到具体的Client)Z810LS逻辑系统没有分配到相应的Client,这一步操作需要在接收端完成,所以需要在此进行分配:

4、创建入站处理函数

创建一个function:Y_IDOC_PO_PROCESS.

当IDOC设置完毕之后,SAP可以自动调用该Funtion Module处理IDOC,所以这个函数的参数接口是有规范的,可以从IDOC_INPUT_BBP_IV这些标准函数拷贝参数接口部分:

"ypohead\ypoitem为上面定义的IDoc类型
DATA: ls_chead TYPE ypohead,
      ls_citem TYPE ypoitem.
  CLEAR idoc_contrl.
  READ TABLE idoc_contrl INDEX 1.
  IF idoc_contrl-mestyp <> ‘YPO_MESS_TYPE‘.
    RAISE wrong_function_called.
  ENDIF.
  LOOP AT idoc_contrl.
    LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum.
      CASE idoc_data-segnam.
        WHEN ‘YPOHEAD‘.
          "直接将字符赋值给结构,赋值过程中会按照结构中的字段长度来划分各字段
          ls_chead = idoc_data-sdata.
          WRITE: / ‘Head‘,ls_chead.
        WHEN ‘YPOITEM‘.
          ls_citem = idoc_data-sdata.
          WRITE: / ‘Item‘,ls_citem.
        WHEN OTHERS.
      ENDCASE.
    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.

5注册入站处理函数(BD51)

填入函数名Y_IDOC_PO_PROCESS,Input Type=1

6、将入站函数与IDOC Type/Message Type关联(WE57)

Function Module输入Y_IDOC_PO_PROCESS,其下的Type填写F;IDOC Type下的Basic Type填写YPOIDOC;Message Type填写YPO_MESS_TYPE;Direction填写2(Inbound)

7、创建入站处理代码Inbound Process Code(WE42)

Process Code输入YPC_PO,在Option ALE下选择Processing with ALE service,在Processing Type下选择function module,保存后,在随后的窗口中,输入Inbound Module为Y_IDOC_PO_PROCESS

 

8、创建发送端合作和伴配置文件Partner profile(WE20)

由于在发送端800中已创建了发送端逻辑系统Z800LS ,所以在此端不需要在创建(发送端逻辑系统Z800LS),只是需要以此为基础创建和伴配置文件,保存后,点击加号增加进站参数:

 

9、测试 BD87

在接收端810使用BD87,登录进去后,会看到发送端发送过来的IDoc,但由于先前还没有配置发送伙伴配置文件,所以失败了:

现在在入站处理理函数中设置断点:

再执行BD87事务,继续处理出错的消息,最后发现处理成功:

调试程序时,发现数据也传递过来了:

时间: 2024-10-09 16:51:29

[SAP ABAP开发技术总结]IDoc的相关文章

ABAP开发顾问必备:SAP ABAP开发技术总结

声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 该文档是根据我过去多年学习文档与工作文档总结而成,项目开发过程中我都会参考此文档,主要ABAP很多细节上的东西不可能你记得很牢固,或者你记得一时,但过不了几天做别的项目就会

[SAP ABAP开发技术总结]ABAP程序之间数据共享与传递

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 19.             数据共享与传递... 222 19.1.         程序调用.会话.SAP/ABAP内存 关系... 222 19.2.         ABAP Memory数据共享... 224 19.2.1.     EXPORT. 224 19.2.2.     IMPORT. 226 19.2.3.     DELETE. 227 19.3

[SAP ABAP开发技术总结]客户端文本文件、Excel文件上传下载

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 客户端文本文件或Excel文件导入与导出... 1 TEXT_CONVERT_XLS_TO_SAP. 1 ALSM_EXCEL_TO_INTERNAL_TABLE. 3 SAP_CONVERT_TO_XLS_FORMAT. 5 客户端文本文件或Excel文件导入与导出 TEXT_CONVERT_XLS_TO_SAP TEXT_CONVERT_XLS_TO_SAP函数可以将

[SAP ABAP开发技术总结]ABAP调优——Open SQL优化

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 11.1.     数据库编程方面优化 1.   不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2.   不要使用SELECT DISTINCT ...,会绕过缓存,可使用 SORT BY + DELETE ADJACENT DUPLICATES 代替 3.   少用相关子查询,因为子

[SAP ABAP开发技术总结]选择屏幕——SELECT-OPTIONS

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 12.4.         SELECT-OPTIONS. 89 12.4.1.     输入ABAP程序默认值时,需要加上“=”. 89 12.4.2.     选择条件内表多条件组合规则... 89 12.4.3.     使用SELECT-OPTIONS替代PARAMETERS. 90 12.4.     SELECT-OPTIONS SELECT-OPTIONS

[SAP ABAP开发技术总结]DIALOG屏幕流逻辑

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 12.7.     屏幕流逻辑 PROCESS BEFORE OUTPUT.PROCESS AFTER INPUT.PROCESS ON HELP-REQUEST.PROCESS ON VALUE-REQUEST. 12.7.1.           FIELD FIELD <f>. 使用FIELD语句后,屏幕字段<f>需要在该语句处理完后才传递到ABAP程序相应的字

[SAP ABAP开发技术总结]EXIT-COMMAND

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 12.8.     EXIT-COMMAND 12.8.1.           MODULE <mod> AT EXIT-COMMAND 对话屏幕中,对于E类型的Function Code,可以使用如下语句在PAI事件块中来触发: MODULE<mod> AT EXIT-COMMAND. 不管该语句在screen flow logic的PAI事件块里的什么地方,都会

[SAP ABAP开发技术总结]OK_CODE

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 12.9.     OK_CODE 如果是回车(命令行中未输入内容时回车)时,由于FunctionCode为空,所以SYST-UCOMM .SY-UCOMM.OK_CODE都不会被重置:如果非回车,但FunctionCode也是空时,SYST-UCOMM.SY-UCOMM会被重置,但OK_CODE还是不会被重置,所以OK_CODE只有在FunCode非空时才会被重置 12.9.1.

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 20.17.       表字段初始值.NULL等问题... 249 20.17.1.            SE11表设置中的Initial Values. 249 20.17.2.            底层数据库表字段默认值... 249 20.17.3.            ABAP初始值.底层数据库表默认值相互转换... 250 20.17.3.1.