IDoc是个什么玩意儿

愚蠢的博主写了一段博文,然后开了一个选项卡去找东西,找完东西忘记了要写博文,于是把浏览器Alt+F4了……
还是说IDoc吧。博主从刚入行没多久,就听说过这个东西,因为听说了很久,一直没机会见到,所以感觉那是超级神秘。直到博主在项目上见到了IDoc,然后从相识、到相知、然后……额,扯远了。
IDoc是Intermediate Document的缩写,这个去谷姐度娘一下就知道了,但是即便知道了它名字的意思,仍然没法了解它是干什么的。所以干脆也不要去研究它的名字,就认为它的名字就是这4个字母就好了。
想必大家都接触过一个用来比喻ERP的例子,就是买菜做饭那个(什么,你没听说过?度娘一下)。博主也不能免俗,也举个吃的例子,比如一家面包房。
如何得到一块蛋糕呢?
首先采购员要采购原材料,水、面粉、奶油、鸡蛋、盐、糖……
配料师要准备本次需要用到的原材料,水、面粉、奶油、鸡蛋……
然后做面点师用这些材料做了一个蛋糕出来。
嗯,IDoc就是这样。谢谢大家。








好吧其实博主还没说完。
采购员一次采购可能采购很多东西,因为面包房的产品有很多种,面包、蛋糕、饼干甚至还有咖啡,采购员一次或者几次要把他们都采购回来。
配料师首先要确定做什么,然后根据要做的东西从原材料里面选择本次需要的东西以及数量。
面点师拿到这些原材料,首先也得知道要做什么,然后他开始使用这些材料做他要做的东西。
嗯,这才是IDoc。





内个……咱们继续说哈。

IDoc的流程跟面包房做面包的流程十分相似。它分为出站Outbound和入站Inbound两种。如果在SAP里面完整的做一个出站+入站的话是这么处理的:
首先通过单据中的Output Type,配合Partner Profile里面配置的Partner里面Outbound Parameter里面的Outbound Process Code,使用对应的Message Type往对应的Port里面发送一个IDoc Basic Type结构类型的数据。
然后入站将根据这个Message Type,找到Partner Profile里面配置的Partner里面Inbound Parameter里面的Inbound Process Code,处理这个收到的IDoc Basic Type结构里面的数据。
绕晕了没?没事,反正也没打算让人看懂上面那段 [转载]IDoc是个什么玩意儿。主要是为了引出这么几个概念。
Outbound/Inbound:出站和入站。出站是为了处理数据并发出消息,入站是为了接收消息并处理。对于面包房,我们把从采购到配料认为是出站,面点师加工面包、蛋糕出来认为是入站。
Partner: 就是跟你对口的合作伙伴,在SAP里面,主要用到KU-客户,LI-供应商,LS-逻辑系统。对于面包房,配料师就是一个出站用的Partner、面点师是入站用的一个Partner。当然一个Partner可以既做出站也做入站。就好比配料师跟面点师是同一个人。
Partner Profile:就是Partner的一些参数,分为Outbound Parameter和Inbound Parameter。它们是为了让系统知道怎么去处理Outbound/Inbound的事件。对于面包房来说,就是采购员、配料师、面点师的操作流程和操作方法(当然对于实际的他们而言,这些只要在脑子里面体现就好了,但是系统需要一个逻辑,这个逻辑就是Partner Profile)
Port:端口,指定这个IDoc的接收方,可以是任何其他系统,也可以发到当前的SAP当前的Client。对于面包房来说,每个面点师就是一个端口。当然他们也作为入站的Partner存在。
Output Type: 这个其实如果做过标准的凭证打印都应该知道,这个是从凭证获取一些信息并通过某种途径发出。对于IDoc,可以使用EDI方式发出,也可以使用其它方式,比如Special Function方式发出。系统标准的IDoc都是通过EDI方式发出的。Output Type仅用于Outbound Process,目的是提供IDoc所需的数据。在面包房里面,它相当于一次采购拿回来的东西,如:5斤面粉、2桶花生油等。
IDoc Basic Type: 是承载数据的一个类型,可以认为是一个数据结构。Basic Type由Segment构成,有点类似于XML的格式。每个Segment指定了一些字段,在这些字段里面可以输入一些限定的数据。对于面包房来说,这个就是需要的材料清单:比如面粉+黄油+奶油+糖,是一种组合,面粉+奶酪+盐是另外一种组合等。每种组合都可以理解成是一个IDoc Basic Type。而每种组合的一个具体的值,就是一个IDoc了。也就是说5斤面粉+20克黄油+50克奶油+50克糖,这就是一个IDoc了。但是这种组合是用来做什么,并不能通过IDoc Basic Type来确定。这需要Message Type.
Message Type:就是告诉Inbound一方,我这个IDoc是用来做什么的。只告诉对方干什么,却不给数据,或者只给了数据,却不告诉对方做什么,对方都没法进行处理。在面包房,Message Type就是告诉面点师,给你这些原料(IDoc)你是应该做蛋挞,还是老婆饼,还是法式面包等等。
Outbound Process Code:出站的处理代码。其实就是具体的一个操作流程。在得到了Output Type,确定了IDoc Basic Type以后,需要从Output Type提供的所有数据里面,按IDoc Basic Type组合出IDoc来,即给IDoc Basic Type赋值。在面包房,这就是配料师根据要做的面包,从所有原材料里面选出本次使用的原材料的过程。
Inbound Process Code:进站的处理代码。这个就是接收到一个IDoc以后,根据Message Type来确定要怎么处理这个IDoc。对于面包房,这就是面点师拿到配料师提供的原材料以后,根据要做的东西来进行面点制作的过程。

这样说下来好像就明白一些了?我们把做面包的过程放进SAP看看。
1.首先采购员采购到了一些原材料,并提供给了配料师 - 相当于Output Type要做的事情,提供原始数据
2.配料师(相当于是Outbound Partner)检索一下所有可以做的产品(Message Type),找到可以使用前一步中的原材料(Output type)来制作的那些产品。根据这些产品的要求(IDoc Type)来进行配料(Outbound Process Code) 
3.配料师配好料后(产生了IDoc),找到能做这个产品的面点师(这时仍属于Outbound Process,面点师在这对应Port),把配好的料发给他,并告诉他这个料是用来做什么(Message Type)。
4.面点师(这时就是相当于Inbound Partner了)收到这些料(IDoc)以及产品需求(Message Type),他就开始和面、发酵、烘烤……最后把这个产品做出来了。这个处理过程,就是Inbound Process Code。

应该大概有点头绪了吧?看下WE20的截图进一步了解下:


[转载]IDoc是个什么玩意儿

[转载]IDoc是个什么玩意儿

[转载]IDoc是个什么玩意儿

[转载]IDoc是个什么玩意儿

[转载]IDoc是个什么玩意儿

差不多就是这样了。博主再有时间的话,写一个IDoc的样例看一下,相信大家就有些概念了。

最后说几句。
IDoc可以有很多应用,Inbound/Outbound都是可以单独使用的,不要认为他们只能搭对出现。比如有外围系统审批,可以通过订单保存后触发Outbound IDoc,将订单信息发到审批系统。审批结束后,审批系统可以触发SAP的Inbound IDoc来解锁订单。
IDoc的一个特点是异步处理。也就是说,如果你想在订单保存以后,再根据订单里面的数据计算一下什么东西回头修改这张订单,是可以通过IDoc来实现的。如果你用用户出口来处理,会发生订单锁定没法修改的情况。如果是不需要实时同步校验或者实时返回结果的需求,都可以通过IDoc来处理。一旦是需要实时反馈的,那就需要用RFC等方式来做了。
IDoc的一个优点就是有一套完整的监控程序以及错误重新处理程序,所以如果可以通过IDoc实现的功能,最好考虑通过IDoc来实现,因为用其他手段来实现,可能需要考虑再开发Log记录、错误处理等配套程序,开发量大是一方面,有时候逻辑稍微复杂一些,自开发的程序稳定性也有待考量。
这次真的结束了。后面有机会再跟大家分享一些案例吧。
<think>我们正在讨论IDoc编号的生成步骤。根据之前的讨论,IDoc编号通常由编号范围对象`EDI_DOC`管理。现在,用户想知道IDoc编号在哪个处理步骤中生成。 根据SAP标准流程,IDoc编号是在IDoc创建时生成的。具体来说,当系统执行IDoc创建函数模块(例如`MASTER_IDOC_DISTRIBUTE`)时,会调用编号范围对象`EDI_DOC`来获取下一个可用的编号。 参考引用[2]中提到的程序`RBDMIDOC`(根据IDoc类型对修改过的数据生成IDoc)和`RBDSECRE`(手工触发供应商IDoc下传)等,这些程序在生成IDoc时都会涉及到编号分配。 具体生成步骤: 1. 当需要创建IDoc时(例如通过事务码WE19、程序RBDMIDOC、或者通过消息类型对应的出站处理等),系统会调用函数模块来创建IDoc控制记录(EDIDC)和数据记录(EDIDD)。 2. 在创建控制记录时,系统会通过编号范围对象`EDI_DOC`获取下一个编号,并赋值给EDIDC-DOCNUM。 关键函数模块: - `NUMBER_RANGE_ENQUEUE`:锁定编号范围(避免并发冲突) - `NUMBER_GET_NEXT`:获取下一个编号(从对象`EDI_DOC`) - `NUMBER_RANGE_DEQUEUE`:解锁编号范围 这些操作通常在函数组`EDI`的函数模块中封装,例如在`MASTER_IDOC_DISTRIBUTE`(用于分发主IDoc)中会调用上述逻辑。 因此,IDoc编号的生成发生在IDoc创建的初始阶段,即控制记录(EDIDC)被创建的时候。 回答结构: 1. 简要说明生成步骤。 2. 指出关键程序/事务码。 3. 说明编号范围对象。 4. 生成相关问题。 注意:用户之前的引用[1]和[2]提供了一些相关事务码和程序,但并没有直接说明编号生成步骤,因此需要结合SAP标准知识回答。</think>### IDoc编号生成步骤详解 IDoc编号在SAP系统中的生成发生在**IDoc创建阶段**,具体通过以下关键步骤实现: --- ### 1. **IDoc创建入口** - **核心程序**:`RBDMIDOC`(主IDoc生成程序) - **触发方式**: - 自动:通过Change Pointer(事务码`BD60`)捕获数据变更 - 手动:通过事务码`WE18`或`BD14`手动触发 - **关键操作**: 系统调用`MASTER_IDOC_DISTRIBUTE`函数模块创建IDoc框架结构[^2] --- ### 2. **编号分配核心逻辑** - **编号范围对象**:`EDI_DOC`(事务码`SNRO`管理) - **生成时机**: 在创建IDoc控制记录(EDIDC表)时立即分配编号: ```abap CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = '01' " 范围编号 object = 'EDI_DOC' " 范围对象 IMPORTING number = lv_docnum " 生成的IDoc编号 EXCEPTIONS interval_not_found = 1. ``` - **数据流向**: 生成的编号写入`EDIDC-DOCNUM`字段(控制记录主键)[^1] --- ### 3. **技术流程分解** ```mermaid graph TD A[IDoc触发] --> B{数据变更/手动请求} B -->|自动| C[Change Pointer捕获] B -->|手动| D[事务码 WE18/BD14] C & D --> E[执行 RBDMIDOC] E --> F[调用 MASTER_IDOC_DISTRIBUTE] F --> G[锁定编号范围 EDI_DOC] G --> H[获取下一可用编号] H --> I[写入 EDIDC-DOCNUM] I --> J[生成IDoc控制记录] ``` --- ### 4. **关键验证点** - **查看编号分配**: - 事务码`WE02` → 输入IDoc编号 → 检查`Basic type`和`Message type` - 表`EDIDC`中`DOCNUM`字段的生成序列 - **调试位置**: - 函数模块`MASTER_IDOC_DISTRIBUTE`中的`DOCNUM_ASSIGN`子例程 - 程序`RBDMIDOC`的`GENERATE_IDOCS`方法 --- ### 5. **异常处理机制** 当编号生成失败时(如范围耗尽): - 系统写入默认值`9999999999`到`EDIDC-DOCNUM` - 在IDoc状态记录中标记状态**51**(处理错误) - 可通过事务码`WPIA`重新处理错误IDoc[^1] --- ### 引用说明 [^1]: 事务码`WPIA`用于重新处理异常IDoc,当编号生成异常时可在此工具中重置状态。 [^2]: 程序`RBDMIDOC`是IDoc生成的核心驱动,调用`MASTER_IDOC_DISTRIBUTE`实现编号分配逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值