修改交货单做批次拆分
Posted rainysblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改交货单做批次拆分相关的知识,希望对你有一定的参考价值。
*&---------------------------------------------------------------------* *& Form frm_dn_batch *&---------------------------------------------------------------------* *& 批次拆分 *&---------------------------------------------------------------------* *& --> LT_TEMP *&---------------------------------------------------------------------* FORM frm_dn_batch TABLES pt_data TYPE tyt_out. TYPES: BEGIN OF ty_ck, ebeln TYPE ekko-ebeln, ebelp TYPE ekpo-ebelp, charg TYPE mseg-charg, menge TYPE mseg-menge, END OF ty_ck. DATA: ls_ck TYPE ty_ck, lt_ck TYPE TABLE OF ty_ck, ls_rk TYPE ty_ck, lt_rk TYPE TABLE OF ty_ck. TYPES: BEGIN OF ty_lips, vbeln TYPE lips-vbeln, posnr TYPE lips-posnr, vgbel TYPE lips-vgbel, vgpos TYPE lips-vgpos, matnr TYPE lips-matnr, lfimg TYPE lips-lfimg, lgort TYPE lips-lgort, umvkz TYPE lips-umvkz, umvkn TYPE lips-umvkn, meins TYPE lips-meins, vrkme TYPE lips-vrkme, END OF ty_lips. DATA: ls_lips_temp TYPE ty_lips, lt_lips_temp TYPE TABLE OF ty_lips, ls_lips TYPE ty_lips, lt_lips TYPE TABLE OF ty_lips. TYPES: BEGIN OF ty_ebeln, zebeln TYPE zmmt0186-zebeln, zebelp TYPE zmmt0186-zebelp, zmatnr TYPE zmmt0186-zmatnr, zlfimg TYPE zmmt0186-zlfimg, zlgort TYPE zmmt0186-zlgort, END OF ty_ebeln. DATA: ls_ebeln TYPE ty_ebeln, lt_ebeln TYPE TABLE OF ty_ebeln. DATA: lv_delivery TYPE bapishpdelivnumb-deliv_numb, ls_item_data TYPE bapiobdlvitemchg, lt_item_data TYPE TABLE OF bapiobdlvitemchg, ls_item_control TYPE bapiobdlvitemctrlchg, lt_item_control TYPE TABLE OF bapiobdlvitemctrlchg, ls_item_data_spl TYPE /spe/bapiobdlvitemchg, lt_item_data_spl TYPE TABLE OF /spe/bapiobdlvitemchg, lt_return TYPE TABLE OF bapiret2, ls_header_data TYPE bapiobdlvhdrchg, ls_header_control TYPE bapiobdlvhdrctrlchg, ls_techn_control TYPE bapidlvcontrol, "TECHN_CONTROL ls_likp TYPE likp, lt_ekpo TYPE TABLE OF ekpo, lv_tabix TYPE sy-tabix, lv_lfimg TYPE lips-lfimg, lv_flag TYPE char1 VALUE ‘X‘, lv_mes TYPE string, lv_updat TYPE sy-datum, lv_uptim TYPE sy-uzeit, lv_upnam TYPE sy-uname, lv_contactid TYPE zmmt0186-contactid, lcl_error TYPE REF TO cx_sy_open_sql_db, lv_error_text TYPE string, ls_data TYPE ty_out, lv_lgort TYPE lips-lgort. DATA: lv_ebeln TYPE ekko-ebeln, lv_vbeln TYPE likp-vbeln, lv_posnr TYPE lips-posnr VALUE ‘900000‘. FIELD-SYMBOLS <fs_ck> TYPE ty_ck. DEFINE mcr_input_data. ls_item_data-deliv_numb = ls_lips-vbeln. ls_item_data-deliv_item = &1. "项目号 ls_item_data-material = ls_lips-matnr. " ls_item_data-dlv_qty = &2. "数量 " ls_item_data-dlv_qty_imunit = &2. ls_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子) ls_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(除数) ls_item_data-base_uom = ls_lips-meins. "基本单位 ls_item_data-sales_unit = ls_lips-vrkme. "销售单位 ls_item_data-batch = &3. "新批次 ls_item_data-hieraritem = &4. "上级行项目 ls_item_data-usehieritm = &5. APPEND ls_item_data TO lt_item_data. ls_item_data_spl-deliv_numb = ls_lips-vbeln. ls_item_data_spl-deliv_item = &1. ls_item_data_spl-stge_loc = lv_lgort. APPEND ls_item_data_spl TO lt_item_data_spl. ls_item_control-deliv_numb = ls_lips-vbeln. ls_item_control-deliv_item = &1. ls_item_control-chg_delqty = ‘X‘. APPEND ls_item_control TO lt_item_control. END-OF-DEFINITION. IF sy-batch = ‘X‘. WAIT UP TO 10 SECONDS. ENDIF. READ TABLE pt_data INTO ls_data INDEX 1. IF ls_data-dnflg_b = ‘X‘ OR ls_data-dnflg = ‘‘. RETURN. ENDIF. lv_contactid = ls_data-contactid. lv_ebeln = ls_data-zebeln. lv_vbeln = ls_data-vbeln. *&-----知心出库数量 SELECT ebeln ebelp charg SUM( menge ) INTO TABLE lt_ck FROM ekbe WHERE ebeln = lv_ebeln AND bwart in (‘161‘,‘674‘) GROUP BY ebeln ebelp charg. *&-----蜀南入库数量 SELECT ebeln ebelp charg SUM( menge ) INTO TABLE lt_rk FROM ekbe WHERE ebeln = lv_ebeln AND bwart in (‘673‘,‘162‘) GROUP BY ebeln ebelp charg. *&-----库存 SORT lt_ck BY ebeln ebelp charg. SORT lt_rk BY ebeln ebelp charg. LOOP AT lt_ck ASSIGNING <fs_ck>. READ TABLE lt_rk INTO ls_rk WITH KEY ebeln = <fs_ck>-ebeln ebelp = <fs_ck>-ebelp BINARY SEARCH. IF sy-subrc = 0. <fs_ck>-menge = <fs_ck>-menge - ls_rk-menge. ENDIF. ENDLOOP. *&-----取交货明细合并 SELECT SINGLE * INTO ls_likp FROM likp WHERE vbeln = lv_vbeln. SELECT a~vbeln a~posnr a~vgbel a~vgpos a~matnr a~lfimg a~lgort a~umvkz a~umvkn a~meins a~vrkme INTO TABLE lt_lips_temp FROM lips AS a WHERE vbeln = lv_vbeln. LOOP AT pt_data INTO ls_data. ls_ebeln-zebeln = ls_data-zebeln. ls_ebeln-zebelp = ls_data-zebelp. ls_ebeln-zmatnr = ls_data-zmatnr. ls_ebeln-zlfimg = ls_data-zlfimg. ls_ebeln-zlgort = ls_data-zlgort. COLLECT ls_ebeln INTO lt_ebeln. ENDLOOP. LOOP AT lt_lips_temp INTO ls_lips. LOOP AT lt_ebeln INTO ls_ebeln WHERE zebeln = ls_lips-vgbel AND zebelp = ls_lips-vgpos. * ls_lips-lfimg = ls_ebeln-zlfimg. ls_lips-lgort = ls_ebeln-zlgort. APPEND ls_lips TO lt_lips. ENDLOOP. ENDLOOP. *&----- 批次拆分过账 lv_delivery = lv_vbeln. ls_header_data-deliv_numb = lv_delivery. ls_header_control-deliv_numb = lv_delivery. * BREAK-POINT. LOOP AT lt_lips INTO ls_lips. lv_lgort = ls_lips-lgort. CLEAR lv_tabix. lv_lfimg = ls_lips-lfimg. LOOP AT lt_ck ASSIGNING <fs_ck> WHERE ebeln = ls_lips-vgbel AND ebelp = ls_lips-vgpos AND menge > 0. lv_tabix = lv_tabix + 1. IF lv_lfimg <= <fs_ck>-menge. IF lv_tabix = 1. *&----- 满足,不用批次拆分. mcr_input_data ls_lips-posnr lv_lfimg <fs_ck>-charg ‘‘ ‘‘. ELSE. *&-----拆分批次行 lv_posnr = lv_posnr + 1. mcr_input_data lv_posnr lv_lfimg <fs_ck>-charg ls_lips-posnr ‘1‘. ENDIF. <fs_ck>-menge = <fs_ck>-menge - lv_lfimg. lv_lfimg = 0. CONTINUE. ELSE. *&-----不满足,如果启用批次,需用批次拆分. IF <fs_ck>-charg IS INITIAL. mcr_input_data ls_lips-posnr lv_lfimg <fs_ck>-charg ‘‘ ‘‘. ELSE. *&-----主行 IF lv_tabix = 1. mcr_input_data ls_lips-posnr 0 ‘‘ ‘‘ ‘‘. ENDIF. *&-----拆分批次行 lv_posnr = lv_posnr + 1. mcr_input_data lv_posnr <fs_ck>-menge <fs_ck>-charg ls_lips-posnr ‘1‘. ENDIF. *&----- lv_lfimg = lv_lfimg - <fs_ck>-menge. <fs_ck>-menge = 0. ENDIF. ENDLOOP. IF lv_lfimg <> 0. lv_mes = lv_delivery && ‘批次库存不够拆分‘. lv_flag = ‘‘. ENDIF. ENDLOOP. IF lv_flag = ‘X‘. CALL FUNCTION ‘BAPI_OUTB_DELIVERY_CHANGE‘ EXPORTING header_data = ls_header_data header_control = ls_header_control delivery = lv_delivery techn_control = ls_techn_control TABLES item_data = lt_item_data item_control = lt_item_control item_data_spl = lt_item_data_spl return = lt_return. LOOP AT lt_return INTO DATA(ls_return) WHERE type = ‘E‘. IF ls_return-message IS INITIAL. MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number INTO ls_return-message WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4. ENDIF. CONCATENATE lv_mes ls_return-message INTO lv_mes SEPARATED BY ‘/‘. ENDLOOP. IF sy-subrc = 0. "创建失败 CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘. lv_flag = ‘‘. ELSE. "创建成功 CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘ EXPORTING wait = ‘X‘. lv_flag = ‘X‘. ENDIF. ENDIF. lv_updat = sy-datum. lv_uptim = sy-uzeit. lv_upnam = sy-uname. LOOP AT pt_data ASSIGNING FIELD-SYMBOL(<fs_temp>). UPDATE zmmt0186 SET dnflg_b = lv_flag dndat_b = sy-datum dntim_b = sy-uzeit dnnam_b = sy-uname dnmes_b = lv_mes WHERE contactid = <fs_temp>-contactid AND receiptkey = <fs_temp>-receiptkey AND receiptkeyno = <fs_temp>-receiptkeyno. <fs_temp>-dnflg_b = lv_flag. <fs_temp>-dndat_b = sy-datum. <fs_temp>-dntim_b = sy-uzeit. <fs_temp>-dnnam_b = sy-uname. <fs_temp>-dnmes_b = lv_mes. READ TABLE gt_out ASSIGNING FIELD-SYMBOL(<fs_data>) WITH KEY contactid = <fs_temp>-contactid receiptkey = <fs_temp>-receiptkey receiptkeyno = <fs_temp>-receiptkeyno. IF sy-subrc = 0. <fs_data>-dnflg_b = lv_flag. <fs_data>-dndat_b = sy-datum. <fs_data>-dntim_b = sy-uzeit. <fs_data>-dnnam_b = sy-uname. <fs_data>-dnmes_b = lv_mes. ENDIF. ENDLOOP. COMMIT WORK AND WAIT. ENDFORM.
以上是关于修改交货单做批次拆分的主要内容,如果未能解决你的问题,请参考以下文章
◆◆0[BAPI]外向交货单按批次拆分[BAPI_OUTB_DELIVERY_CHANGE]