创建IDOC:
第一步:WE31 创建IDOC所包含的字段.
第二步:WE30 创建IDOC(基本类型) 把Segment分配给IDOC
第三步:WE81 创建信息类型
第四步:WE82 把IDOC类型与信息类型对应.
释放700是第一步WE31里面,点编辑-->释放请求编号,出来的版本700,即为释放700
第五步:为Client创建逻辑系统,T-CODE:SALE
第六步:SM59 Define a RFC connectionfor Idoc transfer
PROGRAM ID要跟目标系统协商好,不要造成冲突
输入名称及描述(名称最好跟你的逻辑系统名称一致,以便于自动生成partner profile),由于是相同的Instance,所以在Target Host这部分我不需要填。如果是不同的Instance,这里需要填上对端机器的机器名或IP,以及SAP系统号
第七步:BD64 在发送端创建Distribution Model
点执行,生成成功如下。
第八步:程序实现
REPORT ZIDOC_HMES_013_T2.
************************************************************************
*
* 程序名称:成本中心数据信息IDOC发布
***
TABLES: CSKS.
************************************************************************
* internal tables
************************************************************************
DATA: BEGIN OF WA_CSKS,
KOSTL LIKE CSKS-KOSTL,"成本中心
DATBI LIKE CSKS-DATBI,"有效截止日期
DATAB LIKE CSKS-DATAB,"开始生效日期
BUKRS LIKE CSKS-BUKRS,"公司代码
KOSAR LIKE CSKS-KOSAR,"成本中心类型
LTEXT LIKE CSKT-LTEXT,"成本中心描述
END OF WA_CSKS.
DATA IT_CSKS LIKE TABLE OF WA_CSKS.
DATA: WA_DATA LIKE ZHMES_CSKS,
IT_DATA LIKE TABLE OF WA_DATA.
DATA: WA_IDOC_DATA LIKE EDIDD,
IT_IDOC_DATA LIKE TABLE OF WA_IDOC_DATA.
************************************************************************
* internal data fields
************************************************************************
DATA: G_OBJECT_CLASS TYPE CDHDR-OBJECTCLAS VALUE 'KOSTL',
G_LAST_TIMESTAMP(15) TYPE C, "上次更新时间戮
G_NOW_TIMESTAMP(15) TYPE C. "这次更新时间戮
************************************************************************
* Parameters and Selection Options
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-001.
PARAMETERS:
P_LOGSYS LIKE TBDLST-LOGSYS OBLIGATORY DEFAULT 'ZHMES_T2', "逻辑系统
P_MESTYP LIKE TBDME-MESTYP DEFAULT 'ZHMES_T2' NO-DISPLAY, "消息类型
P_IDOCTP LIKE EDIDC-IDOCTP DEFAULT 'ZHMES_T2' NO-DISPLAY,"基本类型 WE30
P_SEGNA1 LIKE EDIDD-SEGNAM DEFAULT 'ZHMES_CSKS_T2' NO-DISPLAY."段类型
SELECT-OPTIONS:
S_KOSTL FOR CSKS-KOSTL MODIF ID SA."成本中心
PARAMETERS:
P_INCRE TYPE C AS CHECKBOX USER-COMMAND RAD_CLICK DEFAULT 'X'."是否自动增量
SELECTION-SCREEN END OF BLOCK BK1.
*
************************************************************************
* Initialization
************************************************************************
INITIALIZATION.
************************************************************************
* at selection screen
************************************************************************
AT SELECTION-SCREEN.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN .
IF SCREEN-GROUP1 = 'SA'." AND SCREEN-GROUP3 <> 'OPU' AND SCREEN-GROUP3 <> 'TXT'.
IF P_INCRE = 'X'.
FREE:S_KOSTL.
SCREEN-INPUT = '0' .
ELSE.
SCREEN-INPUT = '1' .
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
************************************************************************
* Event top of page
************************************************************************
TOP-OF-PAGE.
************************************************************************
* event Start of Selection
************************************************************************
START-OF-SELECTION.
"数据初始化
PERFORM FRM_INITIAL.
"获取数据
PERFORM FRM_SEL_DATA.
"处理数据
PERFORM FRM_DEL_DATA.
"发送IDOC
PERFORM FRM_IDOC_SEND.
************************************************************************
*EVENT End-of selection
************************************************************************
END-OF-SELECTION.
"日志输出处理
PERFORM FRM_WRITE.
************************************************************************
*EVENT End-of page
************************************************************************
END-OF-PAGE.
************************************************************************
************************************************************************
** forms
************************************************************************
*&---------------------------------------------------------------------*
*& Form FRM_INITIAL
*&---------------------------------------------------------------------*
* 数据初始化
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_INITIAL .
DATA: L_LASTDT LIKE ZIDOC_LOG-LASTDT.
"当前时间戳
CONCATENATE SY-DATUM SY-UZEIT INTO G_NOW_TIMESTAMP.
"获取上次更新时间
SELECT SINGLE LASTDT
FROM ZIDOC_LOG
INTO L_LASTDT
WHERE LOGSYS = P_LOGSYS
AND MESTYP = P_MESTYP
AND SEGNAM = P_SEGNA1
AND STATUS = 'S'.
G_LAST_TIMESTAMP = L_LASTDT.
CONDENSE: G_NOW_TIMESTAMP,
G_LAST_TIMESTAMP.
"是否自动增量
IF P_INCRE = 'X'.
"取得增量数据
PERFORM FRM_GET_INCREMENT.
ENDIF.
ENDFORM. " FRM_INITIAL
*&---------------------------------------------------------------------*
*& Form FRM_GET_INCREMENT
*&---------------------------------------------------------------------*
* 取得增量数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_GET_INCREMENT .
DATA: LT_CDHDR TYPE TABLE OF CDHDR WITH HEADER LINE.
"查询更新头数据
SELECT *
INTO TABLE LT_CDHDR
FROM CDHDR
WHERE OBJECTCLAS = G_OBJECT_CLASS
AND UDATE >= G_LAST_TIMESTAMP+0(8).
DELETE LT_CDHDR WHERE UDATE = G_LAST_TIMESTAMP+0(8)
AND UTIME < G_LAST_TIMESTAMP+8(6).
IF LT_CDHDR[] IS NOT INITIAL.
"赋值RANGES
LOOP AT LT_CDHDR.
S_KOSTL-SIGN = 'I'.
S_KOSTL-OPTION = 'EQ'.
S_KOSTL-LOW = LT_CDHDR-OBJECTID+4(10).
S_KOSTL-HIGH = ''.
APPEND S_KOSTL.
ENDLOOP.
SORT S_KOSTL BY LOW.
DELETE ADJACENT DUPLICATES FROM S_KOSTL COMPARING LOW.
ELSE.
MESSAGE '无科目增量数据' TYPE 'S'.
LEAVE PROGRAM.
ENDIF.
ENDFORM. " FRM_GET_INCREMENT
*&---------------------------------------------------------------------*
*& Form FRM_SEL_DATA
*&---------------------------------------------------------------------*
* 获取数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SEL_DATA .
RANGES L_R_KOSTL FOR CSKS-KOSTL.
DATA: L_NUM TYPE I.
"是否自动增量
IF P_INCRE = 'X'.
DESCRIBE TABLE S_KOSTL[] LINES L_NUM.
"最小物料
READ TABLE S_KOSTL INDEX 1.
L_R_KOSTL-LOW = S_KOSTL-LOW.
"最大物料
READ TABLE S_KOSTL INDEX L_NUM.
L_R_KOSTL-HIGH = S_KOSTL-LOW.
L_R_KOSTL-SIGN = 'I'.
L_R_KOSTL-OPTION = 'BT'.
APPEND L_R_KOSTL.
ELSE.
L_R_KOSTL[] = S_KOSTL[].
ENDIF.
"获取物料主数据
SELECT CSKS~KOSTL"成本中心
CSKS~DATBI"有效截止日期
CSKS~DATAB"开始生效日期
CSKS~BUKRS"公司代码
CSKS~KOSAR"成本中心类型
CSKT~LTEXT"成本中心描述
INTO TABLE IT_CSKS
FROM CSKS
INNER JOIN CSKT on CSKS~KOSTL = CSKT~KOSTL
AND CSKS~KOKRS = CSKT~KOKRS
AND CSKS~DATBI = CSKT~DATBI
WHERE CSKS~KOSTL IN L_R_KOSTL
AND CSKS~KOKRS = 'SHAC'
AND CSKS~BKZKP = ''
AND CSKS~BKZKS = ''
AND CSKT~SPRAS = '1'.
IF P_INCRE = 'X'.
DELETE IT_CSKS WHERE KOSTL NOT IN S_KOSTL.
ENDIF.
IF IT_CSKS IS INITIAL.
MESSAGE '没有满足条件的物料数据' TYPE 'S'.
LEAVE PROGRAM.
ENDIF.
SORT: IT_CSKS BY KOSTL.
ENDFORM. " FRM_SEL_DATA
*&---------------------------------------------------------------------*
*& Form FRM_DEL_DATA
*&---------------------------------------------------------------------*
* 处理数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DEL_DATA .
LOOP AT IT_CSKS INTO WA_CSKS.
MOVE-CORRESPONDING WA_CSKS TO WA_DATA.
"添加到IDOC内表
WA_IDOC_DATA-SEGNAM = P_SEGNA1.
MOVE WA_DATA TO WA_IDOC_DATA-SDATA.
APPEND WA_IDOC_DATA TO IT_IDOC_DATA.
CLEAR WA_DATA.
ENDLOOP.
ENDFORM. " FRM_DEL_DATA
*&---------------------------------------------------------------------*
*& Form FRM_IDOC_SEND
*&---------------------------------------------------------------------*
* 发送IDOC
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_IDOC_SEND .
DATA: LW_IDOC_CONTROL LIKE EDIDC.
LW_IDOC_CONTROL-RCVPRT = 'LS'. "接受方伙伴类型
LW_IDOC_CONTROL-RCVPRN = P_LOGSYS. "接受方伙伴编号
LW_IDOC_CONTROL-MESTYP = P_MESTYP.
LW_IDOC_CONTROL-IDOCTP = P_IDOCTP.
CALL FUNCTION 'ZSHAC_IDOC_SEND_HMES'
EXPORTING
I_IDOC_CONTROL = LW_IDOC_CONTROL
TABLES
T_IDOC_DATA = IT_IDOC_DATA
EXCEPTIONS
NO_MODEL = 1
NO_IDOC = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
CASE SY-SUBRC.
WHEN 1.
MESSAGE 'NO MODEL' TYPE 'S'.
WHEN 2.
MESSAGE 'NO IDOC' TYPE 'S'.
WHEN 3.
MESSAGE 'UNKNOW ERROR' TYPE 'S'.
ENDCASE.
ENDIF.
ENDFORM. " FRM_IDOC_SEND
*&---------------------------------------------------------------------*
*& Form FRM_WRITE
*&---------------------------------------------------------------------*
* 日志输出处理
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_WRITE .
"保存发送记录
PERFORM FRM_SAVE_LOG.
"是否后台运行
IF SY-BATCH EQ SPACE.
"显示IDOC结果,调用WE02
PERFORM FRM_SHOW_RESULT.
ENDIF.
ENDFORM. " FRM_WRITE
*&---------------------------------------------------------------------*
*& Form FRM_SAVE_LOG
*&---------------------------------------------------------------------*
* 保存发送记录
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SAVE_LOG .
DATA: LW_ZIDOC_LOG LIKE ZIDOC_LOG.
CHECK P_INCRE = 'X'.
"保存发送记录到自建表
CLEAR LW_ZIDOC_LOG.
LW_ZIDOC_LOG-LOGSYS = P_LOGSYS.
LW_ZIDOC_LOG-MESTYP = P_MESTYP.
LW_ZIDOC_LOG-SEGNAM = P_SEGNA1.
LW_ZIDOC_LOG-LASTDT = G_NOW_TIMESTAMP.
LW_ZIDOC_LOG-STATUS = 'S'.
MODIFY ZIDOC_LOG FROM LW_ZIDOC_LOG.
ENDFORM. " FRM_SAVE_LOG
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_RESULT
*&---------------------------------------------------------------------*
* 显示IDOC结果,调用WE02
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SHOW_RESULT .
DATA: R_REDAT TYPE RANGE OF EDIDC-CREDAT WITH HEADER LINE,
R_IDOCTY TYPE RANGE OF EDIDC-IDOCTP WITH HEADER LINE.
R_REDAT-SIGN = 'I'.
R_REDAT-OPTION = 'EQ'.
R_REDAT-LOW = SY-DATUM.
APPEND R_REDAT.
R_IDOCTY-SIGN = 'I'.
R_IDOCTY-OPTION = 'EQ'.
R_IDOCTY-LOW = P_IDOCTP.
APPEND R_IDOCTY.
"调用WE02
SUBMIT RSEIDOC2 WITH CREDAT IN R_REDAT
WITH IDOCTP IN R_IDOCTY
AND RETURN.
ENDFORM. " FRM_SHOW_RESULT