如何通过自定义ABAP代码实现自动凭证批次处理?
官方支持的凭证批次自动处理解决方案(适配外部供应商产品及PPPI场景)
问题梳理
你需要为外部供应商的部分产品实现自动凭证批次处理,涉及配置与ABAP开发,但目前发现标准批次仅支持MIGO手动操作,临时方案存在场景覆盖不全、稳定性差的问题;同时还要支持PPPI消耗消息(基于PI04目的地和COCI_CONFIRM_MATERIAL_CONS,该FM调用MB_CREATE_GOODS_MOVEMENT而非BAPI_GOODSMVT_CREATE)的批次处理。
已尝试方案的局限性分析
先聊聊你试过的两种方案的核心问题:
- MIGO快照临时方案:通过监控
VB_INSERT_BATCH、VB_BATCH_WHERE_USED_LIST的表更新手动填充结构,这种方式本质是模拟MIGO的局部逻辑,天然受限于MIGO的采购文档场景,生产/销售订单等场景下缺少必要的上下文数据,扩展性和稳定性都没法保障。 BAPI_GOODSMVT_CREATE尝试:这个BAPI确实只调用了VB_BATCH_WHERE_USED_LIST,靠内存ID激活功能需要填充DOCUBATCH_SCREEN_FIELDS这类复杂结构,而且没法直接维护MCHA、MCH1表,数据一致性风险很高,不是长期方案。
官方支持的稳定实现途径
针对这类程序化批次分配需求,SAP官方有几种成熟的实现方式,推荐按优先级尝试:
1. 优先用批次确定策略配置(无/少代码)
通过事务码MBC1/MBC2配置批次确定策略,结合自定义搜索规则,物料移动时自动匹配批次,这是最标准的方式:
- 为目标物料维护批次搜索策略,把供应商、保质期、批次特性等作为搜索条件,精准匹配外部供应商的产品批次
- 调用
BAPI_GOODSMVT_CREATE时,设置参数BATCH_DETERMINATION = 'X'激活自动批次确定;对于MB_CREATE_GOODS_MOVEMENT,可以在调用前通过内存ID传递批次确定触发标识 - 针对PPPI的
COCI_CONFIRM_MATERIAL_CONS场景,用增强EXIT_SAPLCOCI_001插入标准批次确定逻辑,调用VB_BATCH_DETERMINE完成自动分配,完全贴合标准流程
2. 调用官方批次处理函数模块
如果配置满足不了特殊需求,用SAP提供的官方FM来处理批次,避免直接操作表:
- 创建批次:用
BAPI_BATCH_CREATE或VB_CREATE_BATCH,这两个FM会自动维护MCHA、MCH1等表,保证数据一致性,只需传入物料、工厂、供应商等必要参数 - 批次分配:在物料移动前,调用
VB_BATCH_ASSIGN把批次和目标凭证关联,再触发物料移动操作,确保批次和凭证的绑定逻辑符合标准 - 针对
MB_CREATE_GOODSMVT_CREATE场景,也可以在调用前通过MEMORY ID 'CHA'传入批次号,或者在增强EXIT_SAPMM07M_001中插入自动分配逻辑
3. 增强框架实现自定义逻辑
如果以上两种都满足不了你的特殊业务规则,用SAP增强点来扩展:
- 物料移动增强:
EXIT_SAPLMIGO_001(抬头增强)、EXIT_SAPLMIGO_002(行项目增强),可以在MIGO或MB_CREATE_GOODS_MOVEMENT调用时自动填充批次信息 - 批次主数据增强:
EXIT_SAPLV01Z_001,在创建批次时自动维护供应商相关的自定义字段或特性,方便后续批次确定 - PPPI消耗增强:
EXIT_SAPLCOCI_002,在COCI_CONFIRM_MATERIAL_CONS执行过程中插入批次分配逻辑,确保PPPI消息处理时批次自动到位
关键注意事项
- 绝对不要直接修改
MCHA、MCH1这类主数据表,必须用官方BAPI或FM,否则会导致数据不一致,后续排查问题会非常麻烦 - 外部供应商的产品一定要在批次特性里维护供应商字段,这样批次确定策略才能精准匹配到对应供应商的批次
- 测试PPPI场景时,要跟踪
COCI_CONFIRM_MATERIAL_CONS的调用流程,确保批次分配逻辑在MB_CREATE_GOODS_MOVEMENT触发前执行完成
内容的提问来源于stack exchange,提问作者Halcyon
相关产品推荐
相关产品推荐

