IDOC配置

创建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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值