开发环境: S4 HANA 1809,Process Orchestration 750, SoapUI Pro 5.1.2.
SAP IDOC协议,很老的东西了,记得2001年项目上就听说过,在比较老的系统上,使用很广泛,一直没机会接触,这次终于开始深入的了解。
IDOC在协议中所处的位置:IDOC底层是基于RFC(SOCKET长连接),可以说,IDOC其实就是一种RFC的高级应用,SAP在RFC的基础上提供了一整套封装的功能,来实现用IDOC传输和处理数据。
计划实现下面的例子,IDOC入站,IDOC出站:
我们先开始第一个接口JKT001(入站,外围程序传数据给SAP)。
一、IDOC在SAP端的配置如下:
1、WE31 定义段
2、WE30 定义段的基本类型 BASIC TYPE
3、WE81 定义message类型
4、WE82 绑定上面的基本类型与消息类型
5、建一个自己的处理函数
6、BD51 设置一下这个函数
7、WE57 绑定基本类型、消息类型、函数名称
8、WE42 定义入站的处理逻辑(由自己的函数模块处理)
9、WE20 设置错误消息
二、IDOC在SAP端的调试:
1、WE02中可以看到全部IDOC的消息记录
2、WE19中可以发起IDOC的数据包测试,输入这个ID,执行,改里面的报文数据,点“标准入站”测试。
三、IDOC入站方式中自己的函数:
在IDOC的配置中,在ABAP层,需要有一个自己的函数,处理接到的报文消息,我们看看这个自己函数的处理逻辑:
1、函数输入1:IDOC_CONTRL内表,该表存放IDOC相关的控制信息(DOCNUM)
2、函数输入2: IDOC_DATA内表,存放IDOC的数据(DOCNUM)
3、自己程序用上面的数据,保存到自己的表中
4、函数输出: IDOC_STATUS内表,存放这个函数调用完成后的状态和消息
这个函数入口参数的格式是SAP规定好了的,我们只要遵从这些数据格式就可以直接使用,我们仔细看看这个函数的入口和出口参数:
*"*"本地接口:
*" 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
为了便于理解,我把何喜同学的标准函数改了一个最简化版的IDOC入站函数,把传入系统的数据(物料和物料描述2个字段,放到自己的表里):
TABLES ZJKT001T.
DATA GS_ZJKT001T LIKE ZJKT001T.
LOOP AT IDOC_DATA.
GS_ZJKT001T = IDOC_DATA-SDATA.
INSERT ZJKT001T FROM GS_ZJKT001T.
IF SY-SUBRC EQ 0.
COMMIT WORK AND WAIT .
IDOC_STATUS-DOCNUM = IDOC_DATA-DOCNUM.
IDOC_STATUS-STATUS = '53'.
IDOC_STATUS-MSGTY = 'S'.
IDOC_STATUS-MSGV1 = '保存数据成功'.
ELSE.
ROLLBACK WORK .
IDOC_STATUS-DOCNUM = IDOC_DATA-DOCNUM.
IDOC_STATUS-STATUS = '51'.
IDOC_STATUS-MSGTY = 'E'.
IDOC_STATUS-MSGV1 = '保存数据错误'.
ENDIF.
APPEND IDOC_STATUS TO IDOC_STATUS.
ENDLOOP.
OK,用WE19发一条测试数据,哦,保存到了自己的透明表里。
以上 S4端的IDOC配置完毕。
下面我们开始PO上的配置,这是我们的概念图,IDOC是单向的,异步模式,所以我们在常规的同步双向配置中,可以省略好多配置。
有了基本概念,实际配置其实比较简单,我是参考的网上文章:PI-AAE-IDOC(SOAP2IDOC)EC.pdf :
第一步,把S4里的IDOC函数导入进来(这是S4方的数据)
第二步,建DT、MT、SI(这是外围系统方的数据定义):
注意这个outbound概念,我理解了一年时间,终于画出了上面的概念图,至此PO无惑。
第三步,建一个MM、一个OM:
MM这里就是IDOC最麻烦的地方了,参考的网上文章:PI-AAE-IDOC(SOAP2IDOC)EC.pdf,十几个IDOC的控制字段全部要赋值。
OM单向的,这里也要注意,何喜同学配了一天没通也是在这里,注意右边的Target, 需要把从S4引用的IDOC对象,拖过来:
最后在IB里的配置:
S4方的CC接收通道参数:
外围系统方的CC发送通道参数,最节约人天的WebSercice SOAP协议:
最后的IC配置:
全部完成,我们测试一下数据,S4收到了数据,并存到了我们的自定义表中: