SAP 根据SRM的供应商交货单 BAPI_OUTB_DELIVERY_CHANGE拆分批次WS_DELIVERY_UPDATE_2过账收货
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