从采购入库到工单发料:一份SAP BAPI_GOODSMVT_CREATE的实战代码模板合集(含101/261/344等移动类型)

张开发
2026/4/20 5:54:17 15 分钟阅读
从采购入库到工单发料:一份SAP BAPI_GOODSMVT_CREATE的实战代码模板合集(含101/261/344等移动类型)
SAP BAPI_GOODSMVT_CREATE实战指南从采购入库到工单发料的完整代码解决方案在SAP系统开发中物料凭证的创建是供应链管理中最基础也最频繁的操作之一。对于ABAP开发者而言能够高效准确地调用BAPI_GOODSMVT_CREATE函数意味着可以为业务部门提供稳定可靠的物料移动解决方案。本文将深入探讨五种典型业务场景下的代码实现帮助开发者快速应对项目需求。1. 核心参数解析与基础配置1.1 GOODSMVT_CODE与移动类型的关系GOODSMVT_CODE参数决定了BAPI的行为模式它对应SAP系统中不同的物料移动事务代码。以下是常见业务场景的对应关系GOODSMVT_CODE对应事务码典型业务场景01MB01采购订单收货02MB31生产订单收货03MB1A物料发货如工单投料04MB1B库存转储如状态变更05MB1C其他收货DATA: gs_code TYPE bapi2017_gm_code. 采购订单收货场景 gs_code-gm_code 01.1.2 MVT_IND参数详解MVT_IND字段用于进一步指定物料移动的业务类型特别是在采购订单相关的移动中B采购订单相关的物料移动空值其他类型的物料移动如工单投料、库存转移 采购订单收货时 gt_gmitem-mvt_ind B. 工单投料时 gt_gmitem-mvt_ind .2. 采购订单收货移动类型1012.1 标准非限制库存收货采购订单收货是最常见的物料移动场景对应移动类型101。以下是完整代码模板DATA: lv_peinh TYPE ekpo-peinh, gw_gmhead TYPE bapi2017_gm_head_01, gt_gmitem TYPE TABLE OF bapi2017_gm_item_create, gs_gmitem TYPE bapi2017_gm_item_create. 1. 准备BAPI头部数据 gw_gmhead-pstng_date sy-datum. 过账日期 gw_gmhead-doc_date sy-datum. 凭证日期 gw_gmhead-ref_doc_no 采购收货凭证. 参考凭证号 2. 设置移动类型代码 gs_code-gm_code 01. 对应MB01 3. 准备行项目数据 LOOP AT gt_goods_mvt INTO gs_goods_mvt. CLEAR gs_gmitem. 物料主数据 gs_gmitem-material gs_goods_mvt-matnr. gs_gmitem-plant gs_goods_mvt-werks. gs_gmitem-stge_loc gs_goods_mvt-lgort. 采购订单信息 gs_gmitem-po_number gs_goods_mvt-ebeln. gs_gmitem-po_item gs_goods_mvt-ebelp. gs_gmitem-mvt_ind B. 采购订单移动 移动数量与单位 gs_gmitem-entry_qnt gs_goods_mvt-menge. gs_gmitem-entry_uom gs_goods_mvt-meins. 移动类型设置 gs_gmitem-move_type 101. APPEND gs_gmitem TO gt_gmitem. ENDLOOP.2.2 质检库存收货的特殊处理若需要将物料收入质检库存而非非限制库存需额外设置STCK_TYPE字段gs_gmitem-stck_type X. X表示质检库存3. 工单投料移动类型261生产订单投料是制造企业的核心业务之一对应移动类型261 头部数据准备 gw_gmhead-pstng_date sy-datum. gw_gmhead-doc_date sy-datum. gs_code-gm_code 03. 对应MB1A LOOP AT gt_goods_mvt INTO gs_goods_mvt. CLEAR gs_gmitem. 物料基础信息 gs_gmitem-material gs_goods_mvt-matnr. gs_gmitem-plant gs_goods_mvt-werks. gs_gmitem-stge_loc gs_goods_mvt-lgort. 生产订单信息 gs_gmitem-orderid gs_goods_mvt-aufnr. 生产订单号 移动数量 gs_gmitem-entry_qnt gs_goods_mvt-menge. gs_gmitem-entry_uom gs_goods_mvt-meins. 移动类型设置 gs_gmitem-move_type 261. APPEND gs_gmitem TO gt_gmitem. ENDLOOP.注意工单投料场景下不需要设置PO_NUMBER和PO_ITEM但必须提供有效的生产订单号(ORDERID)4. 库存状态转换移动类型344/3434.1 非限制库存转冻结库存344 头部数据 gw_gmhead-pstng_date sy-datum. gw_gmhead-doc_date sy-datum. gs_code-gm_code 04. 对应MB1B LOOP AT gt_goods_mvt INTO gs_goods_mvt. CLEAR gs_gmitem. 物料信息 gs_gmitem-material gs_goods_mvt-matnr. gs_gmitem-plant gs_goods_mvt-werks. gs_gmitem-stge_loc gs_goods_mvt-lgort. 库存状态转换不需要PO或订单信息 gs_gmitem-move_type 344. 数量信息 gs_gmitem-entry_qnt gs_goods_mvt-menge. gs_gmitem-entry_uom gs_goods_mvt-meins. APPEND gs_gmitem TO gt_gmitem. ENDLOOP.4.2 冻结库存转非限制库存343与344移动类似只需修改移动类型gs_gmitem-move_type 343. 冻结转非限制5. BAPI调用与错误处理正确的错误处理机制是保证系统稳定性的关键DATA: lt_retn TYPE TABLE OF bapiret2, lv_mblnr TYPE mblnr, lv_mjahr TYPE mjahr. 调用BAPI CALL FUNCTION BAPI_GOODSMVT_CREATE EXPORTING goodsmvt_header gw_gmhead goodsmvt_code gs_code IMPORTING materialdocument lv_mblnr matdocumentyear lv_mjahr TABLES goodsmvt_item gt_gmitem return lt_retn. 错误处理 IF lt_retn IS NOT INITIAL. 存在错误回滚事务 CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. 收集错误信息 LOOP AT lt_retn WHERE type CA EAX. WRITE: / 错误:, lt_retn-message. ENDLOOP. ELSE. 提交事务 CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. 确认物料凭证已生成 IF lv_mblnr IS NOT INITIAL. WRITE: / 物料凭证创建成功:, lv_mblnr, 年度:, lv_mjahr. ENDIF. ENDIF.重要提示不要依赖sy-subrc判断BAPI是否成功必须检查返回消息表(lt_retn)6. 高级应用与性能优化6.1 批量处理的实现对于大批量物料移动建议采用分批处理策略 定义每批处理的行数 CONSTANTS: lc_batch_size TYPE i VALUE 100. DATA: lt_batch TYPE TABLE OF bapi2017_gm_item_create. 分批处理逻辑 LOOP AT gt_goods_mvt INTO gs_goods_mvt. 准备行项目数据... APPEND gs_gmitem TO lt_batch. 达到批处理大小时执行 IF lines( lt_batch ) lc_batch_size. CALL FUNCTION BAPI_GOODSMVT_CREATE EXPORTING goodsmvt_header gw_gmhead goodsmvt_code gs_code TABLES goodsmvt_item lt_batch return lt_retn. 错误处理... CLEAR lt_batch. ENDIF. ENDLOOP. 处理剩余不足一批的数据 IF lt_batch IS NOT INITIAL. 调用BAPI... ENDIF.6.2 增强字段的使用某些特殊业务场景可能需要使用增强字段 使用BAPI扩展结构 DATA: lt_extension TYPE TABLE OF bapi2017_gm_extension, ls_extension TYPE bapi2017_gm_extension. 设置自定义字段 ls_extension-structure ZMOVEMENTEXT. 自定义结构 ls_extension-valuepart1 自定义值. APPEND ls_extension TO lt_extension. 在BAPI调用中添加EXTENSIONIN参数 CALL FUNCTION BAPI_GOODSMVT_CREATE EXPORTING ... TABLES extensionin lt_extension ...在实际项目中我们经常遇到需要同时处理多种移动类型的场景。这种情况下建议将不同移动类型的处理逻辑封装成独立的方法通过统一接口调用既能保持代码清晰又便于后期维护。

更多文章