外向交货取消发货bapi: WS_REVERSE_GOODS_ISSUE
外向交货单删除批次拆分行:BAPI_OUTB_DELIVERY_CHANGE
但是两个bapi同时使用时,会报错VL 216,解决方法如下:
代码如下:
REPORT zvl09_test.
TABLES:likp.
DATA:et_mesg TYPE TABLE OF mesg,
es_emkpf TYPE emkpf,
lv_vbtyp TYPE likp-vbtyp.
PARAMETERS:p_vbeln LIKE likp-vbeln.
CLEAR lv_vbtyp.
SELECT SINGLE
vbtyp
INTO lv_vbtyp
FROM likp
WHERE likp~vbeln = p_vbeln.
* VL09外向交货取消发货
CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
EXPORTING
i_vbeln = input-vbeln
i_budat = p_budat
i_tcode = 'VL09'
i_vbtyp = lv_vbtyp
IMPORTING
es_emkpf = es_emkpf
TABLES
t_mesg = et_mesg
EXCEPTIONS
error_reverse_goods_issue = 1
OTHERS = 2.
IF o_es_emkpf-mblnr <> ''.
COMMIT WORK AND WAIT.
* 外向交货单删除批次拆分行:BAPI_OUTB_DELIVERY_CHANGE
* 此处注意:一定要用DESTINATION 'NONE'
CALL FUNCTION 'ZFUNC_DELIVERY_BATCH_CHANGE' DESTINATION 'NONE'
EXPORTING
i_vbeln = p_vbeln.
ELSE.
ROLLBACK WORK.
ENDIF.
ZFUNC_DELIVERY_BATCH_CHANGE 函数代码如下:
FUNCTION zfunc_delivery_batch_change.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_VBELN) TYPE VBELN
*"----------------------------------------------------------------------
DATA: ls_header_data TYPE bapiobdlvhdrchg,
ls_header_control TYPE bapiobdlvhdrctrlchg,
lt_batch_item TYPE STANDARD TABLE OF bapiobdlvitemchg,
ls_batch_item TYPE bapiobdlvitemchg,
lt_batch_control TYPE STANDARD TABLE OF bapiobdlvitemctrlchg,
ls_batch_control TYPE bapiobdlvitemctrlchg,
techn_control LIKE bapidlvcontrol, "TECHN_CONTROL
lt_lips TYPE STANDARD TABLE OF lips WITH HEADER LINE,
ls_lips TYPE lips,
lt_lips_split TYPE STANDARD TABLE OF lips,
ls_lips_split TYPE lips,
lt_return_tab TYPE TABLE OF bapiret2,
ls_return_tab TYPE bapiret2,
lv_message TYPE string,
lv_all_message TYPE string,
ls_vbkok TYPE vbkok,
lt_vbkok TYPE STANDARD TABLE OF vbkok,
lt_prott TYPE STANDARD TABLE OF prott,
ls_prott TYPE prott,
lt_vbpok TYPE STANDARD TABLE OF vbpok,
ls_vbpok TYPE vbpok,
lv_flag TYPE char01.
* 利用函数:BAPI_OUTB_DELIVERY_CHANGE取消拣配的批次数据
"Header
ls_header_data-deliv_numb = i_vbeln.
ls_header_control-deliv_numb = i_vbeln.
techn_control-upd_ind = 'U' .
CLEAR:lt_lips, ls_lips.
SELECT * INTO TABLE lt_lips
FROM lips
WHERE vbeln = i_vbeln
AND uecha EQ space.
LOOP AT lt_lips INTO ls_lips.
CLEAR:lt_lips_split, ls_lips_split.
SELECT * INTO TABLE lt_lips_split
FROM lips
WHERE vbeln = i_vbeln
AND uecha = ls_lips-posnr
AND posnr LIKE '9%'.
CLEAR ls_batch_item.
CLEAR ls_batch_control.
ls_batch_item-deliv_numb = i_vbeln. "DN号
ls_batch_item-deliv_item = ls_lips-posnr. "DN Item
ls_batch_item-material = ls_lips-matnr. "物料
IF lt_lips_split IS NOT INITIAL.
ls_batch_item-dlv_qty = ls_lips-kcmeng. "实际已交货量(按销售单位)
ls_batch_item-dlv_qty_imunit = ls_lips-kcmeng. "以仓库保管单位级的实际交货数量
ELSE.
ls_batch_item-dlv_qty = ls_lips-lfimg. "实际已交货量(按销售单位)
ls_batch_item-dlv_qty_imunit = ls_lips-lfimg. "以仓库保管单位级的实际交货数量
ENDIF.
ls_batch_item-base_uom = ls_lips-meins. "DN基本计量单位
ls_batch_item-sales_unit = ls_lips-vrkme. "DN销售单位
ls_batch_item-sales_unit_iso = ls_lips-meins. "DN销售单位的ISO 代码
ls_batch_item-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子)
ls_batch_item-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(分母)
APPEND ls_batch_item TO lt_batch_item.
ls_batch_control-deliv_numb = i_vbeln.
ls_batch_control-deliv_item = ls_lips-posnr.
ls_batch_control-chg_delqty = 'X'.
APPEND ls_batch_control TO lt_batch_control.
IF lt_lips_split IS NOT INITIAL.
LOOP AT lt_lips_split INTO ls_lips_split WHERE uecha = ls_lips-posnr.
CLEAR ls_batch_item.
CLEAR ls_batch_control.
ls_batch_item-deliv_numb = i_vbeln. "被拆分DN号
ls_batch_item-deliv_item = ls_lips_split-posnr. "被拆分DN Item
ls_batch_item-hieraritem = ls_lips-posnr . "项目层次中的高级项目
ls_batch_item-usehieritm = '1' . "使用层次项目
ls_batch_item-material = ls_lips_split-matnr. "物料
ls_batch_item-dlv_qty = ls_lips_split-lfimg. "交货数量
ls_batch_item-sales_unit = ls_lips_split-vrkme. "被拆分DN销售单位
ls_batch_item-sales_unit_iso = ls_lips_split-meins. "被拆分DN基本单位
ls_batch_item-fact_unit_nom = ls_lips_split-umvkz. "销售数量转换成SKU的分子(因子)
ls_batch_item-fact_unit_denom = ls_lips_split-umvkn. "销售数量转换为 SKU 的值(分母)
APPEND ls_batch_item TO lt_batch_item.
ls_batch_control-deliv_numb = i_vbeln.
ls_batch_control-deliv_item = ls_lips_split-posnr.
ls_batch_control-del_item = 'X'.
APPEND ls_batch_control TO lt_batch_control.
ENDLOOP.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = i_vbeln
techn_control = techn_control
TABLES
item_data = lt_batch_item
item_control = lt_batch_control
return = lt_return_tab
EXCEPTIONS
error_message = 1
OTHERS = 2.
LOOP AT lt_return_tab INTO ls_return_tab WHERE type CA 'EAX'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_return_tab-id
msgnr = ls_return_tab-number
msgv1 = ls_return_tab-message_v1
msgv2 = ls_return_tab-message_v2
msgv3 = ls_return_tab-message_v3
msgv4 = ls_return_tab-message_v4
IMPORTING
message_text_output = lv_message.
CONCATENATE lv_all_message lv_message INTO lv_all_message.
ENDLOOP.
IF lv_all_message IS NOT INITIAL .
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
* 利用函数:WS_DELIVERY_UPDATE拣配数量的调整
CLEAR:ls_vbpok,lv_flag,lv_message,lv_all_message,lt_prott.
ls_vbkok-vbeln_vl = i_vbeln.
SELECT *
FROM lips
INTO TABLE lt_lips
WHERE vbeln = i_vbeln.
LOOP AT lt_lips.
SELECT SINGLE * FROM vbfa
INTO @DATA(lw_vbfa)
WHERE vbelv = @lt_lips-vbeln
AND posnv = @lt_lips-posnr
AND vbtyp_n = 'Q'.
ls_vbpok-vbeln_vl = lt_lips-vbeln.
ls_vbpok-posnr_vl = lt_lips-posnr.
ls_vbpok-vbeln = lw_vbfa-vbeln.
ls_vbpok-posnn = lw_vbfa-posnn.
ls_vbpok-vbtyp_n = 'Q'.
ls_vbpok-meins = lt_lips-meins.
ls_vbpok-pikmg = 0.
APPEND ls_vbpok TO lt_vbpok.
ENDLOOP.
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
vbkok_wa = ls_vbkok
synchron = 'X'
commit = 'X'
delivery = i_vbeln
update_picking = 'X'
if_database_update = '1'
nicht_sperren = 'X'
if_error_messages_send_0 = 'X'
TABLES
vbpok_tab = lt_vbpok
prot = lt_prott
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF sy-subrc = 0 .
LOOP AT lt_prott INTO ls_prott WHERE msgty CA 'EAX'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_prott-msgid
msgnr = ls_prott-msgno
msgv1 = ls_prott-msgv1
msgv2 = ls_prott-msgv2
msgv3 = ls_prott-msgv3
msgv4 = ls_prott-msgv4
IMPORTING
message_text_output = lv_message.
CONCATENATE lv_all_message lv_message INTO lv_all_message .
lv_message = lv_all_message.
lv_flag = 'X' .
CLEAR ls_prott.
ENDLOOP.
ELSE.
CLEAR lv_message.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = lv_all_message.
lv_message = lv_all_message.
lv_flag = 'X' .
ENDIF .
IF lv_flag IS INITIAL .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WRITE : 'OK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
WRITE : lv_all_message.
ENDIF.
ENDFUNCTION.