SAP ABAP VL09 BAPI VL 216

外向交货取消发货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.

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值