参照销售订单创建交货单BAPI:BAPI_OUTB_DELIVERY_CREATE_SLS
拣配:WS_DELIVERY_UPDATE
过账:BAPI_OUTB_DELIVERY_CONFIRM_DEC
交货单: VL01N,VL02N.VL03N
FUNCTION ZSNSDFM_WMS001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(INPUT) TYPE ZSNSDSWMS001
*" EXPORTING
*" REFERENCE(OUTPUT) TYPE ZSNSDSWMOUT
*"----------------------------------------------------------------------
DATA: LS_VBKOK TYPE VBKOK,
LV_DELIVERY TYPE LIKP-VBELN,
LV_VBELN TYPE LIKP-VBELN,
LV_ZPOSNR TYPE LIPS-POSNR,
LV_MENGE TYPE EKPO-MENGE,
LS_VBPOK TYPE VBPOK,
LT_VBPOK TYPE TABLE OF VBPOK,
LS_PROT TYPE PROTT,
LT_PROT TYPE TABLE OF PROTT.
DATA LT_RETURN TYPE BAPIRET2 .
DATA INPUT_T TYPE ZSNSDTWMS001 .
DATA LV_MATNR TYPE N LENGTH 18 .
APPEND INPUT TO INPUT_T .
LOOP AT INPUT_T INTO DATA(LS_ITEMS).
SELECT SINGLE * FROM LIKP INTO @DATA(LS_LIKP) WHERE VBELN = @LS_ITEMS-ZDELIVERY-VBELN .
CLEAR OUTPUT .
OUTPUT-VBELN = LS_ITEMS-ZDELIVERY-VBELN .
"检查发货单是否已过账
IF LS_LIKP-WBSTK = 'C'.
OUTPUT-ZTYPE = 'E'.
OUTPUT-ZMESSAGE = '交货单已过账,请检查!'.
ENDIF.
CHECK LS_LIKP-WBSTK NE 'C' .
"交货单拣配
CLEAR:LV_MENGE,LV_ZPOSNR,LV_VBELN .
LV_VBELN = LS_ITEMS-ZDELIVERY-VBELN .
LV_DELIVERY = LV_VBELN.
LOOP AT LS_ITEMS-ZITEM INTO DATA(LS_ITEM).
LS_VBKOK = VALUE #( VBELN_VL = LV_VBELN
WADAT_IST = LS_ITEMS-ZDELIVERY-WADAT_IST+0(8)
KZWAD = 'X'
KOMUE = 'X'
KZKODAT = 'X').
LV_DELIVERY = LV_VBELN.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = LS_ITEM-MATNR
IMPORTING
OUTPUT = LV_MATNR.
LS_VBPOK = VALUE #( VBELN_VL = LV_VBELN
POSNR_VL = LS_ITEM-POSNR
VBELN = LV_VBELN
POSNN = LS_ITEM-POSNR
CHARG = LS_ITEM-CHARG
LGORT = LS_ITEM-LGORT
MATNR = LV_MATNR
TAQUI = 'X'
LIANP = 'X'
* LFIMG = LS_ITEM-LFIMG
* LGMNG = LS_ITEM-LFIMG
PIKMG = LS_ITEM-LFIMG )
.
APPEND LS_VBPOK TO LT_VBPOK.
ENDLOOP.
TRY .
"拣配
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
VBKOK_WA = LS_VBKOK
DELIVERY = LV_DELIVERY
UPDATE_PICKING = 'X'
* commit = 'X'
* IMPORTING
* EF_ERROR_ANY_0 = LV_XFELD
TABLES
VBPOK_TAB = LT_VBPOK[]
PROT = LT_PROT.
CATCH CX_ROOT INTO DATA(LO_ROOT).
ENDTRY.
DELETE LT_PROT WHERE MSGTY <> 'E'
AND MSGTY <> 'A'.
IF LT_PROT[] IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
"交货单过账
PERFORM VL02N_POST TABLES INPUT_T
USING LV_VBELN
CHANGING OUTPUT .
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT LT_PROT INTO LS_PROT.
MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
INTO DATA(LV_MSGTX).
OUTPUT-ZMESSAGE = OUTPUT-ZMESSAGE && LV_MSGTX.
ENDLOOP.
OUTPUT-ZTYPE = 'E'.
ENDIF.
ENDLOOP.
ENDFUNCTION.
FORM VL02N_POST TABLES LT_ITEMS TYPE ZSNSDTWMS001
USING PV_VBELN
CHANGING OUTPUT TYPE ZSNSDSWMOUT .
DATA: LS_HEADER_DATA TYPE BAPIOBDLVHDRCON,
LS_HEADER_CONTROL TYPE BAPIOBDLVHDRCTRLCON,
LV_DELIVERY TYPE BAPIOBDLVHDRCON-DELIV_NUMB,
LS_RETURN TYPE BAPIRET2,
LT_RETURN TYPE TABLE OF BAPIRET2,
LS_EXTENSION2 TYPE BAPIEXT,
LT_EXTENSION2 TYPE TABLE OF BAPIEXT.
DATA: LT_IPK LIKE TABLE OF /SPE/BAPIOBDLVITEMCONF WITH HEADER LINE,
LT_ITEM_DATA LIKE TABLE OF BAPIOBDLVITEMCON WITH HEADER LINE,
LT_ITEM_CONTROL LIKE TABLE OF BAPIOBDLVITEMCTRLCON WITH HEADER LINE,
LT_HDL LIKE TABLE OF BAPIDLVDEADLN WITH HEADER LINE.
DATA LV_MATNR TYPE MATNR .
DATA LT_BAPIDLVHDUNSERNO TYPE STANDARD TABLE OF /SPE/BAPIOBDLVITEM_SKU WITH HEADER LINE.
LS_HEADER_DATA-DELIV_NUMB = PV_VBELN.
LS_HEADER_CONTROL-DELIV_NUMB = PV_VBELN.
LS_HEADER_CONTROL-POST_GI_FLG = 'X'.
LS_HEADER_CONTROL-DELIV_DATE_FLG = 'X'.
LS_HEADER_CONTROL-GDSI_DATE_FLG = 'X'.
LS_HEADER_CONTROL-VOLUME_FLG = 'X'.
LV_DELIVERY = PV_VBELN.
"指定库存地点
LOOP AT LT_ITEMS-ZITEM INTO DATA(LS_ITEM).
CLEAR LT_IPK .
LT_IPK-DELIV_NUMB = PV_VBELN.
LT_IPK-DELIV_ITEM = LS_ITEM-POSNR.
LT_IPK-STGE_LOC = LS_ITEM-LGORT.
APPEND LT_IPK.
LT_ITEM_DATA-fact_unit_nom = 1.
LT_ITEM_DATA-fact_unit_denom = 1.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = LS_ITEM-MATNR
IMPORTING
OUTPUT = LT_ITEM_DATA-MATERIAL.
LT_ITEM_DATA-DELIV_NUMB = PV_VBELN .
LT_ITEM_DATA-DELIV_ITEM = LS_ITEM-POSNR .
LT_ITEM_DATA-DLV_QTY = LS_ITEM-LFIMG .
* LT_ITEM_DATA-MATERIAL = LV_MATNR.
LT_ITEM_DATA-BATCH = LS_ITEM-CHARG."批次
APPEND LT_ITEM_DATA .
*行项目控制
LT_ITEM_CONTROL-DELIV_NUMB = PV_VBELN..
LT_ITEM_CONTROL-DELIV_ITEM = LS_ITEM-POSNR.
LT_ITEM_CONTROL-CHG_DELQTY = 'X'.
LT_ITEM_CONTROL-VOLUME_FLG = 'X'.
APPEND LT_ITEM_CONTROL TO LT_ITEM_CONTROL.
CLEAR LT_ITEM_CONTROL.
ENDLOOP.
READ TABLE LT_ITEMS INDEX 1 .
"查 HEADER_DEADLINES 说明得到下面提示
*- WSHDRLFDAT Delivery date
*- WSHDRWADAT Goods issue date (planned)
*- WSHDRWADTI Goods issue date (actual)
*- WSHDRLDDAT Loading date
*- WSHDRTDDAT Transportation planning date
*- WSHDRKODAT Picking date
CLEAR LT_HDL .
LT_HDL-DELIV_NUMB = PV_VBELN.
LT_HDL-TIMETYPE = 'WSHDRWADTI'. "实际过账日期
LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
APPEND LT_HDL.
CLEAR LT_HDL .
LT_HDL-DELIV_NUMB = PV_VBELN.
LT_HDL-TIMETYPE = 'WSHDRWADAT'. "计划日期
LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
APPEND LT_HDL.
CLEAR LT_HDL .
LT_HDL-DELIV_NUMB = PV_VBELN.
LT_HDL-TIMETYPE = 'WSHDRLDDAT'. "
LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
APPEND LT_HDL.
CLEAR LT_HDL .
LT_HDL-DELIV_NUMB = PV_VBELN.
LT_HDL-TIMETYPE = 'WSHDRTDDAT'. "
LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
APPEND LT_HDL.
CLEAR: LS_EXTENSION2.
LS_EXTENSION2-FIELD = 'BUDAT'.
LS_EXTENSION2-VALUE = LT_ITEMS-ZDELIVERY-WADAT_IST.
LS_EXTENSION2-TYPE = 'DATS'.
LS_EXTENSION2-LENGTH = 8.
APPEND LS_EXTENSION2 TO LT_EXTENSION2.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
EXPORTING
HEADER_DATA = LS_HEADER_DATA
HEADER_CONTROL = LS_HEADER_CONTROL
DELIVERY = LV_DELIVERY
TABLES
ITEM_DATA_SPL = LT_IPK[]
ITEM_DATA = LT_ITEM_DATA
ITEM_CONTROL = LT_ITEM_CONTROL
HEADER_DEADLINES = LT_HDL
EXTENSION2 = LT_EXTENSION2
RETURN = LT_RETURN.
DELETE LT_RETURN WHERE TYPE <> 'E'
AND TYPE <> 'A'.
IF LT_RETURN IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
WAIT UP TO 1 SECONDS.
UPDATE LIKP SET VLSTK = ''
ANZPK = '0'
WHERE VBELN = PV_VBELN.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
OUTPUT-VBELN = PV_VBELN .
OUTPUT-ZTYPE = 'S'.
OUTPUT-ZMESSAGE = '交货单过账成功'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
OUTPUT-VBELN = PV_VBELN .
SORT LT_RETURN .
DELETE ADJACENT DUPLICATES FROM LT_RETURN COMPARING ALL FIELDS .
LOOP AT LT_RETURN INTO LS_RETURN.
CONDENSE LS_RETURN-MESSAGE NO-GAPS .
IF OUTPUT-ZMESSAGE IS INITIAL .
OUTPUT-ZMESSAGE = LS_RETURN-MESSAGE .
ELSE.
CONCATENATE OUTPUT-ZMESSAGE LS_RETURN-MESSAGE INTO OUTPUT-ZMESSAGE SEPARATED BY ';'.
ENDIF.
ENDLOOP.
OUTPUT-ZTYPE = 'E'.
ENDIF.
ENDFORM .