SAP BAPI_OUTB_DELIVERY_CHANGE自动拆分批次并用WS_DELIVERY_UPDATE_2过账示例收货
  RdEelXhuDp09 2023年12月07日 23 0



SAP 根据SRM的供应商交货单 BAPI_OUTB_DELIVERY_CHANGE拆分批次WS_DELIVERY_UPDATE_2过账收货

  • 1. 需求
  • 2. 目的展示
  • 3. 实现代码
  • 4. 拆分效果
  • 5. VL33N拆分效果


1. 需求

  • 根据SRM传过来中间表的物料批次和交货数量,拆分DN中有物料批次的交货数量(LFIMG)到批次中收货过账;DN中物料无批次的直接过账收货

2. 目的展示

  • 将表1、表2的数据批次拆分成表3的数据;然后WS_DELIVERY_UPDATE_2收货入库

3. 实现代码

  • 代码
"Definition

TYPES: BEGIN OF TY_LIPS,
         MATNR TYPE LIPS-MATNR,
         POSNR TYPE LIPS-POSNR,
         VBELN TYPE LIPS-VBELN,
         LFIMG TYPE LIPS-LFIMG,
         MEINS TYPE LIPS-MEINS,
         UMVKZ TYPE LIPS-UMVKZ,
         UMVKN TYPE LIPS-UMVKN,
         VRKME TYPE LIPS-VRKME,
         XCHAR TYPE MARC-XCHAR,
         CHARG TYPE LIPS-CHARG,
       END OF TY_LIPS.

DATA: GT_LIPS  TYPE TABLE OF TY_LIPS,
      GT_LIPS1 TYPE TABLE OF TY_LIPS,
      GT_LIPS2 TYPE TABLE OF TY_LIPS,
      WA_LIPS  TYPE TY_LIPS.

DATA: WA_ITEM_DATA  LIKE BAPIOBDLVITEMCHG,
      GT_ITEM_DATA  LIKE TABLE OF BAPIOBDLVITEMCHG,
      GT_ITEM_DATA1 LIKE TABLE OF BAPIOBDLVITEMCHG.

TYPES: BEGIN OF TY_MIDDLE,
         MATNR  TYPE LIPS-MATNR,
         LOT_NO TYPE CHAR25,
         LFIMG  TYPE LIPS-LFIMG,
       END OF TY_MIDDLE.

DATA: GT_MIDDLE TYPE TABLE OF TY_MIDDLE,
      WA_MIDDLE TYPE TY_MIDDLE.

WA_LIPS-MATNR = '1-11-01980-00AD'.
WA_LIPS-POSNR = '10'.
WA_LIPS-VBELN = '1800214651'.
WA_LIPS-LFIMG = '700.000'.
WA_LIPS-VRKME = 'BOX'.
WA_LIPS-MEINS = 'BOT'.
WA_LIPS-UMVKZ = '37200'.
WA_LIPS-UMVKN = '1'.
WA_LIPS-XCHAR = 'X'.

APPEND WA_LIPS TO GT_LIPS.

WA_LIPS-MATNR = '1-11-01980-00AD'.
WA_LIPS-POSNR = '20'.
WA_LIPS-VBELN = '1800214651'.
WA_LIPS-LFIMG = '300.000'.
WA_LIPS-VRKME = 'BOX'.
WA_LIPS-MEINS = 'BOT'.
WA_LIPS-UMVKZ = '37200'.
WA_LIPS-UMVKN = '1'.
WA_LIPS-XCHAR = 'X'.

APPEND WA_LIPS TO GT_LIPS.

WA_MIDDLE-MATNR = '1-11-01980-00AD'.
WA_MIDDLE-LOT_NO = 'BA0001'.
WA_MIDDLE-LFIMG = '200.000'.

APPEND WA_MIDDLE TO GT_MIDDLE.

WA_MIDDLE-MATNR = '1-11-01980-00AD'.
WA_MIDDLE-LOT_NO = 'BA0002'.
WA_MIDDLE-LFIMG = '500.000'.

APPEND WA_MIDDLE TO GT_MIDDLE.

WA_MIDDLE-MATNR = '1-11-01980-00AD'.
WA_MIDDLE-LOT_NO = 'BA0003'.
WA_MIDDLE-LFIMG = '300.000'.

APPEND WA_MIDDLE TO GT_MIDDLE.

"Processing Data

MOVE-CORRESPONDING GT_LIPS TO GT_LIPS1.
SORT GT_LIPS1 BY MATNR VBELN POSNR.
SORT GT_MIDDLE BY MATNR LOT_NO.

"If Not Enable Batch Move To GT_ITEM_DATA1
SELECT
  VBELN AS DELIV_NUMB,
  POSNR AS DELIV_ITEM,
  MATNR AS MATERIAL,
  UMVKZ AS FACT_UNIT_NOM,
  UMVKN AS FACT_UNIT_DENOM,
  LFIMG AS DLV_QTY,
  VRKME AS SALES_UNIT,
  MEINS AS SALES_UNIT_ISO
  FROM @GT_LIPS1 AS A
  WHERE XCHAR <> 'X'
  INTO CORRESPONDING FIELDS OF TABLE @GT_ITEM_DATA1.

"If Enable Batch Split Batch

"Prepare
LOOP AT GT_MIDDLE INTO WA_MIDDLE.
  DATA: WA_MIDDLE1 LIKE WA_MIDDLE.

  MOVE-CORRESPONDING WA_MIDDLE TO WA_MIDDLE1.

  AT NEW MATNR.               "AT New MATNR的行,也会执行AT NEW 和 AT END OF之间的代码
  ENDAT.                   "防止重复处理数据,AN NEW MATNR中不执行任何代码(也可注释掉)

  PERFORM FRM_PREPARE_BATCH USING WA_MIDDLE1-MATNR WA_MIDDLE1-LOT_NO WA_MIDDLE1-LFIMG.

  AT END OF MATNR.
    PERFORM FRM_PREPARE_BATCH USING WA_MIDDLE1-MATNR WA_MIDDLE1-LOT_NO WA_MIDDLE1-LFIMG.
  ENDAT.
ENDLOOP.

"Exec Split Batch
PERFORM FRM_SPLIT_BATCH.


START-OF-SELECTION.
PERFORM FRM_GOODS_MOVE.


**------------------------------------------FROM------------------------------------------**
FORM FRM_PREPARE_BATCH  USING  P_MATNR
                             P_LOT_NO
                             P_LFIMG.

  SELECT * FROM @GT_LIPS1 AS B
    WHERE MATNR = @P_MATNR
    AND XCHAR = 'X'
    INTO TABLE @DATA(LT_CACHE1).

  LOOP AT LT_CACHE1 INTO WA_LIPS.
    IF P_LFIMG IS NOT INITIAL.
      IF WA_LIPS-LFIMG > P_LFIMG.
        WA_LIPS-LFIMG = WA_LIPS-LFIMG - P_LFIMG.

        MODIFY GT_LIPS1 FROM WA_LIPS TRANSPORTING LFIMG
        WHERE VBELN = WA_LIPS-VBELN
        AND POSNR = WA_LIPS-POSNR
        AND MATNR =  WA_LIPS-MATNR.

        WA_LIPS-LFIMG = P_LFIMG.
        WA_LIPS-CHARG = P_LOT_NO.
        APPEND WA_LIPS TO GT_LIPS2.
        EXIT.

      ELSEIF WA_LIPS-LFIMG < P_LFIMG.

        DELETE TABLE GT_LIPS1 FROM WA_LIPS.
        WA_LIPS-CHARG = P_LOT_NO.
        APPEND WA_LIPS TO GT_LIPS2.
        P_LFIMG = P_LFIMG - WA_LIPS-LFIMG.

      ELSEIF WA_LIPS-LFIMG = P_LFIMG.

        WA_LIPS-CHARG = P_LOT_NO.
        APPEND WA_LIPS TO GT_LIPS2.

        DELETE GT_LIPS1
        WHERE  VBELN = WA_LIPS-VBELN
        AND POSNR = WA_LIPS-POSNR
        AND MATNR =  WA_LIPS-MATNR.

        CLEAR: P_LFIMG.
        EXIT.

      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.

FORM FRM_SPLIT_BATCH .
  DATA: LS_HEADER_DATA    LIKE BAPIOBDLVHDRCHG,
        LT_ITEM_CONTROL   LIKE TABLE OF BAPIOBDLVITEMCTRLCHG,
        WA_ITEM_CONTROL   LIKE BAPIOBDLVITEMCTRLCHG,
        LS_HEADER_CONTROL LIKE BAPIOBDLVHDRCTRLCHG,
        LT_RETURN         LIKE TABLE OF BAPIRET2 WITH HEADER LINE.

  DATA: LV_NEWITEM TYPE POSNR_VL,
        LV_MSG     TYPE STRING.

  SELECT DISTINCT
    VBELN,
    POSNR
    FROM @GT_LIPS2 AS A
    WHERE XCHAR = 'X'
    ORDER BY VBELN,POSNR
    INTO TABLE @DATA(LT_CACHE2).

  LV_NEWITEM = '900000'.
  LOOP AT LT_CACHE2 INTO DATA(WA_TEMP).
    CLEAR: WA_ITEM_CONTROL,LT_ITEM_CONTROL,LT_RETURN,
           LT_RETURN[],LS_HEADER_DATA,LS_HEADER_CONTROL,
           GT_ITEM_DATA,WA_LIPS,WA_ITEM_DATA.

    "Header
    LS_HEADER_DATA-DELIV_NUMB = WA_TEMP-VBELN.
    LS_HEADER_CONTROL-DELIV_NUMB = WA_TEMP-VBELN.

    "Set Mofify flag
    CLEAR WA_ITEM_CONTROL.
    WA_ITEM_CONTROL-DELIV_NUMB = WA_TEMP-VBELN.   "被拆分DN号
    WA_ITEM_CONTROL-DELIV_ITEM = WA_TEMP-POSNR.   "被拆分DN Item
    WA_ITEM_CONTROL-CHG_DELQTY = 'X'.             "数量修改标志

    APPEND WA_ITEM_CONTROL TO LT_ITEM_CONTROL.

    "Original Data
    CLEAR: WA_LIPS.
    SELECT SINGLE *
      FROM @GT_LIPS AS A4
      WHERE VBELN = @WA_TEMP-VBELN
      AND POSNR = @WA_TEMP-POSNR
      INTO @WA_LIPS.

    WA_ITEM_DATA-DELIV_NUMB         = WA_LIPS-VBELN.    "被拆分DN号
    WA_ITEM_DATA-DELIV_ITEM         = WA_LIPS-POSNR.    "被拆分DN Item
    WA_ITEM_DATA-MATERIAL           = WA_LIPS-MATNR.    "物料
    WA_ITEM_DATA-SALES_UNIT         = WA_LIPS-VRKME.    "被拆分DN销售单位
    WA_ITEM_DATA-SALES_UNIT_ISO     = WA_LIPS-MEINS.    "被拆分DN基本单位
    WA_ITEM_DATA-FACT_UNIT_NOM      = WA_LIPS-UMVKZ.    "销售数量转换成SKU的分子(因子)
    WA_ITEM_DATA-FACT_UNIT_DENOM    = WA_LIPS-UMVKN.    "销售数量转换为 SKU 的值(分母)

    APPEND WA_ITEM_DATA TO GT_ITEM_DATA.
    APPEND WA_ITEM_DATA TO GT_ITEM_DATA1.

    "New Batch
    CLEAR: GT_LIPS1,WA_LIPS.

    SELECT *
      FROM @GT_LIPS2 AS A
      WHERE VBELN = @WA_TEMP-VBELN
      AND POSNR = @WA_TEMP-POSNR
      AND XCHAR = 'X'
      INTO TABLE @GT_LIPS1.

    LOOP AT GT_LIPS1 INTO WA_LIPS .
      CLEAR: WA_ITEM_DATA.
      LV_NEWITEM = LV_NEWITEM + 1.
      WA_ITEM_DATA-DELIV_NUMB       = WA_TEMP-VBELN.    "被拆分的DN
      WA_ITEM_DATA-DELIV_ITEM       = LV_NEWITEM.       "拆分后的新行项目
      WA_ITEM_DATA-MATERIAL         = WA_LIPS-MATNR.    "物料
      WA_ITEM_DATA-HIERARITEM       = WA_TEMP-POSNR.    "上级行项目,被拆分的行项目
      WA_ITEM_DATA-BATCH            = WA_LIPS-CHARG.    "新批次号
      WA_ITEM_DATA-DLV_QTY          = WA_LIPS-LFIMG.    "新Item销售单位数量
*      WA_ITEM_DATA-DLV_QTY_IMUNIT   = .                "新Item基本单位数量
      WA_ITEM_DATA-SALES_UNIT       = WA_LIPS-VRKME.    "新Item销售单位
      WA_ITEM_DATA-SALES_UNIT_ISO   = WA_LIPS-MEINS.    "新Item基本单位
      WA_ITEM_DATA-FACT_UNIT_NOM    = WA_LIPS-UMVKZ.    "销售数量转换成SKU的分子(因子)
      WA_ITEM_DATA-FACT_UNIT_DENOM  = WA_LIPS-UMVKN.    "销售数量转换为 SKU 的值(分母)

      WA_ITEM_DATA-USEHIERITM       = '1'.              "子项标记

      APPEND WA_ITEM_DATA TO GT_ITEM_DATA.
      APPEND WA_ITEM_DATA TO GT_ITEM_DATA1.
    ENDLOOP.

    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        HEADER_DATA    = LS_HEADER_DATA
        HEADER_CONTROL = LS_HEADER_CONTROL
        DELIVERY       = WA_TEMP-VBELN
      TABLES
        ITEM_DATA      = GT_ITEM_DATA
        ITEM_CONTROL   = LT_ITEM_CONTROL
        RETURN         = LT_RETURN.

    IF SY-SUBRC <> 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      MESSAGE TEXT-A15 TYPE 'E'.
    ENDIF.
  ENDLOOP.

  "Complete All Commit
  COMMIT WORK AND WAIT.

ENDFORM.

FORM FRM_GOODS_MOVE .
  DATA: LS_VKOK  TYPE VBKOK,
        LT_VBPOK TYPE TABLE OF VBPOK WITH HEADER LINE.

  SELECT SINGLE VBELN
    FROM @GT_LIPS2 AS A
    INTO @LS_VKOK-VBELN_VL.

  LS_VKOK-WABUC = 'X'.

  LOOP AT GT_ITEM_DATA1 INTO WA_ITEM_DATA.
    LT_VBPOK-VBELN_VL = WA_ITEM_DATA-DELIV_NUMB.
    LT_VBPOK-POSNR_VL = WA_ITEM_DATA-DELIV_ITEM.
    LT_VBPOK-MATNR    = WA_ITEM_DATA-MATERIAL.
    LT_VBPOK-UMVKZ    = WA_ITEM_DATA-FACT_UNIT_NOM.
    LT_VBPOK-UMVKN    = WA_ITEM_DATA-FACT_UNIT_DENOM.
    LT_VBPOK-LFIMG    = WA_ITEM_DATA-DLV_QTY.
    LT_VBPOK-VRKME    = WA_ITEM_DATA-SALES_UNIT.
    LT_VBPOK-MEINS    = WA_ITEM_DATA-SALES_UNIT_ISO.
    LT_VBPOK-CHARG    = WA_ITEM_DATA-BATCH.
    APPEND LT_VBPOK.
  ENDLOOP.

  CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
    EXPORTING
      VBKOK_WA  = LS_VKOK
      DELIVERY  = LS_VKOK-VBELN_VL
    TABLES
      VBPOK_TAB = LT_VBPOK[].

  IF SY-SUBRC = 0.
    COMMIT WORK AND WAIT.
    MESSAGE '发货过账成功' TYPE 'S'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    MESSAGE '发货过账失败' TYPE 'E'.
  ENDIF.

ENDFORM.

4. 拆分效果

  • 拆分前SRM数据
  • 拆分前DN数据
  • 拆分后

5. VL33N拆分效果

  • 发货过账前
  • 拆分批次 & 发货过账后


    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月07日 0

暂无评论

RdEelXhuDp09