IDOC是SAP提供的接口工具,最开始的用途是在电子商务EDI领域,EDI可是老早以前的概念了,意思是通过将数据通过双方定义好的文件(数据)格式来传输,到系统中处理,发展到了今天,显然可以用“接口”来概括了。如果说的接口的话,到现在为止,SAP提供的接口技术确实不少,如:BDC\IDOC\BAPI\XI(PI)\WEBSERVICE等等。值得特别说一句,BW的数据抽取机制,就是通过IDOC来实现的。
下面,我们以SAP与SAP自定义数据传输的方式为例,向大家说明如何使用IDOC。本例中,我们从一个系统(PIITST100)传输到另一个系统(BT3CLNT800)。
首先,从网上贴了下基本步骤,下面我们按照这个步骤来操作:
创建IDOC:
第一步:WE31 创建IDOC所包含的字段.
第二步:WE30 创建IDOC 把Segment分配给IDOC
第三步:WE81 创建信息类型
第四步:WE82 把IDOC类型与信息类型对应.
第五步:WE57 Assign Message & Idoc Type to a Function Module for Data Process
第六步:SM59 Define a RFC connection for Idoc transfer
第七步:WE21 Define a Port ( Assign a RFC destination which created in SM59 )
第八步:WE41/42 Creat Process Code
第九步:WE20 Define a Partner Profiles( Also creat a Outbound parameters with Port, or Inbound parameters with Process code )
管理IDOC:
WE02 显示IDOC,可以根据时间,IDOC类型查找IDOC,查看成功,出错信息。
WE46 IDOC管理(出\入)
WE60 IDOC类型文档(可以查看IDOC结构,和每个字段的描述.
WE19 根据IDOC号进行IDOC处理,可以修改IDOC值进行补发动作,处理分为内向和外向。
消息配置:
WE20 配置伙伴消息进和出IDOC类型
WE21 配置伙伴。
以下操作在发送方:
1. 创建IDOC类型的段(WE31)
IDOC类型的字段,意思说我们都要传递那些数据。我们这里只传递3个字段的数据。
2. 创建IDOC类型,并把段分配给IDOC类型(WE30)
新建IDOC类型,点击 ,将刚才创建的段分配给IDOC类型,
3. 创建消息类型(WE81)
消息类型是传递消息的基本单元,所有的消息传递都是通过消息类型来操作的。这里我们只定义消息类型的名称。
4. 将IDOC类型分配给消息类型(WE82)
5. 定义RFC连接(SM59)
源系统:
目标系统:
6. 定义端口(WE21)
这里定义目标系统的端口,定义事物性RFC
7. 维护伙伴参数(WE20)
我们为源系统维护出站参数。
首先创建逻辑系统,在SALE中,作为合作伙伴编号
以下内容为接收方系统完成:
8. 按照前面的步骤,在接收方,创建相同的消息类型
9. 设置入站处理代码(WE42)
我们利用FUNCTION MUDULE来处理数据。需要定义入站处理代码,再分配给进站参数
首先创建FM,我们从标准的IDOC FM “BAPI_IDOC_INPUT1”复制一个我们自己的,逻辑我们自己写,只取其参数,代码如下。(具体创建FM的方式略)
function zflowtest.
*"----------------------------------------------------------------------
*"*"Local interface:
*" 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
*"----------------------------------------------------------------------
data: gt_zflowdb type zflowdb occurs 0 with header line,
gt_zflow type zflow occurs 0 with header line.
* SET RETURN_VARIABLES VALUE
read table idoc_contrl index 1.
return_variables-doc_number = idoc_contrl-docnum.
return_variables-wf_param = 'Procesd_IDOCs'.
append return_variables.
* SET IDOC_STATUS VALUE.
clear idoc_status.
idoc_status-status = '53'.
idoc_status-docnum = idoc_contrl-docnum.
idoc_status-repid = sy-repid.
append idoc_status.
* READ EDIDD
loop at idoc_data.
ca idoc_data-gnam.
when 'ZFLOW'.
move idoc_data-sdata to gt_zflow.
endca.
append gt_zflow.
endloop.
* PROCESSING DATA
loop at gt_zflow.
gt_zflowdb-bukrs = gt_zflow-bukrs.
gt_zflowdb-gjahr = gt_zflow-gjahr.
gt_zflowdb-wrbtr = gt_zflow-wrbtr.
append gt_zflowdb.
endloop.
inrt zflowdb from table gt_zflowdb.
endfunction.
创建接受数据的数据表ZFLOWDB:
将刚创建的FM添加到进站函数模块列表中(BD51)
下面我们开始创建进站处理代码:(WE42)
定义逻辑信息:
10. 分配FM到消息和IDOC类型(WE57)
11. 维护伙伴参数文件(WE20)
12. 在发送端服务器新建一下程序,执行:
report ztestidoc .
data: g_idoc_ctl like edidc,
g_zflow like zflow.
data: gi_ret_ctl like edidc occurs 0,
gi_idoc_data like edidd occurs 0 with header line.
* BUILD IDOC_CTL RECORD
perform build_idoc_ctl.
* BUILD ICOC_SEGMENT DATA
perform build_idoc_g.
* CALL FUNCTION AND CREATE IDOC
perform create_idoc.
*&---------------------------------------------------*
*& Form CREATE_IDOC
*&---------------------------------------------------*
* text
*----------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------*
form create_idoc.
call function 'MASTER_IDOC_DISTRIBUTE'
exporting
master_idoc_control = g_idoc_ctl
* OBJ_TYPE = ''
* CHNUM = ''
tables
communication_idoc_control = gi_ret_ctl
master_idoc_data = gi_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
.
if sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
el.
commit work.
endif.
endform. " CREATE_IDOC
*&---------------------------------------------------*
*& Form BUILD_IDOC_CTL
*&--------------------------------------------------*
* text
*----------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------*
form build_idoc_ctl.