简介:SAP-PP 替代物料操作完全手册面向已具备生产计划与物料管理基础、希望系统掌握物料替代配置的 SAP 顾问与制造企业计划人员。内容围绕平行切换与非平行切换两类替代展开,覆盖批量更换组件、只消耗不采购、后继物料、物料后继组及按比例拆分等典型场景,并交代可用性检查、非连续标识、BOM 终止组与后继组等关键设置,帮助读者理清不同替代逻辑的适用边界与常见误区。包内为 1 个 docx 文档,约 871KB,便于检索、批注与二次整理。已有 2553 人学习,说明其在同类专题中具备一定参考热度。文档以操作链路和参数说明为主线,适合按场景对照配置,也可作为排错时回查系统行为、验证替代结果的随身手册,对需要落地配置而非仅了解概念的读者更有价值。
1. 替代物料真正难的地方,不是「换」,是「账」
有一种很典型的翻车:照着文档把后继物料配好,下生产订单,组件行纹丝不动,还是原来那个物料,库存明明是 0。于是开始查权限、查缓存、查是不是没保存。真实原因往往只有一个——可用性检查那个字段没设成 02。SAP PP 里的替代物料从来不是一个功能,而是好几条互不相干的实现路径:有的走 MRP4 视图的后继关系,有的走 BOM 里的替代组和使用可能性,有的干脆靠 CS20 把物料从所有 BOM 里批量摘掉。它们触发切换的时机完全不同,算需求的口径也不同,混着用就会出现「配置看着都对,结果就是不对」的玄学现场。搞清楚哪条路径在什么时刻做判断,比记住操作步骤值钱得多,因为它直接决定 MRP 将来跑出来的是 A 的采购申请,还是 B 的。
2. 后继关系的存放与 MRP 的需求锚点
2.1 一条链只存在两个字段里:非连续标识与后继物料
物料之间的「A 用完切 B、B 用完切 C」这种链式关系,在系统里并不存在一张独立的「替代关系表」。它被拆散存放在每个物料自己的主数据上:MM02 进入 MRP4 视图,里面有两个关键字段,一个是非连续标识,一个是后继物料。A 的非连续标识填 1、后继物料填 B;B 的非连续标识填 1、后继物料填 C,链才成立。系统不会自动推导传递关系,A 指向 B 之后,B 指向谁必须单独维护,漏掉一环,链就在那里断掉,表现是「切到 B 之后不动了」。
非连续标识的取值不是随便填的。按常见用法,1 表示这个物料是一个替代链的起点,也就是「单一平行终端」的那一端,它负责触发;3 表示它是跟随者,属于「相关平行不连续」的部分,被前面的物料带着走;填 3 的物料,后继物料字段必须留空,填了反而会让链路判断混乱。这个区分在后继组场景里是生死线,后面第 4 章会展开。想快速核对一批物料到底怎么配的,可以直接从表里捞:
" 批量核对物料的后继配置(字段名以所在版本为准) SELECT matnr, mstae, mstde FROM marc INTO TABLE @DATA(lt_discont) FOR ALL ENTRIES IN @lt_matnr WHERE matnr = @lt_matnr-table_line AND werks = @lv_werks. " mstae = 非连续标识,mstde = 后继物料 " 重点看:mstae = '3' 的行,mstde 是否被误填这段查询的价值在于「批量」两个字。单个物料用 MM02 看很直观,但一条链上五六个物料、跨几个工厂,靠人眼逐个点开核对,漏一个就是一次生产停线。把结果导出来按 mstae 排序,起点和跟随者一眼就分开了。
2.2 为什么 A、B、C 都没库存,MRP 还是跑出 A 的需求
这是整套机制里最反直觉、也最容易吃亏的一点。后继关系影响的是订单执行阶段的组件替换,它不参与 MRP 的净需求计算。MRP 展开 BOM 时,看到组件行写的是 A,就把需求挂在 A 头上,然后拿 A 的库存、在途、预留去冲销,冲不掉的生成 A 的计划订单或采购申请。系统在需求层面始终认为 A 是最适用的物料,后继物料只是一个「A 真的拿不到时,订单可以往哪退」的备选线索。
所以当 A、B、C 三个物料库存全为 0 时,MRP 不会聪明地跑出 C 的采购申请,它老老实实跑 A 的。计划员看到的就是一堆买不到的物料需求,还得人工判断该买谁。理解这一点,很多事情就顺了:替代链是运行时兜底,不是需求层的重定向。真要让 MRP 从此只跑 B 的需求,动主数据是没用的,得动 BOM——用更改编号加生效时间,在某个日期之后把组件行从 A 换成 B,让 MRP 展开时压根看不到 A。
原料里那句「个人建议在 A、B 物料长久不用的情况下,直接用 BOM 的更改编号、生效时间来控制」说的就是这个。它的本质是:把「将来用谁」这个决策,从订单执行的临时判断,提前到主数据的版本管理里。
2.3 平行切换与非平行切换:两条完全不同的实现路线
从大类上分,替代分平行切换和非平行切换。平行切换是链式的,A 用完切 B,B 用完切 C,同一时刻订单上只有一种物料在被消耗,是「接力」;非平行切换是并行的,A 用 30%、B 用 70%,两个物料同时在订单上出现,各自按比例分摊需求,等 A 彻底耗尽再全部转给 B,是「分摊」。
这两种模式在系统里的配置入口都不一样。平行切换靠 MRP4 的非连续标识加后继物料,再配合可用性检查触发;非平行切换靠 BOM 里的替代组、优先级和使用可能性,在 BOM 展开阶段就把数量拆好。混用会出问题:在替代组里配了使用可能性,又指望它像后继链一样按库存余量累加扣减,结果一定对不上。判断标准很简单——问一句「这张订单上,A 和 B 会不会同时出现」,会,就是非平行;不会,就是平行。
2.4 只消耗不采购:把决策权交回给人的一种设计
还有一类场景不追求自动切换,只要求「别再买了」。做法是把 A 的物料状态设成 02,让它在 BOM 里照常存在、照常被展开,但采购端被卡住;同时在 A 的主数据里放一个安全库存当警示线。库存消减到这条线附近,系统产生采购申请,但因为物料状态的原因采购员转不成订单,这个信号就回流到计划或数据岗,由人来判断:继续用 A、补充采购?彻底转 B、另行处理 A 的余料?还是 A、B 并存一段时间?
这里有个容易忽略的细节:02 这个状态控制的是 BOM 侧,不是采购侧,到底冻结哪些业务得看 OMS4 里的配置。原料特意点出这一点,是因为很多人配完发现「明明设了 02,采购还能下单」,然后开始怀疑人生。这套设计的动机其实很清楚——系统不替你做「换不换」的商业决策,它只负责在正确的时点把信息推到正确的人面前,剩下的走 CO02 改组件、MM02 改状态、MD02 重跑 MRP 三条路,选哪条取决于判断结果。
3. 单物料后继:可用性检查 02 才是真正的开关
3.1 从 MM02 到 CO01,六个前置条件缺一不可
两物料自动替代看起来配置项不多,但它是一条串行的链条,任何一环断掉,现象都是「没反应」,很难从结果反推原因。完整的链条是这样的:先用 MM01 建好两个物料;MM02 在 A 的 MRP4 视图里把非连续标识设成 1、后继物料设成 B;MM02 在 A 和 B 的 MRP3 视图里把可用性检查设成 02;MM02 给 B 维护工作计划视图,否则 B 根本下不了生产订单;CS01 把 A、B 都维护进 BOM;MIGO 入库把库存做进去;最后 CO01 下订单验证。
这六步里,前两步决定「能不能切」,第三步决定「什么时候切」,第四步决定「切过去之后能不能用」,第五、六步是验证环境。缺第三步,订单照样能下,只是不会触发替换,属于沉默失败;缺第四步,替换发生了但订单下不去,属于显性失败。显性失败好查,沉默失败才是血泪经验的来源。
3.2 下订单那一刻:BOM 展开、可用性检查、预留拆分
CO01 输入成品数量、维护好工艺路线和工序之后,系统做三件事。第一件是 BOM 展开,按成品数量乘以组件用量算出每个组件的毛需求,比如生产 20 个成品、每个用 5 个原材料,组件需求就是 100 PC。第二件是对组件做可用性检查,把当前库存、已预留、预计入库放在一起算可用量。第三件是最关键的:可用量不足时,沿着 MRP4 的后继链去找下一个物料,把缺口补上,最终生成多条订单组件行。
用一段简化示意把这段逻辑摊开:
" 订单组件可用性检查与后继替换的简化流程(示意,非标准源码) LOOP AT lt_component INTO DATA(ls_comp). lv_avail = get_unrestricted_stock( ls_comp-matnr ) - get_reserved_qty( ls_comp-matnr ). IF lv_avail >= ls_comp-req_qty. " 库存够,全额挂在本物料上,不触发替换 append_component( ls_comp-matnr, ls_comp-req_qty ). ELSE. " 库存不够:先吃掉现有库存,剩余部分沿后继链继续找 append_component( ls_comp-matnr, lv_avail ). lv_rest = ls_comp-req_qty - lv_avail. lv_next = get_follow_up_material( ls_comp-matnr ). " 读 MRP4 后继物料 WHILE lv_rest > 0 AND lv_next IS NOT INITIAL. lv_next_avail = get_unrestricted_stock( lv_next ). lv_use = COND #( WHEN lv_next_avail >= lv_rest THEN lv_rest ELSE lv_next_avail ). append_component( lv_next, lv_use ). lv_rest = lv_rest - lv_use. lv_next = get_follow_up_material( lv_next ). " 继续往下一环走 ENDWHILE. ENDIF. ENDLOOP.对应到原料里的例子:需要 100 个,A 只有 45 个,系统自动补 B 物料 55 个,不需要人工调整,订单组件行上就是 45 加 55 两行。这段逻辑里有两个参数值得盯住:一是get_unrestricted_stock取的是非限制库存,质检库存、冻结库存不参与;二是WHILE循环终止条件,链走完还有缺口就停下,剩下的缺口留给发料环节报错,系统不会凭空变出料来。
3.3 累加扣减与其他替代方式的本质差别
原料里有一句容易被略过的话:只有这种设置是 A 消耗完再消耗 B、进行累加扣减,其他替代方式都是不足替换、不考虑库存。这句话点出了后继链的独特之处——它按「数量」分摊,45 加 55 拼成 100。而连续替代那类方式是按「优先级」整批选一个物料:只要第一个物料库存够整张订单,就全部用它,库存不够整张订单就直接报错,不存在「先用 45 个再补 55 个」这种拼盘。
这个差别决定了两种方式的适用边界。订单批量小、库存碎片化、经常出现「差一点点」的场景,后继链的累加扣减更贴合现实;订单批量大、物料之间是同质不同源、要求整批可追溯的场景,整批替换反而更干净,因为一炉产品混两种来源的料,质量追溯会很难受。
3.4 两个容易被忽略的限制:用量相等与两物料上限
这套方法有两个硬性限制。第一,只适用于 A、B 两种物料替换,三种及以上不可用。原因还是那句话——后继链是逐级维护的,A 指 B、B 指 C 虽然能串起来,但每级都要单独配非连续标识和后继物料,配置量和出错概率随物料数线性上升,而且中途某一环配错,整条链的排查成本很高。第二,如果 BOM 里 A、B 的用量相等,上面的设置就够了;如果用量不等,比如 A 用 2 个、B 用 3 个,还要在 BOM 里做额外设置,因为系统按「件数」替换而不是按「等效用量」替换,直接切会算错需求量。
原料作者的建议很实在:用量不等的情况,与其在后继链上打补丁,不如直接用按比例拆分那套更简单。这是一个典型的取舍——继任链的配置成本低,但只覆盖「一对一、用量相同」这个窄场景;超出这个场景,成本曲线陡然上升。
4. 组替代、比例替代与连续替代:多物料模型的判定差异
4.1 后继组:谁负责触发,谁负责跟随
当一个组件位上需要「一组物料整体被另一组物料替换」时,单物料后继就不够用了。典型场景:某个主板套件的 BOM 下有四个组件,前两个是一组,后两个是另一组,后一组是前一组的后继组,而且以第一个物料的库存有无作为整组切换的触发条件。
配置分两处。主数据侧,第一个物料(触发者)在 MRP4 里非连续标识设 1、后继物料指向对面组的一个成员;第二个物料(跟随者)非连续标识设 3、后继物料必须留空。BOM 侧,CS02 进入第一个物料的子项目,点「终止数据」,在中止组里填一个组代码,比如 A;第二个物料同样填 A,表示这两个都属于被替代组。然后进入第三、第四个物料的子项目,点「物料后继数据」,在后继组里填 A。两边组代码必须一模一样,这是配对的唯一依据。
测试时的现象很能说明机制:库存设成第一个物料 0、第二个 100、第三、第四各 200、300,下生产订单需要每个物料各 200,做物料可用性检查之后,前两个物料整组切到后两个。注意第二个物料明明还有 100 的库存,照样被切掉——因为触发条件只看第一个物料,它没料,整组就翻过去。这是「组」这个概念的核心:判定是组的粒度,不是行的粒度。
4.2 按比例拆分:使用可能性和策略,谁说了算
同物性、不同供应商、不同生产批次导致物料号不一致,但产品其实一样,这种场景要的是按比例分摊。CS01 维护 BOM 时,把三个物料维护进同一个替代组 A,回车之后组件行上会带出蓝标箭头,点进去逐行维护使用可能性和策略。策略这个参数只有两个值:1 是手工维护、按用途可能性,2 是 100% 检查。
策略选 1 的时候,优先级不起作用,谁分多少完全由使用可能性决定。三个物料填 50、30、20,下 100 个成品、每个耗 2 个原材料,总需求 200,系统就拆成 100、60、40。如果不填比例,订单上显示全是 0,做检查时系统自己去找「合适的」物料;如果都填 100,每行都显示全额,检查时再按库存挑;如果只给第一个填 100、其余填 0,默认第一个全额,检查时同样会根据实际库存变动。这里的「合适」说白了就是可用库存。
策略选 2 才是 100% 检查模式,优先级开始起作用,系统按优先级顺序逐個判断库存是否够整批,够就整批用,不够就看下一个。这两种策略不能混着理解:策略 1 是「分摊」,策略 2 是「排队」。
4.3 比例之和不是 100% 时,需求数量怎么算
这是一个必须算清楚的细节。组内使用可能性之和理论上应该等于 100%,但系统并不强制。如果填成 50% 和 25%,合计 75%,系统会做归一化处理:某物料的需求数量等于总需求乘以该物料的使用可能性,再除以组内所有使用可能性之和。按原料的算式,1 个需求、50% 和 25% 两行,算出来分别是 0.667 和 0.334。
问题出在取整上。计量单位是 PC 的时候,0.667 个物料没有意义,系统按单位小数位取整,两个数各自舍入之后相加可能小于原始需求,结果就是「所需物料数量不足」。这类问题在演示环境里看不出,因为演示用的都是整数比例;一到真实业务,比例是 33.3%、66.7% 这种除不尽的小数,就会出现莫名其妙的缺料。稳妥做法是让组内比例严格凑成 100%,或者干脆按最小包装单位的整数倍去分配。
4.4 连续替代:优先级排队的整批替换
连续替代是使用面最广的一种,能覆盖三个以上物料依次替换的场景。CS02 把所有需要替代的物料都加进 BOM,逐个双击数量进入项目明细,在替代物料组里填同一个组名,然后点旁边的箭头维护优先级、策略、使用可能性三列。按原料的例子,三行物料优先级分别填 1、2、3,策略统一填 2,使用可能性留空。
效果是严格的排队:第一个物料库存 200,每个成品耗 2 个,那最多只能下 100 个成品;第一个物料库存清零之后,再下 100 个的需求时,系统自动跳到第二个物料;第二个用完跳第三个。每次只能用一种物料,而且用量不能超过当前物料的可用库存,超了直接报错,生产订单也下达不了。
这里有个前提条件藏在主数据里:必须维护 MRP3 视图的可用性检查为 02,否则系统不会去检查可用库存,订单能下 300,但发料时才发现只有 200,直接卡在发料环节。这类「下单时爽、发料时崩」的问题,本质是把校验点后移了,代价是问题暴露得更晚、处理成本更高。
4.5 批量更换:CS20 是主数据治理,不是运行时替代
还有一种操作容易被误当成替代功能:CS20 批量更换物料组件,把 BOM 里的 a 物料整体换成 b。选中要替换的 BOM 执行,绿色表示成功、红色表示失败,a 物料就此在公司范围内消亡,b 全面接管。它和前面所有方式的区别在于——它不产生任何运行时的判断逻辑,改完就是改完了,MRP 从此只认 b。
这决定了它的使用场景和风险。适用场景是「a 永久退役、公司层面全面切换」,一次操作覆盖所有相关 BOM,效率极高;风险是不可逆、跨多个 BOM 批量生效,改错了要逐个回滚,而且历史订单里的组件行不会跟着变。它属于主数据治理手段,和运行时替代是两条平行线,不该混在同一个方案里讨论。
5. 避坑与排查:替代物料不生效的五个现场
5.1 主数据侧的两个沉默失败
现象一:生产订单能正常创建,数量也没问题,但组件行永远是原物料,库存明明为 0 也不切换。原因几乎总是可用性检查没设 02,MRP3 视图那一栏空着。没有这个开关,系统在订单创建阶段根本不做库存可用性检查,自然也就没有「不足则沿后继链找料」这个动作。解决方法是 MM02 补上 02,然后把已经创建但还未下达的订单重新读一次组件,让检查重跑一遍。
现象二:想改 BOM 保不住,一保存就报错。原因是物料主数据的物料状态被设成了 02 并冻结,而 02 这个状态在标准配置下控制的是 BOM 侧业务。要注意 02 并不控制采购,这也是为什么会出现「BOM 改不动、采购却还能下单」的割裂现象。解决思路有两条:临时解冻、改完再冻回去;或者去 OMS4 里核对物料状态到底该管哪些业务,按实际管理需求调整,而不是照抄别人的配置。
5.2 BOM 侧的两个配对错误
现象三:CS02 里点「终止数据」,按钮是灰的,点不动。原因是这个项目行上还挂着替代项目组的信息,两套机制在同一个行上互斥。解决方法是先把残留的替代组信息删掉,再维护中止数据,顺序反了就会一直灰着。
现象四:中止组和后继组都填了,看着没问题,但整组切换就是不触发。原因十有八九是两边的组代码不一致——一边填 A、一边填 B,或者大小写、前后空格有差异。这个组代码是唯一的配对键,系统不会做模糊匹配。原料里提到过被某些资料误导、一直达不到效果的经历,根源就在这里。验证方法很直接:CS02 进 BOM,走菜单里的「附加 - 更多的 - 终止信息」,能在这里看到完整的组关系,看不到就是没配上。
" 排查组配对:把 BOM 行上的中止组/后继组拉出来比对(示意) SELECT stpo~stlnr, stpo~idnrk, stpo~stlkn, stpo~cs_altgrp, stpo~cs_altpri " 替代组与优先级 FROM stpo INTO TABLE @DATA(lt_stpo) WHERE stpo~stlnr = @lv_bom_no. " 组代码为空但预期有替代关系的行,就是漏配的行比对的思路是:同一张 BOM 下,本该成组的行如果组代码字段是空的,那这一行就没参与任何替代逻辑,无论主数据配得多漂亮都不会生效。
5.3 订单侧的一个数量陷阱
现象五:三个物料按 50%、25%、0% 配好比例,下订单之后需求数量算出来是 0.667、0.334 这种数,取整后总数比预期少,发料时缺料。原因就是 5.3 节讲的归一化加取整——比例之和不到 100% 时,系统按占比重新分摊,再用计量单位的小数位截断。解决办法是让组内使用可能性之和严格等于 100%,或者在设计比例时就按整数、按最小包装单位去凑,别留除不尽的小数。
排查这类问题的顺序建议固定下来:先看主数据的可用性检查和非连续标识,再看 BOM 行的组代码是否配对,最后看订单组件行的数量和单位。三步走完还没定位到,再去查库存状态——质检库存和冻结库存不参与可用性检查,这个坑也很常见。
6. 取舍:把复杂度放在主数据,还是放在订单执行
配置替代物料的时候,真正要回答的问题只有一个:MRP 将来应该跑出谁的采购申请。这个问题的答案决定了你该用哪条路,而不是反过来。
运行时的后继链,好处是灵活、配置量小、能处理「差一点」的碎片化库存,代价是需求锚点永远挂在原物料上。A、B、C 全空的时候,MRP 依然跑 A,计划员每天面对一堆买不到的需求,靠人脑去翻译成「其实该买 C」。这在过渡期可以接受,长期就是慢性病。组替代和比例拆分解决的是「同物性多来源」的问题,代价是引入了组代码配对、使用可能性取整这些新的一致性约束,配错一个组代码,整组静默失效。CS20 批量更换最彻底,代价是不可逆,且它解决的是主数据问题,解决不了「这个月 A 还有货、下个月才切」这种时间维度的问题。
所以我的判断习惯是按「时间跨度」来分:几周内的临时缺料,用后继链加可用性检查,让订单自己兜底;几个月到一年的供应商切换,用比例拆分慢慢过渡,让两个来源并行消耗;确定永久不再使用的物料,别留恋替代链,直接上 BOM 更改编号加生效时间,让 MRP 从某一天起彻底看不到旧物料。原料作者建议「A、B 长久不用就直接改 BOM」,说的正是第三种情况——替代链是给过渡期用的,不是给终局用的。
验证方法其实很朴素:拿一个不参与正式运算的物料号,建一张最小 BOM,配好替代关系,入库、下订单、做可用性检查,然后盯住订单组件行的数量和单位,跟你手算的结果逐行比对。这一步能在十分钟内暴露掉九成的配置错误,比在正式环境里等到发料报错再回头查要便宜得多。
从那以后我每配一个替代组,都先强迫自己回答一句「MRP 明天该跑谁的采购申请」,答不上来就先不动配置,先去把 BOM 的生效时间理清楚。希望帮到你。
本文还有配套的精品资源,点击获取