SAP BAPI_OUTB_DELIVERY_CHANGE自动拆分批次并用WS_DELIVERY_UPDATE_2过账示例收货

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

1. 需求

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

2. 目的展示

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

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数据
    1-2
  • 拆分前DN数据
    1-3
  • 拆分后
    1-4

5. VL33N拆分效果

  • 发货过账前
    1-5
  • 拆分批次 & 发货过账后
    1-6

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值