天天看点

IDoc是个什么玩意儿

作者:​​SD模块那些事儿​​

还是说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要做的事情,提供原始数据

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等方式来做了。