*&---------------------------------------------------------------------* *& Form FRM_DN_POST *&---------------------------------------------------------------------* *& text 參照UB單建立DN 併發貨過帳 *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_dn_post . DATA:lt_stock_items TYPE TABLE OF bapidlvreftosto. DATA:ls_stock_items TYPE bapidlvreftosto. DATA:lt_created_items TYPE TABLE OF bapidlvitemcreated. DATA:ls_created_items TYPE bapidlvitemcreated. DATA:lv_delivery TYPE bapishpdelivnumb-deliv_numb. DATA:lv_vstel TYPE vstel. DATA:lv_ledat TYPE ledat. DATA:lt_return TYPE TABLE OF bapiret2. DATA:ls_header_data LIKE bapiobdlvhdrchg. DATA:ls_header_ctrl LIKE bapiobdlvhdrctrlchg. DATA:lt_item_data LIKE TABLE OF bapiobdlvitemchg. DATA:ls_item_data LIKE bapiobdlvitemchg. DATA:lt_item_data_spl LIKE TABLE OF /spe/bapiobdlvitemchg. DATA:ls_item_data_spl LIKE /spe/bapiobdlvitemchg. DATA:lt_item_control LIKE TABLE OF bapiobdlvitemctrlchg. DATA:ls_item_control LIKE bapiobdlvitemctrlchg. DATA:lt_vbpok_tab TYPE TABLE OF vbpok. DATA:ls_vbpok_tab TYPE vbpok. DATA:ls_techn_control TYPE bapidlvcontrol. DATA:ls_header_control TYPE bapiobdlvhdrctrlchg. DATA:ls_vbkok TYPE vbkok. DATA:lt_prot TYPE TABLE OF prott. DATA:lv_flag TYPE c, lv_message TYPE string, lv_message1 TYPE string, lv_mblnr TYPE mkpf-mblnr, lv_mjahr TYPE mkpf-mjahr. **取到選中的訂單號 LOOP AT gt_doc ASSIGNING <gf_doc> WHERE sel = 'X' AND zstatus <> 'S'. gs_key-ebeln = <gf_doc>-ebeln. COLLECT gs_key INTO gt_key. ENDLOOP. **經過訂單號處理 LOOP AT gt_key INTO gs_key. **s1.根據UB建立DN **清變量 CLEAR: lv_message,lv_flag, lv_delivery, ls_stock_items,lt_stock_items, ls_created_items,lt_created_items, lt_return. **參數賦值 LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. ls_stock_items-ref_doc = <gf_doc>-ebeln. "參考憑證 ls_stock_items-ref_item = <gf_doc>-ebelp."參考項 APPEND ls_stock_items TO lt_stock_items. ls_created_items-ref_doc = <gf_doc>-ebeln. "參考憑證 ls_created_items-ref_item = <gf_doc>-ebelp."參考項 ls_created_items-material = <gf_doc>-zmatnr."物料編號 ls_created_items-material_long = <gf_doc>-zmatnr."物料編號 APPEND ls_created_items TO lt_created_items. ENDLOOP. * DATA(lv_flag) = 'Y'. * EXPORT lv_flag TO MEMORY ID 'ZPOS_LGORT_FLAG'. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO' EXPORTING ship_point = lv_vstel due_date = lv_ledat IMPORTING delivery = lv_delivery TABLES stock_trans_items = lt_stock_items created_items = lt_created_items return = lt_return. FREE MEMORY ID 'ZPOS_LGORT_FLAG'. DELETE lt_return WHERE type = 'E' AND id = 'BAPI' AND number = '001'. LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E'. lv_flag = 'E'. CONCATENATE lv_message ls_return-message INTO lv_message SEPARATED BY '/'. ENDLOOP. IF lv_flag = 'E'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. <gf_doc>-cldat = sy-datum. <gf_doc>-cltim = sy-uzeit. <gf_doc>-clnam = sy-uname. * IF lv_flag = 'E'. <gf_doc>-zstatus = 'E'. <gf_doc>-zmessage = lv_message. <gf_doc>-icon = '@5C@'. * ELSE. * <gf_doc>-zstatus = '1'. * <gf_doc>-zmessage = 'DN建立成功'. ** <gf_doc>-ICON = '@5B@'. * <gf_doc>-vbeln = lv_delivery. ** <gf_doc>-posnr = lv_mjahr. * ENDIF. PERFORM frm_update_db. ENDLOOP. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. **s2.修改DN CLEAR:lv_mblnr,lv_mjahr, ls_header_data,ls_header_ctrl, ls_item_data,lt_item_data, ls_item_data_spl,lt_item_data_spl, ls_item_control,lt_item_control. **參數賦值 ls_header_data-deliv_numb = lv_delivery. ls_header_ctrl-deliv_numb = lv_delivery. **記錄DN建立結果 LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. <gf_doc>-cldat = sy-datum. <gf_doc>-cltim = sy-uzeit. <gf_doc>-clnam = sy-uname. <gf_doc>-zstatus = '1'. <gf_doc>-zmessage = 'DN建立成功'. ** <gf_doc>-ICON = '@5B@'. <gf_doc>-vbeln = lv_delivery. DATA: ls_lips LIKE lips. **經過VGBEL VGPOS CLEAR: ls_lips. SELECT SINGLE *"posnr INTO <gf_doc>-posnr INTO ls_lips FROM lips WHERE vgbel = <gf_doc>-ebeln AND vgpos = <gf_doc>-ebelp. <gf_doc>-posnr = ls_lips-posnr. PERFORM frm_update_db. **要修改:存儲地點 數量 批次 ls_item_data-deliv_numb = lv_delivery."交貨 ls_item_data-deliv_item = ls_lips-posnr."交貨項目 ls_item_data-material = ls_lips-matnr."物料編號 ls_item_data-dlv_qty = <gf_doc>-zlfimg."數量 * ls_item_data-batch = lips-charg."批次 ls_item_data-fact_unit_nom = ls_lips-umvkz. ls_item_data-fact_unit_denom = ls_lips-umvkn. APPEND ls_item_data TO lt_item_data. CLEAR:ls_item_data. ls_item_data_spl-deliv_numb = ls_lips-vbeln."交貨單 ls_item_data_spl-deliv_item = ls_lips-posnr."交貨單行項目 ls_item_data_spl-stge_loc = <gf_doc>-zlgort. "庫存地點 APPEND ls_item_data_spl TO lt_item_data_spl. CLEAR:ls_item_data_spl. ls_item_control-deliv_numb = ls_lips-vbeln."交貨單 ls_item_control-deliv_item = ls_lips-posnr."交貨單行項目 ls_item_control-chg_delqty = 'X'. APPEND ls_item_control TO lt_item_control. CLEAR:ls_item_control. ENDLOOP. IF lt_item_data IS NOT INITIAL. CLEAR:lt_return. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE' EXPORTING header_data = ls_header_data header_control = ls_header_ctrl delivery = lv_delivery TABLES item_data = lt_item_data item_data_spl = lt_item_data_spl item_control = lt_item_control return = lt_return. READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. <gf_doc>-zmessage = 'DN修改爲功'. **記錄DN修改結果 LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. <gf_doc>-cldat = sy-datum. <gf_doc>-cltim = sy-uzeit. <gf_doc>-clnam = sy-uname. <gf_doc>-zstatus = '2'. <gf_doc>-zmessage = 'DN修改爲功'. ** <gf_doc>-ICON = '@5B@'. PERFORM frm_update_db. ENDLOOP. **s3.DN過帳 **清變量 CLEAR:lv_mblnr,lv_mjahr, ls_vbkok,lv_flag, lt_prot, ls_vbpok_tab,lt_vbpok_tab. SELECT * FROM lips INTO TABLE @DATA(lt_lips) WHERE vbeln = @lv_delivery. LOOP AT lt_lips ASSIGNING FIELD-SYMBOL(<fs_lips>). CLEAR:ls_vbpok_tab. ls_vbpok_tab-vbeln_vl = <fs_lips>-vbeln. "交貨. ls_vbpok_tab-posnr_vl = <fs_lips>-posnr."原行項目 ls_vbpok_tab-vbeln = <fs_lips>-vbeln. "交貨. ls_vbpok_tab-posnn = <fs_lips>-posnr."交貨項目 ls_vbpok_tab-matnr = <fs_lips>-matnr."物料編號 ls_vbpok_tab-charg = <fs_lips>-charg."批號 ls_vbpok_tab-lfimg = <fs_lips>-lfimg. ls_vbpok_tab-meins = <fs_lips>-meins. ls_vbpok_tab-werks = <fs_lips>-werks ."庫存地點 ls_vbpok_tab-lgort = 9000 . "庫存地點 ls_vbpok_tab-kzlgo = 'X'. "庫存地點可修改 ls_vbpok_tab-pikmg = <fs_lips>-lfimg."撿配數量 ls_vbpok_tab-lgmng = <fs_lips>-lfimg."交貨量 APPEND ls_vbpok_tab TO lt_vbpok_tab. CLEAR:ls_item_data_spl. ls_item_data_spl-deliv_numb = <fs_lips>-vbeln."交貨 ls_item_data_spl-deliv_item = <fs_lips>-posnr."原行項目 ls_item_data_spl-stge_loc = 9000. "庫存地點 APPEND ls_item_data_spl TO lt_item_data_spl. ENDLOOP. ls_header_data-deliv_numb = lv_delivery."交貨 ls_techn_control-upd_ind = 'U'. ls_header_control-deliv_numb = lv_delivery."交貨 lv_delivery = lv_delivery."交貨 ls_vbkok-vbeln_vl = lv_delivery. ls_vbkok-wabuc = 'X'. ls_vbkok-wadat_ist = sy-datum. CALL FUNCTION 'WS_DELIVERY_UPDATE' EXPORTING vbkok_wa = ls_vbkok delivery = lv_delivery update_picking = 'X' IMPORTING ef_error_in_goods_issue_0 = lv_flag TABLES prot = lt_prot vbpok_tab = lt_vbpok_tab EXCEPTIONS error_message = 1 OTHERS = 2. LOOP AT lt_prot INTO DATA(ls_prot) WHERE msgty = 'E'. lv_flag = 'E'. CLEAR:lv_message1. MESSAGE ID ls_prot-msgid TYPE ls_prot-msgty NUMBER ls_prot-msgno WITH ls_prot-msgv1 ls_prot-msgv2 ls_prot-msgv3 ls_prot-msgv4 INTO lv_message1. CONCATENATE lv_message lv_message1 INTO lv_message SEPARATED BY '/'. ENDLOOP. IF lv_flag = 'E'. "建立失敗 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. **狀態跟新+回寫落地表 LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. <gf_doc>-cldat = sy-datum. <gf_doc>-cltim = sy-uzeit. <gf_doc>-clnam = sy-uname. <gf_doc>-zstatus = 'E'. <gf_doc>-zmessage = 'DN過帳失敗:' && lv_message. <gf_doc>-icon = '@5C@'. PERFORM frm_update_db. ENDLOOP. ELSE. "建立成功 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. SELECT SINGLE mblnr mjahr INTO (lv_mblnr,lv_mjahr) FROM mseg WHERE vbeln_im = lv_delivery. LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. <gf_doc>-cldat = sy-datum. <gf_doc>-cltim = sy-uzeit. <gf_doc>-clnam = sy-uname. <gf_doc>-mblnr = lv_mblnr. <gf_doc>-mjahr = lv_mjahr. <gf_doc>-zstatus = 'S'. <gf_doc>-zdjzt = 'X'. * <gf_doc>-zmessage = 'DN過帳失敗:' && lv_message. <gf_doc>-icon = '@5B@'. PERFORM frm_update_db. ENDLOOP. ENDIF. ***狀態跟新+回寫落地表 * LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln. * <gf_doc>-cldat = sy-datum. * <gf_doc>-cltim = sy-uzeit. * <gf_doc>-clnam = sy-uname. * IF lv_flag = 'E'. * <gf_doc>-zstatus = 'E'. * <gf_doc>-zmessage = 'DN過帳失敗:' && lv_message. * <gf_doc>-icon = '@5C@'. * ELSE. * <gf_doc>-zstatus = 'S'. * <gf_doc>-zmessage = 'DN過帳成功'. * <gf_doc>-icon = '@5B@'. ***怎麼取憑證號 * <gf_doc>-mblnr = lv_delivery. * <gf_doc>-mjahr = lv_mjahr. * ENDIF. * * PERFORM frm_update_db. * * ENDLOOP. ELSE. "修改失敗 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. <gf_doc>-zmessage = '交貨單修改失敗'. ENDIF. ENDIF. ENDIF. ENDLOOP. * "獲取採購訂單數據-行項目數據 * SELECT * * FROM ekpo * INTO TABLE @DATA(lt_ekpo) * WHERE ebeln = @iv_ebeln."採購訂單 * LOOP AT lt_ekpo INTO DATA(ls_ekpo). * * ls_stock_items-ref_doc = ls_ekpo-ebeln."參考憑證 * ls_stock_items-ref_item = ls_ekpo-ebelp."參考項 * APPEND ls_stock_items TO lt_stock_items. * ls_created_items-ref_doc = ls_ekpo-ebeln."參考憑證 * ls_created_items-ref_item = ls_ekpo-ebelp."參考項 * ls_created_items-material = ls_ekpo-matnr."物料編號 * ls_created_items-material_long = ls_ekpo-matnr."物料編號 * APPEND ls_created_items TO lt_created_items. * ENDLOOP. * ** DATA(lv_flag) = 'Y'. ** EXPORT lv_flag TO MEMORY ID 'ZPOS_LGORT_FLAG'. * CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO' * EXPORTING * ship_point = lv_vstel * due_date = lv_ledat * IMPORTING * delivery = lv_delivery * TABLES * stock_trans_items = lt_stock_items * created_items = lt_created_items * return = lt_return. * FREE MEMORY ID 'ZPOS_LGORT_FLAG'. * * DELETE lt_return WHERE type = 'E' AND id = 'BAPI' AND number = '001'. * * LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E'. * CONCATENATE o_return-message ls_return-message INTO o_return-message SEPARATED BY '/'. * ENDLOOP. * * IF sy-subrc = 0. * * "建立失敗 * CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. * * o_return-type = 'E'. * CONCATENATE '交貨單建立失敗:' o_return-message INTO o_return-message. * * ELSE. * * "建立成功 * CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' * EXPORTING * wait = 'X'. * * o_return-zdjh = lv_delivery."交貨單 * o_return-type = 'S'. * o_return-message = '交貨單建立成功'. * * ls_header_data-deliv_numb = lv_delivery. * ls_header_ctrl-deliv_numb = lv_delivery. * * SELECT * * FROM lips * INTO TABLE @DATA(lt_lips) * WHERE vbeln = @lv_delivery. * * LOOP AT lt_lips INTO DATA(ls_lips). * ls_item_data-deliv_numb = ls_lips-vbeln."交貨 * ls_item_data-deliv_item = ls_lips-posnr."交貨項目 * ls_item_data-material = ls_lips-matnr."物料編號 * ls_item_data-dlv_qty = ''."越庫業務:建立DN時,數量都變爲0 * ls_item_data-fact_unit_nom = ls_lips-umvkz. * ls_item_data-fact_unit_denom = ls_lips-umvkn. * APPEND ls_item_data TO lt_item_data. * CLEAR:ls_item_data. * * ls_item_data_spl-deliv_numb = ls_lips-vbeln."交貨單 * ls_item_data_spl-deliv_item = ls_lips-posnr."交貨單行項目 * ls_item_data_spl-stge_loc = ls_lips-lgort. "庫存地點 * APPEND ls_item_data_spl TO lt_item_data_spl. * CLEAR:ls_item_data_spl. * * ls_item_control-deliv_numb = ls_lips-vbeln."交貨單 * ls_item_control-deliv_item = ls_lips-posnr."交貨單行項目 * ls_item_control-chg_delqty = 'X'. * APPEND ls_item_control TO lt_item_control. * CLEAR:ls_item_control. * * ENDLOOP. * * IF lt_item_data IS NOT INITIAL. * CLEAR:lt_return. * * CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE' * EXPORTING * header_data = ls_header_data * header_control = ls_header_ctrl * delivery = lv_delivery * TABLES * item_data = lt_item_data * item_data_spl = lt_item_data_spl * item_control = lt_item_control * return = lt_return. * * READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'. * IF sy-subrc <> 0. * CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' * EXPORTING * wait = 'X'. * o_return-message = '交貨單建立成功/交貨單修改爲功'. * ELSE. * "修改失敗 * CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. * o_return-message = '交貨單建立成功/交貨單修改失敗'. * ENDIF. * * ENDIF. * * ENDIF. ENDFORM.