【ABAP】SAP外向交货单取消拣配数量实现

您所在的位置:网站首页 交货lt 【ABAP】SAP外向交货单取消拣配数量实现

【ABAP】SAP外向交货单取消拣配数量实现

2024-07-16 22:21| 来源: 网络整理| 查看: 265

SAP外向交货单取消拣配数量实现

查看外向交货单取消拣配数量函数:WB2_GET_PICK_QUANTITY

CALL FUNCTION 'WB2_GET_PICK_QUANTITY' EXPORTING I_VBELN = IT_XLIPS-VBELN I_POSNR = IT_XLIPS-POSNR IMPORTING E_PIKMG = V_PIKMG EXCEPTIONS DOCUMENT_READ_ERROR = 1 OTHERS = 2.

通过事务代码“VL02N”将交货单“8200000036”完全拣配。

查看上述函数的返回结果如下:

 

通过函数逻辑大致可以知道拣配数量(Picking quantity)是通过LIPS/VBFA相关表计算出来的。外向交货单创建后再次进入进行拣配处理,保存后会在VBFA凭证流表中生成如下表中所示的一条记录。

 

我们单纯使用函数“BAPI_OUTB_DELIVERY_CHANGE”可以将拣配的批次数据取消,但无法实现将拣配数量取消。

【源代码】

 

 DATA: ls_header_data    TYPE bapiobdlvhdrchg.       DATA: ls_header_control TYPE bapiobdlvhdrctrlchg.       DATA: lt_batch_item     TYPE STANDARD TABLE OF bapiobdlvitemchg.       DATA: ls_batch_item     TYPE bapiobdlvitemchg.       DATA: lt_batch_control  TYPE STANDARD TABLE OF bapiobdlvitemctrlchg.       DATA: ls_batch_control  TYPE bapiobdlvitemctrlchg.       DATA  : techn_control  LIKE  bapidlvcontrol.  "TECHN_CONTROL       DATA: lt_lips           TYPE STANDARD TABLE OF lips.       DATA: ls_lips           TYPE lips.       DATA: lt_lips_split           TYPE STANDARD TABLE OF lips.       DATA: ls_lips_split            TYPE lips.       DATA: lt_return_tab TYPE TABLE OF bapiret2,             ls_return_tab TYPE  bapiret2.       "Header       ls_header_data-deliv_numb    = vbeln.       ls_header_control-deliv_numb = vbeln.       techn_control-upd_ind =  'U' .       CLEAR:lt_lips, ls_lips.       SELECT * INTO TABLE lt_lips         FROM lips         WHERE vbeln = 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 = vbeln             AND uecha = ls_lips-posnr             AND posnr LIKE '9%'.         CLEAR ls_batch_item.         CLEAR ls_batch_control.         ls_batch_item-deliv_numb         = vbeln.         "DN号         ls_batch_item-deliv_item         = ls_lips-posnr.    "DN Item         ls_batch_item-material           = ls_lips-matnr.    "物料 *  ls_batch_item-batch              = ''.               "批次         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  = 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         = 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  = 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       = 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'.         e_succ = 'E'.         e_message = lv_all_message.       ELSE.         CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'           EXPORTING             wait = 'X'.         e_succ = 'S'.         e_message = '取消成功'.       ENDIF.

至于调整拣配数量这里需要用到函数“WS_DELIVERY_UPDATE”或“WS_DELIVERY_UPDATE_2”。

【源代码】

DATA: ls_vbkok        TYPE vbkok. DATA: lt_vbkok        TYPE STANDARD TABLE OF vbkok. DATA: lt_prott        TYPE STANDARD TABLE OF prott. DATA: ls_prott        TYPE prott. DATA: lt_vbpok        TYPE STANDARD TABLE OF vbpok. DATA: ls_vbpok        TYPE vbpok. DATA: lv_message      TYPE string. DATA: lv_all_message  TYPE string. DATA: lv_flag         TYPE char01. DATA: lt_lips LIKE TABLE OF lips WITH HEADER LINE. PARAMETERS : p_vbeln TYPE likp-vbeln OBLIGATORY. CLEAR:ls_vbpok,lv_flag,lv_message,lv_all_message,lt_prott. ls_vbkok-vbeln_vl = p_vbeln. SELECT  * FROM lips   INTO TABLE lt_lips   WHERE vbeln = p_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                 = p_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.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3