【ABAP】SAP外向交货单取消拣配数量实现 |
您所在的位置:网站首页 › 交货lt › 【ABAP】SAP外向交货单取消拣配数量实现 |
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 |