BAPI:
BAPI_OUTB_DELIVERY_CHANGE
BAPI_OUTB_DELIVERY_CONFIRM_DEC
上述两个BAPI都能实现批次的拆分。
后者可以实现批次拆分并且过账。如只批次拆分后者直接扣减非限制库存,并且批次交货计划数量未增加,可能是系统版本限制。
如只做批次拆分,建议用前者 。
如若使用后者,需要更改 UPDATE LIKP SET VLSTK = SPACE*NOTES 1459993。否则不能删除批次和冲销 。
批次拆分:
FORM FRM_CHANGE_DELIVERY_NEW TABLES LT_ITEM_TAB STRUCTURE ZTMM0140B
USING LS_HEAD_TAB TYPE ZTMM0140A .
FIELD-SYMBOLS:
<FS_ITEM> TYPE ZTMM0140B .
DATA:
LS_HEADER_DATA LIKE BAPIOBDLVHDRCHG,
LS_HEADER_CONTROL LIKE BAPIOBDLVHDRCTRLCHG,
LV_DELIVERY_NUMB LIKE BAPIOBDLVHDRCHG-DELIV_NUMB.
DATA:LT_RETURN_TAB TYPE TABLE OF BAPIRET2,
LW_RETURN_TAB TYPE BAPIRET2.
DATA:BEGIN OF TYP_RELATION ,
TASKNO TYPE ZTMM0140B-TASKNO,
TASKLN TYPE ZTMM0140B-TASKLN,
ZINDEX TYPE ZTMM0140B-ZINDEX,
ZDJBH TYPE ZTMM0140B-ZDJBH,
ZPOSN TYPE ZTMM0140B-ZPOSN,
END OF TYP_RELATION.
DATA:LT_RELATION LIKE TABLE OF TYP_RELATION,
LS_RELATION LIKE TYP_RELATION.
DATA:
L_VBKOK LIKE VBKOK,
LT_PROTT LIKE PROTT OCCURS 0 WITH HEADER LINE,
LV_WBSTK TYPE VBUK-WBSTK,
LV_BOLNR TYPE VBKOK-BOLNR.
DATA:
LT_ITEM_DATA LIKE TABLE OF BAPIOBDLVITEMCHG,
LW_ITEM_DATA LIKE BAPIOBDLVITEMCHG,
LT_ITEM_SERIAL_NO LIKE TABLE OF BAPIDLVITMSERNO,
LW_ITEM_SERIAL_NO LIKE BAPIDLVITMSERNO,
LT_ITEM_CONTROL LIKE TABLE OF BAPIOBDLVITEMCTRLCHG,
LW_ITEM_CONTROL LIKE BAPIOBDLVITEMCTRLCHG.
DATA:LV_CHARGE_POSNR TYPE LIPS-POSNR.
DATA:LV_FLAG TYPE CHAR01.
DATA:LV_MENGE TYPE LFIMG.
DATA:LV_TOTAL_MENGE TYPE LFIMG.
DATA:LT_LIPS_TAB TYPE TABLE OF LIPS,
LS_LIPS_TAB TYPE LIPS.
DATA:LV_MESSAGE TYPE STRING,
LV_ALL_MESSAGE TYPE STRING.
DATA:LV_VBELN TYPE LIKP-VBELN .
DATA:LT_VBPOK TYPE TABLE OF VBPOK,
LS_VBPOK TYPE VBPOK.
DATA:LT_NEW_LIPS TYPE TABLE OF LIPS,
LS_NEW_LIPS TYPE LIPS.
DATA:LT_TEMP_TAB LIKE TABLE OF ZTMM0140B .
DATA: LS_TEMP_TAB TYPE ZTMM0140B .
DATA:LV_TABIX TYPE SY-TABIX .
DATA:LT_DJBH TYPE TABLE OF ZTMM0140B,
LS_DJBH TYPE ZTMM0140B.
DATA:LS_TECH TYPE BAPIDLVCONTROL .
*销售出库业务 。
CHECK LS_HEAD_TAB-TASKCS EQ 'XSCK' .
LT_TEMP_TAB[] = LT_ITEM_TAB[] .
LOOP AT LT_TEMP_TAB INTO LS_TEMP_TAB .
LV_TABIX = SY-TABIX .
READ TABLE GT_HEAD_TAB INTO GS_HEAD_TAB WITH KEY ZDJBH = LS_TEMP_TAB-ZDJBH ZDJTY = LS_TEMP_TAB-ZDJTY ZPOSN = LS_TEMP_TAB-ZPOSN .
IF SY-SUBRC = 0 AND GS_HEAD_TAB-SPLIT = 'X'.
ELSE .
DELETE LT_TEMP_TAB INDEX LV_TABIX .
ENDIF .
ENDLOOP .
CHECK LT_TEMP_TAB[] IS NOT INITIAL .
IF LT_TEMP_TAB[] IS NOT INITIAL .
SELECT
*
INTO CORRESPONDING FIELDS OF TABLE LT_LIPS_TAB
FROM LIPS
FOR ALL ENTRIES IN LT_TEMP_TAB
WHERE VBELN EQ LT_TEMP_TAB-ZDJBH
AND POSNR EQ LT_TEMP_TAB-ZPOSN .
ENDIF .
*根据单据,单据行拆封外向交货单。
LT_DJBH[] = LT_TEMP_TAB[] .
SORT LT_DJBH BY ZDJBH .
DELETE ADJACENT DUPLICATES FROM LT_DJBH COMPARING ZDJBH .
LOOP AT LT_DJBH INTO LS_DJBH .
*进行批次拆分和回写动作。
CLEAR:LT_RETURN_TAB[] ,LS_HEADER_DATA,LS_HEADER_CONTROL,LT_ITEM_DATA,
LT_ITEM_CONTROL,LT_ITEM_SERIAL_NO ,LT_PROTT , LV_TOTAL_MENGE, LV_FLAG,LS_TECH .
* LS_TECH-UPD_IND = 'U' .
.
LOOP AT LT_LIPS_TAB INTO LS_LIPS_TAB WHERE VBELN = LS_DJBH-ZDJBH .
SELECT
MAX( DISTINCT POSNR )
INTO LV_CHARGE_POSNR
FROM LIPS
WHERE VBELN EQ LS_DJBH-ZDJBH .
IF LV_CHARGE_POSNR LT 900001 .
LV_CHARGE_POSNR = 900001 .
ENDIF .
CLEAR LV_TOTAL_MENGE .
LOOP AT LT_TEMP_TAB INTO LS_TEMP_TAB WHERE ZDJBH = LS_LIPS_TAB-VBELN AND ZPOSN EQ LS_LIPS_TAB-POSNR .
*批次拆分行项目信息
LW_ITEM_DATA-DELIV_NUMB = LS_TEMP_TAB-ZDJBH. "外向交货单号
LW_ITEM_DATA-DELIV_ITEM = LV_CHARGE_POSNR. "交货单行项目
LW_ITEM_DATA-DLV_QTY = LS_TEMP_TAB-MENGE .
LW_ITEM_DATA-MATERIAL = LS_TEMP_TAB-MATNR.
LW_ITEM_DATA-BATCH = LS_TEMP_TAB-CHARG."批次
LW_ITEM_DATA-HIERARITEM = LS_TEMP_TAB-ZPOSN.
LW_ITEM_DATA-USEHIERITM = '1'. " 子项目批次拆分
LW_ITEM_DATA-SALES_UNIT = LS_TEMP_TAB-MEINS.
SELECT
SINGLE
UMREZ
UMREN
INTO (LW_ITEM_DATA-FACT_UNIT_NOM,LW_ITEM_DATA-FACT_UNIT_DENOM)
FROM
MARM
WHERE MATNR EQ LS_TEMP_TAB-MATNR
AND MEINH EQ LS_TEMP_TAB-MEINS.
IF SY-SUBRC = 0 .
ELSE.
LW_ITEM_DATA-FACT_UNIT_NOM = '1'. "此处应从MARM取转换关系
LW_ITEM_DATA-FACT_UNIT_DENOM = '1'."此处应从MARM取转换关系
ENDIF.
APPEND LW_ITEM_DATA TO LT_ITEM_DATA.
CLEAR LW_ITEM_DATA.
*行项目控制
LW_ITEM_CONTROL-DELIV_NUMB = LS_TEMP_TAB-ZDJBH.
LW_ITEM_CONTROL-DELIV_ITEM = LV_CHARGE_POSNR.
LW_ITEM_CONTROL-CHG_DELQTY = 'X'.
APPEND LW_ITEM_CONTROL TO LT_ITEM_CONTROL.
CLEAR LW_ITEM_CONTROL.
LV_TOTAL_MENGE = LV_TOTAL_MENGE + LS_TEMP_TAB-MENGE .
*封装数据。
LS_RELATION-TASKNO = LS_TEMP_TAB-TASKNO .
LS_RELATION-TASKLN = LS_TEMP_TAB-TASKLN .
LS_RELATION-ZINDEX = LS_TEMP_TAB-ZINDEX .
LS_RELATION-ZDJBH = LS_TEMP_TAB-ZDJBH .
LS_RELATION-ZPOSN = LV_CHARGE_POSNR .
APPEND LS_RELATION TO LT_RELATION .
CLEAR LS_RELATION .
LV_CHARGE_POSNR = LV_CHARGE_POSNR + 1. "批次拆分行项目
ENDLOOP.
*原始行项目信息。
LW_ITEM_DATA-DELIV_NUMB = LS_LIPS_TAB-VBELN. "外向交货单号
LW_ITEM_DATA-DELIV_ITEM = LS_LIPS_TAB-POSNR. "交货单行项目
LW_ITEM_DATA-DLV_QTY = LS_LIPS_TAB-LFIMG - LV_TOTAL_MENGE ." 行项目数量 - 批次拆分数量
LW_ITEM_DATA-MATERIAL = LS_LIPS_TAB-MATNR.
LW_ITEM_DATA-SALES_UNIT = LS_LIPS_TAB-MEINS.
LW_ITEM_DATA-FACT_UNIT_NOM = '1'. "此处应从MARM取转换关系
LW_ITEM_DATA-FACT_UNIT_DENOM = '1'."此处应从MARM取转换关系
APPEND LW_ITEM_DATA TO LT_ITEM_DATA.
CLEAR LW_ITEM_DATA.
*行项目控制
LW_ITEM_CONTROL-DELIV_NUMB = LS_LIPS_TAB-VBELN.
LW_ITEM_CONTROL-DELIV_ITEM = LS_LIPS_TAB-POSNR.
LW_ITEM_CONTROL-CHG_DELQTY = 'X'.
APPEND LW_ITEM_CONTROL TO LT_ITEM_CONTROL.
CLEAR LW_ITEM_CONTROL.
ENDLOOP.
*抬头信息
LV_DELIVERY_NUMB = LS_DJBH-ZDJBH ..
*调用BAPI vl02n进行发货确认操作。
*准备抬头信息
LV_DELIVERY_NUMB = LS_DJBH-ZDJBH .
LS_HEADER_DATA-DELIV_NUMB = LS_DJBH-ZDJBH .
*抬头控制信息。
LS_HEADER_CONTROL-DELIV_NUMB = LS_DJBH-ZDJBH .
* LS_HEADER_CONTROL-POST_GI_FLG = 'X'. "只做批次拆分。
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = LS_HEADER_DATA
HEADER_CONTROL = LS_HEADER_CONTROL
DELIVERY = LV_DELIVERY_NUMB
TECHN_CONTROL = LS_TECH
* HEADER_DATA_SPL =
* HEADER_CONTROL_SPL =
TABLES
* HEADER_PARTNER =
* HEADER_PARTNER_ADDR =
* HEADER_DEADLINES =
ITEM_DATA = LT_ITEM_DATA "行项目数据
ITEM_CONTROL = LT_ITEM_CONTROL
* ITEM_CODING_BLOCK =
ITEM_SERIAL_NO = LT_ITEM_SERIAL_NO "行项目序列号
* SUPPLIER_CONS_DATA =
* HANDLING_UNIT_HEADER =
* HANDLING_UNIT_ITEM =
* HANDLING_UNIT_HEADER_EPC =
* HANDLING_UNIT_ITEMS_EPC =
* HANDLING_UNIT_SERNO =
* EXTENSION1 =
* EXTENSION2 =
RETURN = LT_RETURN_TAB
* TOKENREFERENCE =
* HANDLING_UNIT_HEADER_CROSS =
* ITEM_DATA_SPL =
* HANDLING_UNIT_IDENTIFIERS =
* HANDLING_UNIT_ITEM_SPL =
* ITEM_DATA_DOCU_BATCH =
* NEW_ITEM_DATA =
* NEW_ITEM_DATA_SPL =
* NEW_ITEM_ORG =
* TEXT_HEADER =
* TEXT_LINES =
* NEW_ITEM_DATA_SKU =
.
LOOP AT LT_RETURN_TAB INTO LW_RETURN_TAB WHERE TYPE CA 'EAX'.
LV_FLAG = 'X'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = LW_RETURN_TAB-ID
MSGNR = LW_RETURN_TAB-NUMBER
MSGV1 = LW_RETURN_TAB-MESSAGE_V1
MSGV2 = LW_RETURN_TAB-MESSAGE_V2
MSGV3 = LW_RETURN_TAB-MESSAGE_V3
MSGV4 = LW_RETURN_TAB-MESSAGE_V4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
CONCATENATE LV_ALL_MESSAGE LV_MESSAGE INTO LV_ALL_MESSAGE.
ENDLOOP.
IF LV_FLAG EQ 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
MESSAGE LV_ALL_MESSAGE TYPE 'E' .
ELSE.
COMMIT WORK AND WAIT .
*NOTES 1459993
* UPDATE LIKP SET VLSTK = SPACE
* WHERE VBELN = LV_DELIVERY_NUMB .
ENDIF .
ENDLOOP .
IF LV_FLAG IS INITIAL .
*
LOOP AT LT_RELATION INTO LS_RELATION .
READ TABLE LT_ITEM_TAB ASSIGNING <FS_ITEM> WITH KEY TASKNO = LS_RELATION-TASKNO
TASKLN = LS_RELATION-TASKLN
ZINDEX = LS_RELATION-ZINDEX .
IF SY-SUBRC = 0 .
<FS_ITEM>-ZDJBH = LS_RELATION-ZDJBH .
<FS_ITEM>-ZPOSN = LS_RELATION-ZPOSN .
ENDIF .
ENDLOOP .
ENDIF .
ENDFORM.