IDoc step by step (转)

http://blog.csdn.net/liangziyisheng/article/details/7402239

创建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 配置伙伴。

----------------------实例 ------------------------------------------------

Outbound 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. Define logical systems,新增一个logical system,名为I02LS,这将作为下一步的Partner。再定义一个本系统(I04)的一个logical system I04LS,在Define logical systems下方,有Assign Client to logical system,我对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进行一些处理。

----------------------实例 ------------------------------------------------

Inbound Idoc

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.
  INSERT y02_pohead FROM ls_pohead.
  IF sy-subrc = 0.
    INSERT y02_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。

时间: 2024-08-13 12:32:37

IDoc step by step (转)的相关文章

Step by Step for configuration of sending customize IDOC/自定义IDOC发送配置

<div style="width: 600px; max-width: 100%; margin-bottom:5px;"><a href="https://docs.com/gan-gavin/6042/idoc-step-by-step-for-configuration-of-sending" title="自定义IDOC配置/Step by Step for configuration of sending customize

数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSGS算法中是要求a^m在%c条件下的逆元的,如果a.c不互质根本就没有逆元.) 如果x有解,那么0<=x<C,为什么? 我们可以回忆一下欧拉定理: 对于c是素数的情况,φ(c)=c-1 那么既然我们知道a^0=1,a^φ(c)=1(在%c的条件下).那么0~φ(c)必定是一个循环节(不一定是最小的)

Git Step by Step – (8) Git的merge和rebase

前面一篇文章中提到了"git pull"等价于"git fetch"加上"git merge",然后还提到了pull命令支持rebase模式,这篇文章就介绍一下merge和rebase之间有什么差别. 由于我们主要是想看看merge跟rebase之间的区别,这里就是用本地仓库的分支进行演示了. merge 其实在介绍分支的那篇文章中已经介绍过了一些分支merge的内容,这里就进行一些补充和总结. 下面我们基于本地一个仓库开始介绍,当前仓库的分支情

C# 2012 step by step 学习笔记8 CHAPTER 9 Creating Value types with enumerations and Structures

C# 2012 step by step 学习笔记8 CHAPTER 9 Creating Value types with enumerations and Structures things about 1. Declare an enumeration type. 2. Create and use an enumeration type. 3. Declare a structure type. 4. Create and use a structure type. 5. Explain

Linux Booting Process: A step by step tutorial for understanding Linux boot sequence

One of the most remarkable achievement in the history of mankind is computers. Another amazing fact about this remarkable achievement called computers is that its a collection of different electronic components, and they work together in coordination

C++开发WPF,Step by Step

示例代码 使用C++来开发WPF,主要是如何在MFC(Win32)的窗口中Host WPF的Page.下面我就做个详细的介绍. 一.创建工程, 由于MFC的Wizard会生成很多用不到的代码,所以我准备从一个空的工程开始创建一个MFC的工程. a)         打开VS2005,菜单File->New->Projects-, 左面选择Visual C++->Win32,右面选择Win32 Console Application,给工程起个名字CPlusPlus_WPF, Ok进入下一

数据库设计 Step by Step (1)——扬帆启航

引言:一直在从事数据库开发和设计工作,也看了一些书籍,算是略有心得.很久之前就想针 对关系数据库设计进行整理.总结,但因为种种原因迟迟没有动手,主要还是惰性使然.今天也算是痛下决心开始这项卓绝又令我兴奋的工作.这将是一个系列的文 章,我将以讲座式的口吻展开讨论(个人偷懒,这里的总结直接拿去公司培训新人用). 系列的第一讲我们先来回答下面几个问题 数据库是大楼的根基 大多数程序员都很急切,在了解基本需求之后希望很快的进入到编码阶段(可能只有产出代码才能反映工作量),对于数据库设计思考得比较少. 这

数据库设计 Step by Step (2)——数据库生命周期

引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整,需要花很多时间整理.思考数据库设计的各种资料,所以文章的更新速度可能会慢一些,也希望大家能够谅解. 系列的第二讲我们将站在高处俯瞰一下数据库的生命周期,了解数据库设计的整体流程 数据库生命周期 大家对软件生命周期较为熟悉,数据库也有其生命周期,如下图所示. 图(1)数据库生命周期 数据库的生命周期

Shell Step by Step (3) —— Stdin &amp;amp; if

4.输入输出 #! /bin/bash # Read users input and then get his name read -p "Please input your first name: " firstName read -p "Please input your last name: " lastName echo -e "Your full name is: $firstName $lastName" read使用方法: read

WPF Step By Step 自定义模板

WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现的方案和最终的运行效果. 本文大纲 1.控件模板及数据模板 2.ListBox深度定制模板. 3.TreeView高级模板使用实例. 控件模板及数据模板 控件模板 什么是控件模板,指定可以在控件的多个实例之间共享 Control 的可视结构和性能方面的方面.控件模板其实就是我们在可视方面的自定义模板