*&---------------------------------------------------------------------* *& 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.