代码
"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.