ERP英才网

当前位置: 主页> SAP ERP > Basis&开发

[转帖]IDOC 概数作者:sas 2011-8-1 20:27:00

IDoc是 SAP 提供系统集成专用的数据/消息格式。它几乎可以传送任何 SAP 应用数据。IDocs以文本字符为基础,因而编制方便。IDocs中的信息从记录类型上分为控制记录、数据记录和状态记录3种。控制纪录主要是文本信息,如IDoc, 类型、发送/接收方信息以及文本标识;数据纪录为管理和实际数据部分;状态纪录用来追踪文本传递各点的状态,如状态码、系统时间、错误标识等。
功能:向外部系统发送数据从外部接收数据。
创建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 配置伙伴,

IDOC实例, Inbound IDOC


这里将继续沿用上篇文章的例子,讲述I02对接收到的采购订单信息进行的相关处理。

1,创建IDOC Type和Message Type.
与上篇Outbound Idoc中的前两个步骤完全一样。

2,创建一个function:Y_IDOC_PO_PROCESS.
当IDOC设置完毕之后,SAP可以自动调用该Funtion Module处理IDOC。所以这个函数的接口都是规范的。
下面步骤中将介绍的tcode:BD51中可以查询到很多Inbound Function,比如IDOC_INPUT_BBP_IV,可参照创建我们的接口。
接下来就可以写入我们的代码,根据IDOC内容,创建相应的销售订单。为了简化,这里我们仅仅将其存到数据库表里面,请先创建两个表Y02_POHEAD和Y02_POITEM,字段参考WE31中的YPOHEAD和YPOITEM。然后写入下面代码:

DATA: lv_subrc LIKE sy-subrc,
ls_chead TYPE ypohead,
ls_citem TYPE ypoitem,
ls_pohead TYPE y02_pohead,
lt_poitem TYPE TABLE OF y02_poitem WITH HEADER LINE.

CLEAR idoc_contrl.
READ TABLE idoc_contrl INDEX 1.
IF idoc_contrl-mestyp <> 'YPO'.
RAISE wrong_function_called.
ENDIF.
LOOP AT idoc_contrl.
CLEAR: ls_pohead, lt_poitem[].
LOOP AT idoc_data WHERE docnum = idoc_contrl-docnum.
CASE idoc_data-segnam.
WHEN 'YPOHEAD'.
CLEAR: ls_chead, ls_pohead.
ls_chead = idoc_data-sdata.
MOVE-CORRESPONDING ls_chead TO ls_pohead.
WHEN 'YPOITEM'.
CLEAR: ls_citem, lt_poitem.
ls_citem = idoc_data-sdata.
MOVE-CORRESPONDING ls_citem TO lt_poitem.
APPEND lt_poitem.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
lv_subrc = 0.
_inserty02_pohead FROM ls_pohead.
IF sy-subrc = 0.
_inserty02_poitem FROM TABLE lt_poitem.
lv_subrc = sy-subrc.
ELSE. "订单号已经存在
lv_subrc = sy-subrc.
ENDIF.
IF lv_subrc = 0.
COMMIT WORK.
CLEAR idoc_status.
idoc_status-docnum = idoc_contrl-docnum.
idoc_status-status = '53'. "IDOC处理成功
APPEND idoc_status.
ELSE.
ROLLBACK WORK.
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.

3,在BD51中注册我们的Function Module.
在编辑状态下,点击New Entries,填入函数名Y_IDOC_PO_PROCESS,Input Type=1即可。

4,在WE57中将Function Module与IDOC Type/Message Type关联
点击New Entries,Function Module输入Y_IDOC_PO_PROCESS,其下的Type填写F;IDOC Type下的Basic Type填写YPOIDOC;Message Type填写YPO;Direction填写2(Inbound)。

5,WE42,创建Inbound Process Code.
注意该步骤必须在BD51和WE57之后,否则将出现错误提示。
创建新条目,Process Code输入YPC_PO,在Option ALE下选择Processing with ALE service,在Processing Type下选择function module。保存后,在随后的窗口中,输入Inbound Module为Y_IDOC_PO_PROCESS。

6,WE20,维护Partner Profiles.
首先确保SALE中已经维护好了对应于接收方的Logical System,假设名称为I04LS。
(WE05查看您的Inbound IDOC, 均可看到其Partner名称,这就是我们所需要的。)
本步骤与上篇的WE20类似,不同的是,这里是维护从I04LS过来的Inbound Parameters。
Message Type输入YPO,Process Type输入YPC_PO,然后选中"Trigger immediately"即可。

7,至此,我们的设置已经完毕。系统接收到从I04传来的IDOC后即会立刻处理。
同时,各位针对上篇做过练习的朋友,系统中应该会遗留几个处于出错状态的IDOC吧?可以用BD87,在主界面上选中结点YPO后,点击Process按钮,一次性处理。处理前,顺便在SE37中打开Y_IDOC_PO_PROCESS并设置几个断点即可调试。

补充:
(1)如果状态码为56,则应该是您的WE20没设置好;
(2)由于上面代码中控制了不能插入同样的采购单号,所以只有一个Inbound IDOC将处理成功(状态码53),其余将失败(状态码51)。只要新发送的IDOC赋于不同的采购单号即可避免。
(3)Outbound的状态码是0-50,03代表OK;Inbound的状态码则是50-99,53代表OK。

IDOC实例, Outbound IDOC


最近群里的兄弟对IDOC的学习热情高涨,所以我在这里做个最简单的IDOC例子,供大家分享。
简而言之,IDOC是类似XML的一种SAP系统与其他系统的一种集成工具。
假设I04和I02是同一个集团下两个不同子公司的SAP系统,I04需要将其采购订单信息及时发送给I02。下面简单介绍IDOC的设置步骤,为了避免混淆,我的命名都比较特别。

1,设置IDOC Type.
(1) WE31,创建segment,类似于创建XML的结点及结点属性。
这里先输入YPOHEAD,点击创建,在接下来的屏幕中,录入EBELN, BUKRS, BEDAT等字段及他们对应的data element;接着创建YPOITEM,输入EBELN, EBELP, MATNR, MENGE, MEINS等字段及他们对应的data element。
保存后用SE12查看你将发现,系统自动添加了YPOHEAD和YPOITEM两个结构,每个字段都成了CHAR类型,长度就是WE31中的EXPORT LENG。
(2) WE30, 创建IDOC Type,定义结点间的相互逻辑关系.
先输入YPOIDOC,然后点击创建,紧跟着点击create new进入。在主界面中,先点击创建按钮,将YPOHEAD添加,设置Mandatory seg打勾,min = 1, max = 1,代表我们每个IDOC仅包含一张采购订单。然后在YPOHEAD下添加YPOITEM,同样的Mandatory seg打勾,min = 1, max = 99999.

2,创建Message Type.
(1) WE81,创建Message Type.
先切换到编辑状态,然后点击New Entries,输入YPO即可。
(2) WE82,,关联Message Type和IDOC Type.

3,创建到I02的端口.
首先确保系统内已经有到I02的R/3 Connection(SM59),如果没有则先创建一个名为I02001。
接着WE21创建Port,类型TRANSACTIONAL RFC,名为I02PORT,RFC destination则填写I02001。

4,SALE,创建Logical System.
SALE, Sending and Receiving Systems,Logical Systems, define logical systems,新增一个logical system,名为I02LS,这将作为下一步的Partner。
Define logical systems下方,有Assign Client to logical system,这里可针对本系统(I04)定义logical system,作为发送IDOC时的发送方标识,我对Client 001的定义是I04LS.

5,WE20,定义我们的Partner profile.
在PARTNER TYPE为logical system下,创建一个patner no为I02LS的partner,type填写LS。
下面的Permitted agent,填写US(User),Agent为你自己的用户名或某basis人员用户名。
然后,点击outbound下方的加号,创建一个outbound parameter。Message Type为YPO,receiver port为I02PORT,output mode选择transfer idoc immed.,Basic Type填写YPOIDOC,保存即可。

6,编程发送IDOC
设置了这么多,真累啊,总算可以写程序了,是不是很开心呢?
程序的思路就是,把每个IDOC结点按字符串形式逐个添加,而字符串的添加次序自然也体现了IDOC结点间的逻辑关系。代码如下,
DATA: ls_pohead TYPE ypohead,
ls_poitem TYPE ypoitem,
ls_edidc TYPE edidc,
lt_edidc TYPE TABLE OF edidc,
lt_edidd TYPE TABLE OF edidd WITH HEADER LINE.

CLEAR ls_edidc.
*系统根据下面4行即可与WE20设置关联起来
ls_edidc-mestyp = 'YPO'. "Message Type
ls_edidc-idoctp = 'YPOIDOC'. "IDOC Type
ls_edidc-rcvprn = 'I02LS'. "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 = '0400'.
ls_pohead-bedat = '20090630'.
lt_edidd-sdata = ls_pohead. "结点内容
APPEND lt_edidd.

CLEAR lt_edidd.
lt_edidd-segnam = 'YPOITEM'.
lt_edidd-dtint2 = 0.
CLEAR ls_poitem.
ls_poitem-ebeln = '4001122334'.
ls_poitem-ebelp = '0001'.
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'.
lt_edidd-dtint2 = 0.
CLEAR ls_poitem.
ls_poitem-ebeln = '4001122334'.
ls_poitem-ebelp = '0002'.
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'
EXPORTING
_master_idoc_control = ls_edidc "Export
TABLES
communication_idoc_control = lt_edidc "Import
_master_idoc_data = lt_edidd "Export
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.

7,查看IDOC.
WE05可以查看我们刚刚发送的IDOC, BD87还可对IDOC进行一些处理。

IDOC实例,消息方式的IDOC


在系统中,我们经常可以看到EDI方式的输出,与打印输出类似。下面我们基于文章"IDOC实例,Outbound IDOC"的基础上,简单讲解这种方式的IDOC输出。

1,创建一个function:Y_IDOC_PO_SEND.
这是我们的Outbound Funtion Module,用来创建IDOC的内容。同样的,该函数的接口都是标准的。
下面将要介绍的tcode WE41中可以查看系统已有的同类函数,可以参照设置我们的函数接口。然后写入如下代码:

DATA: ls_pohead TYPE ypohead,
ls_poitem TYPE ypoitem,
ls_ekko TYPE ekko,
lt_ekpo TYPE TABLE OF ekpo WITH HEADER LINE.

* control_record_out
CLEAR control_record_out.
MOVE control_record_in TO control_record_out.
* control_record_out-mestyp = 'YPO'. "Message Type
* control_record_out-idoctp = 'YPOIDOC'. "IDOC Type
control_record_out-direct = '1'.
control_record_out-serial = sy-datum.
control_record_out-serial+8 = sy-uzeit.

* Read from ekko/ekpo
CLEAR ls_ekko.
_selectSINGLE *
INTO ls_ekko
FROM ekko
WHERE ebeln = object-objky(10) "采购单号
AND loekz = space.
IF sy-subrc <> 0.
RAISE error_message_received.
ENDIF.
REFRESH lt_ekpo.
_select*
INTO TABLE lt_ekpo
FROM ekpo
WHERE ebeln = ls_ekko-ebeln
AND loekz = space.

* INT_EDIDD
CLEAR int_edidd.
int_edidd-docnum = control_record_out-docnum.
int_edidd-segnam = 'YPOHEAD'."结点名称
int_edidd-dtint2 = 0.
CLEAR ls_pohead.
ls_pohead-ebeln = ls_ekko-ebeln.
ls_pohead-bukrs = ls_ekko-bukrs.
ls_pohead-bedat = ls_ekko-bedat.
int_edidd-sdata = ls_pohead. "结点内容
APPEND int_edidd.
LOOP AT lt_ekpo.
CLEAR int_edidd.
int_edidd-docnum = control_record_out-docnum.
int_edidd-segnam = 'YPOITEM'.
int_edidd-dtint2 = 0.
CLEAR ls_poitem.
ls_poitem-ebeln = lt_ekpo-ebeln.
ls_poitem-ebelp = lt_ekpo-ebelp.
ls_poitem-matnr = lt_ekpo-matnr.
ls_poitem-menge = lt_ekpo-menge.
ls_poitem-meins = lt_ekpo-meins.
int_edidd-sdata = ls_poitem.
APPEND int_edidd.
ENDLOOP.

2,WE41, 创建Outbound Process Code
进入编辑状态后,选择“添加新条目”按钮,创建YPOSEND,对应于新建的Y_IDOC_PO_SEND。
选中下面的Process with ALE Service,代表创建Outbound IDOC后自动发送给接收方。

3,NACE/NACO,创建我们的输出类型
创建一个EDI类型的输出,Program填写RSNASTED,Form Routine填写EDI_PROCESSING。
当然我们也可以在这里找一个已有的EDI输出类型做测试,比如Application EF下的XX01。

4,WE20设置Partner Profile.
前两篇文章中,我们并没有要求填写Partner function,不过这次必须填写了。
Partner function是从属于partner type下面的,这个逻辑关系在表TPAR中体现。
假设我们选中partner type=LS,Partner function=LS。其维护与之前的类似,点击加号添加一个Outbound Parameter,步骤与之前类似,不过必须记得在Message Control中添加一行,Application=EF,Message Type=XX01,Process code为YPOSEND。这里EF和XX01与上面NACO中的定义对应。

5,发送IDOC
事实上,我们已经定义完毕了,可以维护某采购订单的输出类型来发送IDOC了。
为了大家能更好的理解,我们来模仿这个输出过程。创建新程序,写入:

TABLES: nast.
DATA: rcode TYPE i.

CLEAR nast.
nast-kappl = 'EF'.
nast-objky = '4014000182'. "采购单号
nast-kschl = 'XX01'.
nast-parnr = 'I02LS'. "Partner number
nast-parvw = 'LS'. "Partner function
PERFORM edi_processing(rsnasted) USING rcode 'X'.
IF rcode IS INITIAL.
COMMIT WORK. "发送IDOC到接收方
ENDIF.

上面的方法并不会在NAST留下输出记录。如果您希望能在NAST中留下一条记录,则应该这样:
TABLES: nast.
DATA: rcode TYPE i.

CLEAR nast.
nast-kappl = 'EF'.
nast-objky = '4014000182'.
nast-kschl = 'XX01'.
nast-parnr = 'I02LS'.
nast-parvw = 'LS'.
nast-spras = sy-langu.
nast-erdat = sy-datum.
nast-eruhr = sy-uzeit.
nast-nacha = '6'. "EDI
nast-anzal = 0.
nast-usnam = sy-uname.
PERFORM einzelnachricht(rsnast00) USING rcode.
IF rcode IS INITIAL.
COMMIT WORK. "发送IDOC到接收方
ENDIF.

下面这种方式同样可用于触发其他方式的输出类型,比如打印输出。





秋风吹渭水,落叶满长安。

评论

<blockquote style='BORDER-RIGHT: #cee7ef 1px solid; PADDING-RIGHT: 8px; BORDER-TOP: #cee7ef 1px solid; PADDING-LEFT: 8px; FONT-SIZE: 12px; PADDING-BOTTOM: 3px; MARGIN: 1.12em 0px 1.12em 40px; BORDER-LEFT: #cee7ef 4px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #cee7ef 1px solid; BACKGROUND-COLOR: #f7fbff;'><br/>引用 sas 发表于 2011-8-1 20:27:00 的话<br/>IDoc是 SAP 提供系统集成专用的数据/消息格式。它几乎可以传送任何 SAP 应用数据。IDocs以文本字符为基础,因而编制方便。IDocs中的信息从记录类型上分为控制记录、数据记录和状态记录3种...</blockquote><br/>


发布者:匿名用户 发表于 2014-4-21 5:36:00
1楼博客 | 引用回复 | 加为好友 | 发信
<blockquote style='BORDER-RIGHT: #cee7ef 1px solid; PADDING-RIGHT: 8px; BORDER-TOP: #cee7ef 1px solid; PADDING-LEFT: 8px; FONT-SIZE: 12px; PADDING-BOTTOM: 3px; MARGIN: 1.12em 0px 1.12em 40px; BORDER-LEFT: #cee7ef 4px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #cee7ef 1px solid; BACKGROUND-COLOR: #f7fbff;'><br/>引用 sas 发表于 2011-8-1 20:27:00 的话<br/>IDoc是 SAP 提供系统集成专用的数据/消息格式。它几乎可以传送任何 SAP 应用数据。IDocs以文本字符为基础,因而编制方便。IDocs中的信息从记录类型上分为控制记录、数据记录和状态记录3种...</blockquote><br/>


发布者:匿名用户 发表于 2014-4-21 8:03:00
2楼博客 | 引用回复 | 加为好友 | 发信
<blockquote style='BORDER-RIGHT: #cee7ef 1px solid; PADDING-RIGHT: 8px; BORDER-TOP: #cee7ef 1px solid; PADDING-LEFT: 8px; FONT-SIZE: 12px; PADDING-BOTTOM: 3px; MARGIN: 1.12em 0px 1.12em 40px; BORDER-LEFT: #cee7ef 4px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #cee7ef 1px solid; BACKGROUND-COLOR: #f7fbff;'><br/>引用 sas 发表于 2011-8-1 20:27:00 的话<br/>IDoc是 SAP 提供系统集成专用的数据/消息格式。它几乎可以传送任何 SAP 应用数据。IDocs以文本字符为基础,因而编制方便。IDocs中的信息从记录类型上分为控制记录、数据记录和状态记录3种...</blockquote><br/>


发布者:匿名用户 发表于 2014-4-29 16:32:00
3楼博客 | 引用回复 | 加为好友 | 发信
ultram vomiting - ultram para que sirve


发布者:匿名用户 发表于 2014-10-4 20:33:00
4楼博客 | 引用回复 | 加为好友 | 发信
4条 分1页 | 当前第1页 首页 上页 下页 尾页

您正在以 匿名用户 的身份发表评论   回复(可包含附件、图片)我要评论

sas

等级助理
级别:助理
文章:198
信用:448
金币:622
城市:西安

关于我们    联系我们    隐私保护   

 

 ERP英才网版权所有 ©2006-2010  联系电话:0755-27395626   传真:0755-26435051; eMail:service@erpjob88.com 备案序号:粤ICP备1307987号