浅谈IDOC原理与机制(一)
这里不讨论IDOC具体的创建过程,仅说原理及机制。
1.IDOC的两个特点:面向消息;异步;
2.IDOC的两种应用:
ALE:是面向于同一个公司不同的系统;
EDI:是面向于不同公司;
3.IDOC发送数据的流程:
创建凭证---> 产生IDOC---> 检查合作伙伴及端口--->发送数据。
详细如下:
产生IDOC: 对于outbound来说,首先要做合作伙伴信息的建立,WE20;
定义message type。
在进行端口及output mode、idoc type的设置
对于OUTBUT MODE,如果选择transfer idoc immed,会立即产生IDOC文件;如果是COLLECT IDOCS,则是先收集,然后通过作业来实现idoc的产生,作业名是:RSNAST00;
IDOC TYPE中的extension是对标准的idoc type没有的字段进行增加,VIEW是可以选择自己需要的段,减少数据的传输。
使用标准的MESSAGE TYPE,需要定义MESSAGE CONTROL,TCODE是:NACE.需要业务类型,点击“OUTPUT TYPES”.
4. 对于INBOUND 来说,流程是:外系统发送文件----> 在SAP中检查端口、合作伙伴,生产IDOC---->处理IDOC文件。
5.IDOC RECORD TYPES用三部分组成:CONTROL RECORD(idoc id,partner、idoc type and logical message、external structure) 、DATA RECORDS(segment) 、
STATUS RECORDS(idoc id,status information)。
6.IDOC TYPE 和MESSAGE TYPE的区别,可以理解为IDOC TYPE 确定了数据的结构;MESSAGE TYPE 定义了 process code
对于inbound中的PROCESSING BY FUNCTION MODULE的如果选择TRIGGER BY BACKGROUND PROGRAM的话,也需要安排后台作业进行执行,RSEINB00和RBDAPP01
IDOC TYPE 和MESSAGE TYPE的设置tcode为:WE81/WE82
7. 对于增强部分,主要是在process code的函数中找到相应的customer user exit。
8.自定义MESSAGE TYPE ,需要在function注意:四部分:
* check if the function is called correctly *
DATA: P_SQL_NO(9) TYPE N,P_LIFEX LIKE LIKP-LIFEX,
GDF_LFIMG TYPE ZHJS_EDI_KBETR.
READ TABLE IDOC_CONTRL INDEX 1.
IF SY-SUBRC <> 0.
EXIT.
ELSEIF IDOC_CONTRL-MESTYP <> 'Z_GDSRECPT'.
RAISE WRONG_FUNCTION_CALLED.
ENDIF.
LOOP AT IDOC_CONTRL.
REFRESH:GT_ITAB.
* select segments belonging to one IDoc *
REFRESH T_EDIDD.
LOOP AT IDOC_DATA WHERE DOCNUM = IDOC_CONTRL-DOCNUM.
APPEND IDOC_DATA TO T_EDIDD.
ENDLOOP.
REFRESH T_EDIDD1.
APPEND LINES OF T_EDIDD TO T_EDIDD1.
* through all segments of this IDoc *
CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS = 1.
PERFORM GET_SEQ_NO USING IDOC_CONTRL-SNDPRN CHANGING P_SQL_NO.
GDF_ERDAT = SY-DATUM.
LOOP AT T_EDIDD INTO IDOC_DATA.
CASE IDOC_DATA-SEGNAM.
WHEN 'Z_EDI_SEG_GDSRECPT_BD'.
E1BP_PTP02 = IDOC_DATA-SDATA.
******************
* 返回消息.
CLEAR IDOC_STATUS.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-MSGTY = 'S'.
IDOC_STATUS-MSGID = 'ZHJS_EDI'.
IDOC_STATUS-MSGNO = '000'.
* IDOC_STATUS-APPL_LOG = RETN_INFO-LOG_NO.
IDOC_STATUS-MSGV1 = 'Table has been updated successfully'.
* IDOC_STATUS-MSGV2 = RETN_INFO-MESSAGE_V2.
* IDOC_STATUS-MSGV3 = RETN_INFO-MESSAGE_V3.
* IDOC_STATUS-MSGV4 = RETN_INFO-MESSAGE_V4.
IDOC_STATUS-REPID = SY-REPID.
IDOC_STATUS-STATUS = '53'.
APPEND IDOC_STATUS.