一、背景有一项业务比较特殊金靶的回收加工既会有物料的消耗也会收进上一批加工洗出来的物料并且组件物料会带有批次MIGO过账时需要填写批次那么对应BAPI也需要加入这一部分批次。如果组件物料不带有批次MIGO的BAPI过账时传入采购行项目即可组件会在过账时自动带入。解决方法逻辑类似委外采购收货二、相关内容相关的表ekko:采购凭证抬头表 用于判断是否委外ekpo:采购凭证行项目表 用于判断是否委外以及委外采购的数量resb:获取委外采购单中bom的相应预留mseg:获取已经委外原材料出库给供应商的批次mslb:获取提供给供应商的库存以及批次移动类型101采购收货过账541委外原材料出库过账这里用不到543消耗委外原材料出库到供应商的库存的数据545入库到供应商库存三、前端操作采购单因为启用了科目管理所以成本中心也需要输入组件信息这里需要注意前台页面和底表RESB表里存储的数量相反S是负H为正。实际业务和前台显示数据相反S为入库移动类型为545H为消耗移动类型543过账完会发现供应商库存2000002898的会增加2000001603的会减少四、代码示例DATA: gs_goodsmvt_header TYPE bapi2017_gm_head_01, 抬头数据 gt_gm_item TYPE TABLE OF bapi2017_gm_item_create, 项目数据 gs_gm_item TYPE bapi2017_gm_item_create, gt_return TYPE TABLE OF bapiret2, 返回消息 gs_return TYPE bapiret2, lv_goodsmvt_code LIKE bapi2017_gm_code. DATA:lv_materialdocument TYPE bapi2017_gm_head_ret-mat_doc, lv_matdocumentyear TYPE bapi2017_gm_head_ret-doc_year. DATA:lv_matnr_string TYPE string, lv_xchpf_marc TYPE marc-xchpf. DATA: lv_line_id TYPE mseg-line_id VALUE 000000, lv_parent_id TYPE mseg-parent_id VALUE 000000, lv_line_depth TYPE mseg-line_depth VALUE 00. DATA: lv_outfm TYPE mseg-menge, lv_outfz TYPE mseg-menge. gs_gm_item-po_number 0260227009. gs_gm_item-po_item 00020. gs_gm_item-material 采购单上的物料号. gs_gm_item-vendor F000031. gs_gm_item-entry_qnt 3. gs_gm_item-entry_uom 物料单位. gs_gm_item-plant 工厂. gs_gm_item-stge_loc 存储地点. gs_gm_item-move_type 101. gs_gm_item-vendrbatch 供应商批次. gs_gm_item-batch 内部批次. 有则填 lv_xchpf X. lv_line_id lv_line_id 1. lv_parent_id lv_line_id. gs_gm_item-line_id lv_parent_id. 父项目 SELECT SINGLE kostl INTO DATA(lv_kostl) FROM ekkn WHERE ebeln gs_gm_item-po_number. IF lv_kostl IS NOT INITIAL. SELECT SINGLE func_area INTO DATA(lv_area) FROM csks WHERE kostl lv_kostl. ENDIF. gs_gm_item-func_area lv_area.功能范围 APPEND gs_gm_item TO gt_gm_item. CLEAR: gs_gm_item. 上面的过账一般采购收货都是一样的 区别就在下面这个循环需要将bom组件的数据也写入 该项目由外围系统传入故省略去RESB表根据采购订单号取得组件信息 lv_parent_id lv_line_id. LOOP AT ls_item-thirdlevelitems INTO DATA(ls_third). CLEAR gs_gm_item. lv_line_id lv_line_id 1. gs_gm_item-line_id lv_line_id. 子项目编号 gs_gm_item-parent_id lv_parent_id. 父项目编码 lv_line_depth 01. lt_item-line_depth lv_line_depth. bom层次 CALL FUNCTION CONVERSION_EXIT_CUNIT_INPUT EXPORTING input ls_third-unit language sy-langu IMPORTING output ls_third-unit. gs_gm_item-move_type ls_third-movementtype. 移动类型 gs_gm_item-material |{ ls_third-sapitemid ALPHA IN }|. 物料编号 gs_gm_item-vendor |{ ls_item-merchant ALPHA IN }|. 供应商 gs_gm_item-plant ls_item-plant. 工厂 gs_gm_item-stge_loc ls_item-storagelocation. 存储地点 gs_gm_item-batch ls_third-batchnumber. 批次 gs_gm_item-entry_qnt ls_third-quantity. 数量,需要根据采购订单换算 gs_gm_item-entry_uom ls_third-unit. 单位 gs_gm_item-costcenter |{ lv_kostl ALPHA IN }|. 成本中心 gs_gm_item-item_text ls_item-itemtext. 项目文本 gs_gm_item-move_reas ls_item-reasoncode. gs_gm_item-spec_stock O. gs_gm_item-expirydate ls_third-expirationdate. 生产日期 gs_gm_item-prod_date ls_third-productiondate. 最佳使用日期 gs_gm_item-func_area lv_area. IF ls_third-podoc IS NOT INITIAL. PO相关 gs_gm_item-po_number |{ ls_third-podoc ALPHA IN }|. gs_gm_item-po_item ls_third-poitemid. ENDIF. APPEND gs_gm_item TO gt_gm_item. clear:gs_gm_item. ENDLOOP. CALL FUNCTION BAPI_GOODSMVT_CREATE EXPORTING goodsmvt_header gs_goodsmvt_header goodsmvt_code lv_goodsmvt_code IMPORTING materialdocument lv_materialdocument matdocumentyear lv_matdocumentyear TABLES goodsmvt_item gt_gm_item return gt_return. IF lv_doc . CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. ELSE. CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. ENDIF.参考了下列文章的委外BAPI参考链接1.ABAP 委外采购收货调用过账bapi - otowa - 博客园2.【MM模块】Subcontracting 委外加工外包—2_移动类型543-CSDN博客
ABAP 采购带组件收货BAPI
发布时间:2026/5/20 4:07:11
一、背景有一项业务比较特殊金靶的回收加工既会有物料的消耗也会收进上一批加工洗出来的物料并且组件物料会带有批次MIGO过账时需要填写批次那么对应BAPI也需要加入这一部分批次。如果组件物料不带有批次MIGO的BAPI过账时传入采购行项目即可组件会在过账时自动带入。解决方法逻辑类似委外采购收货二、相关内容相关的表ekko:采购凭证抬头表 用于判断是否委外ekpo:采购凭证行项目表 用于判断是否委外以及委外采购的数量resb:获取委外采购单中bom的相应预留mseg:获取已经委外原材料出库给供应商的批次mslb:获取提供给供应商的库存以及批次移动类型101采购收货过账541委外原材料出库过账这里用不到543消耗委外原材料出库到供应商的库存的数据545入库到供应商库存三、前端操作采购单因为启用了科目管理所以成本中心也需要输入组件信息这里需要注意前台页面和底表RESB表里存储的数量相反S是负H为正。实际业务和前台显示数据相反S为入库移动类型为545H为消耗移动类型543过账完会发现供应商库存2000002898的会增加2000001603的会减少四、代码示例DATA: gs_goodsmvt_header TYPE bapi2017_gm_head_01, 抬头数据 gt_gm_item TYPE TABLE OF bapi2017_gm_item_create, 项目数据 gs_gm_item TYPE bapi2017_gm_item_create, gt_return TYPE TABLE OF bapiret2, 返回消息 gs_return TYPE bapiret2, lv_goodsmvt_code LIKE bapi2017_gm_code. DATA:lv_materialdocument TYPE bapi2017_gm_head_ret-mat_doc, lv_matdocumentyear TYPE bapi2017_gm_head_ret-doc_year. DATA:lv_matnr_string TYPE string, lv_xchpf_marc TYPE marc-xchpf. DATA: lv_line_id TYPE mseg-line_id VALUE 000000, lv_parent_id TYPE mseg-parent_id VALUE 000000, lv_line_depth TYPE mseg-line_depth VALUE 00. DATA: lv_outfm TYPE mseg-menge, lv_outfz TYPE mseg-menge. gs_gm_item-po_number 0260227009. gs_gm_item-po_item 00020. gs_gm_item-material 采购单上的物料号. gs_gm_item-vendor F000031. gs_gm_item-entry_qnt 3. gs_gm_item-entry_uom 物料单位. gs_gm_item-plant 工厂. gs_gm_item-stge_loc 存储地点. gs_gm_item-move_type 101. gs_gm_item-vendrbatch 供应商批次. gs_gm_item-batch 内部批次. 有则填 lv_xchpf X. lv_line_id lv_line_id 1. lv_parent_id lv_line_id. gs_gm_item-line_id lv_parent_id. 父项目 SELECT SINGLE kostl INTO DATA(lv_kostl) FROM ekkn WHERE ebeln gs_gm_item-po_number. IF lv_kostl IS NOT INITIAL. SELECT SINGLE func_area INTO DATA(lv_area) FROM csks WHERE kostl lv_kostl. ENDIF. gs_gm_item-func_area lv_area.功能范围 APPEND gs_gm_item TO gt_gm_item. CLEAR: gs_gm_item. 上面的过账一般采购收货都是一样的 区别就在下面这个循环需要将bom组件的数据也写入 该项目由外围系统传入故省略去RESB表根据采购订单号取得组件信息 lv_parent_id lv_line_id. LOOP AT ls_item-thirdlevelitems INTO DATA(ls_third). CLEAR gs_gm_item. lv_line_id lv_line_id 1. gs_gm_item-line_id lv_line_id. 子项目编号 gs_gm_item-parent_id lv_parent_id. 父项目编码 lv_line_depth 01. lt_item-line_depth lv_line_depth. bom层次 CALL FUNCTION CONVERSION_EXIT_CUNIT_INPUT EXPORTING input ls_third-unit language sy-langu IMPORTING output ls_third-unit. gs_gm_item-move_type ls_third-movementtype. 移动类型 gs_gm_item-material |{ ls_third-sapitemid ALPHA IN }|. 物料编号 gs_gm_item-vendor |{ ls_item-merchant ALPHA IN }|. 供应商 gs_gm_item-plant ls_item-plant. 工厂 gs_gm_item-stge_loc ls_item-storagelocation. 存储地点 gs_gm_item-batch ls_third-batchnumber. 批次 gs_gm_item-entry_qnt ls_third-quantity. 数量,需要根据采购订单换算 gs_gm_item-entry_uom ls_third-unit. 单位 gs_gm_item-costcenter |{ lv_kostl ALPHA IN }|. 成本中心 gs_gm_item-item_text ls_item-itemtext. 项目文本 gs_gm_item-move_reas ls_item-reasoncode. gs_gm_item-spec_stock O. gs_gm_item-expirydate ls_third-expirationdate. 生产日期 gs_gm_item-prod_date ls_third-productiondate. 最佳使用日期 gs_gm_item-func_area lv_area. IF ls_third-podoc IS NOT INITIAL. PO相关 gs_gm_item-po_number |{ ls_third-podoc ALPHA IN }|. gs_gm_item-po_item ls_third-poitemid. ENDIF. APPEND gs_gm_item TO gt_gm_item. clear:gs_gm_item. ENDLOOP. CALL FUNCTION BAPI_GOODSMVT_CREATE EXPORTING goodsmvt_header gs_goodsmvt_header goodsmvt_code lv_goodsmvt_code IMPORTING materialdocument lv_materialdocument matdocumentyear lv_matdocumentyear TABLES goodsmvt_item gt_gm_item return gt_return. IF lv_doc . CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. ELSE. CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. ENDIF.参考了下列文章的委外BAPI参考链接1.ABAP 委外采购收货调用过账bapi - otowa - 博客园2.【MM模块】Subcontracting 委外加工外包—2_移动类型543-CSDN博客