以下代码是创建完交货单,根据传入的数据,拆分交货单行项目的批次.
DATA: LT_LIPS TYPE TABLE OF LIPS,
LS_LIPS TYPE LIPS,
LS_DLVR TYPE TY_DGTRK,
LV_POSNR TYPE POSNR_VL,
CV_POSNR TYPE POSNR_VL,
LV_BATVH TYPE LIPS-CHARG,
HEADER_DATA LIKE BAPIOBDLVHDRCHG, "Delivery header
HEADER_CONTROL LIKE BAPIOBDLVHDRCTRLCHG, "delivery header control
I_DELIVERY_NO LIKE BAPIOBDLVHDRCHG-DELIV_NUMB, "deliver number
TECHN_CONTROL LIKE BAPIDLVCONTROL, "TECHN_CONTROL
ITEM_DATA LIKE BAPIOBDLVITEMCHG OCCURS 0 WITH HEADER LINE , "ITEM_DATA delivery item
ITEM_CONTROL LIKE BAPIOBDLVITEMCTRLCHG OCCURS 0 WITH HEADER LINE, "ITEM_CONTROL
ITEM_DATA_SPL LIKE /SPE/BAPIOBDLVITEMCHG OCCURS 0 WITH HEADER LINE,
LT_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE . "Return
SELECT SINGLE VERUR
FROM LIKP
INTO @DATA(LV_VERUR)
WHERE VBELN = @P_VBELN.
SELECT
VBELN,
POSNR,
CHARG,
MATNR,
LFIMG,
UMVKZ,
UMVKN
INTO TABLE @DATA(LG_LIPS)
FROM LIPS
WHERE VBELN = @P_VBELN
AND POSNR LIKE '9%'.
REFRESH LT_RETURN.
* 检查是否已经拆分批次,如果已经拆分批次,跳过此步骤
IF LG_LIPS IS INITIAL.
REFRESH:ITEM_DATA,ITEM_CONTROL.
*Set Delivery Header data
I_DELIVERY_NO = P_VBELN .
HEADER_DATA-DELIV_NUMB = P_VBELN.
TECHN_CONTROL-UPD_IND = 'U' .
HEADER_CONTROL-DELIV_NUMB = P_VBELN.
SELECT * FROM LIPS INTO TABLE LT_LIPS WHERE VBELN = P_VBELN.
LOOP AT LT_LIPS INTO LS_LIPS.
ITEM_DATA-DELIV_NUMB = LS_LIPS-VBELN.
ITEM_DATA-DELIV_ITEM = LS_LIPS-POSNR. "原行项目
ITEM_DATA-HIERARITEM = LS_LIPS-POSNR.
ITEM_DATA-MATERIAL = LS_LIPS-MATNR.
ITEM_DATA-DLV_QTY = 0 .
ITEM_DATA-DLV_QTY_IMUNIT = 0.
ITEM_DATA-BASE_UOM = LS_LIPS-MEINS.
ITEM_DATA-SALES_UNIT = LS_LIPS-VRKME.
ITEM_DATA-FACT_UNIT_NOM = LS_LIPS-UMVKZ.
ITEM_DATA-FACT_UNIT_DENOM = LS_LIPS-UMVKN.
APPEND ITEM_DATA.
CLEAR ITEM_DATA.
ITEM_CONTROL-DELIV_NUMB = LS_LIPS-VBELN.
ITEM_CONTROL-DELIV_ITEM = LS_LIPS-POSNR.
ITEM_CONTROL-CHG_DELQTY = 'X' .
APPEND ITEM_CONTROL.
CLEAR ITEM_CONTROL.
ENDLOOP.
SORT DLVR BY DLVID EBELN EBELP DLVITERM.
SORT LT_LIPS BY VGBEL VGPOS.
CV_POSNR = '000010'.
LOOP AT DLVR INTO LS_DLVR WHERE DLVID = LV_VERUR.
IF LV_POSNR >= 900001.
LV_POSNR = LV_POSNR + 1.
ELSE.
LV_POSNR = 900001.
ENDIF.
CLEAR: LS_LIPS,CV_POSNR.
DATA(LV_EBELP) = '0' && LS_DLVR-EBELP.
READ TABLE LT_LIPS INTO LS_LIPS WITH KEY VGBEL = LS_DLVR-EBELN
VGPOS = LV_EBELP
BINARY SEARCH.
IF SY-SUBRC = 0.
CV_POSNR = LS_LIPS-POSNR.
ITEM_DATA-MATERIAL = LS_LIPS-MATNR.
ENDIF.
ITEM_DATA-DELIV_NUMB = P_VBELN.
ITEM_DATA-DELIV_ITEM = LV_POSNR .
ITEM_DATA-HIERARITEM = CV_POSNR . "The batch split record below delivery item hierary
ITEM_DATA-USEHIERITM = '1' .
* SELECT SINGLE MATNR INTO ITEM_DATA-MATERIAL FROM EKPO WHERE EBELN = LS_DLVR-EBELN AND EBELP = LS_DLVR-EBELP.
CLEAR: LV_BATVH.
PERFORM FRM_GET_BATCH_NUMBER CHANGING LV_BATVH.
LS_DLVR-BATCH = LV_BATVH.
MODIFY DLVR FROM LS_DLVR."将生成的批次号记录到LT_ITAB,和供应商批次对应起来,方便后续维护批次特性
ITEM_DATA-BATCH = LV_BATVH.
ITEM_DATA-DLV_QTY = LS_DLVR-DLVNUM .
ITEM_DATA-FACT_UNIT_NOM = 1 .
ITEM_DATA-FACT_UNIT_DENOM = 1 .
APPEND ITEM_DATA.
CLEAR ITEM_DATA.
ITEM_CONTROL-DELIV_NUMB = P_VBELN.
ITEM_CONTROL-DELIV_ITEM = LV_POSNR.
ITEM_CONTROL-CHG_DELQTY = 'X' .
APPEND ITEM_CONTROL.
CLEAR ITEM_CONTROL.
* AT END OF EBELP.
* CV_POSNR = CV_POSNR + 10.
* ENDAT.
CLEAR LV_EBELP.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = HEADER_DATA
HEADER_CONTROL = HEADER_CONTROL
DELIVERY = I_DELIVERY_NO
TECHN_CONTROL = TECHN_CONTROL
TABLES
ITEM_DATA = ITEM_DATA
ITEM_CONTROL = ITEM_CONTROL
RETURN = LT_RETURN.
IF LT_RETURN[] IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
LV_TYP = 'S'.
LV_MSG = '交货单批次拆分成功'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LV_TYP = 'E'.
LV_MSG = '交货单拆分批次失败'.
READ TABLE LT_RETURN WITH KEY TYPE = 'E'.
MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
INTO DATA(LV_MESS).
LV_MSG = LV_MSG && ';' && LV_MESS.
ENDIF .
ENDIF.