IDoc(intermediate(媒介)document)是一种系统间通用的数据交换格式,通过IDoc接口可以实现SAP系统之间以及SAP系统与其他系统之间的数据交换。
IDoc(Intermediate Document,中转文档)是SAP提供的系统整合专用的数据/消息格式,它通过ALE方式来进行交换,而SAP就是IDoc提供了EDI的支持,你也可以把IDoc认为是EDI的一个实现。
基于IDoc的应用技术有:
ALE:多用于同一个企业中不同SAP系统之间的数据交换,通过IDoc格式的数据创建分布式系统
ALE(Application Link and Enabling)是SAP专门为SAP与SAP之间所设计的整合中间件。ALE从SAP 3.0版本开始就作为SAP整个应用体系的一部分,分布式数据交换提供了可靠安全的通讯机制。ALE的设计,原本作为两个SAP流程之间的一种消息传递服务,使SAP与SAP的业务流程之间数据能够有效的交换,为两个独立的SAP系统提供整合服务。不过随着应用的发展,ALE接口机制也成为了其它非SAP系统的标准整合方式。
EDI(electronic data exchange,电子数据交换):用于实现不同企业间的电子数据交换
EDI(Electronic Document Interchange,电子数据交换)其实就是采用标准格式的电子数据,用于在通讯网络中在业务伙伴间交换业务文档所用。你可这样理解EDI,就是大家都按相同的排列放置数据到一个数据文档中,并按相同的排列解析此文档以得到所需的内容。 EDI又被叫做无纸化交换。
SAP提供了一个事务码列出IDoc相关的事务码,即wedi,
IDOC的开发包含几个部分:idoc basic type的开发、message type的开发,他们之间的关联,然后还有各种配置
首先是端口配置,端口配置好,数据才能通过端口传输出去。
1.创建发送端接口配置(Logical System)(SALE)
2.分配逻辑系统
同理为接收端创建对应的逻辑系统并分配到集团(逻辑系统一般不用自己创建,因为系统间有自带的IDOC,所以可以用系统的逻辑系统)
IDOC开发
1、idoc basic type的开发:
首先要WE31去创建idoc segment(一般还是去参考原来标准的字段类型)
填入相关信息后保存
保存后会在系统中创建该段对应的结构(SE11)
同理创建明细数据段
创建segment之后(一般建议使用标准的segment)WE30创建idoc type:
同样操作追加明细数据(明细数据可以有多,所以传输数据条数就不要设定为1了)(当然头数据也可以一次传输多条,这里只是以一条为实例)
2、段和IDOC类型完成后,进行message type的开发: WE81去创建message type:
并不是一个消息类型对应一个idoc类型,只要合适,多个idoc类型可以共用一个消息类型
3、idoc type和message type关联: 把上面创建的idoc type或者是idoc extension 和创建的message type通过WE82去链接起来:
释放:参考系统的填写就行。
4.在发送端创建接收端物理连接配置信息RFC Destination(SM59)
同理也需要在接收端创建发送端的物理连接配置信息
5.创建接收端端口信息(WE21)
同理需要在接收端创建发送端的端口信息
4.创建接收端合作伙伴配置文件(WE20)
伙伴角色可不填(此处填上只是试一试区别)
创建IDOC程序(此处引用大神的)
REPORT ZWGRE0001.
DATA: ls_pohead TYPE zpohead,"IDoc数据段:头
ls_poitem TYPE zpoitem,"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 = 'YZ_PO_MSG_TYP'. "Message Type
ls_edidc-idoctp = 'ZPOID001'. "IDOC Type
ls_edidc-rcvprn = 'Z800LS'. "partner Number of Recipient接收方合作伙伴
ls_edidc-rcvprt = 'LS'. "partner Type of Receiver接收方类型为逻辑系统
*添加IDOC节点
CLEAR lt_edidd.
lt_edidd-segnam = 'YZHEAD'."头节点
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 = 'YZITEM'."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 = 'YZITEM'."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.
CALL FUNCTION 'DB_COMMIT'.
CALL FUNCTION 'DEQUEUE_ALL'.
COMMIT WORK AND WAIT.
CALL FUNCTION 'EDI_DOCUMENT_DEQUEUE_LATER'
EXPORTING
DOCNUM = ls_edidc-docnum
* SYNCHRON = ' '
* EXCEPTIONS
* IDOC_IS_NOT_TO_DEQUEUE = 1
* OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
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.
创建入站处理函数RFC
注册入站处理函数(BD51)
将入站函数与IDOC Type/Message Type关联(WE57)
创建入站函数CODE(WE42)
创建发送端合作伙伴配置文件(WE20)