在昨天的文章中,我们已成功完成第一级净需求的全面计算,不仅实现了按子件汇总的累计净需求分析,还通过精细化公式还原了每一条生产任务对应的单个净需求,准确识别出各环节的具体欠料数量(以负数形式呈现)。
至此,系统已能清晰回答:“哪些物料缺、缺多少、对应哪个生产任务”。然而,现实生产中常面临一种典型场景:某主料虽已欠料,但仓库中存在其对应的替代料(如“可替代料1”),且可直接用于生产。若不考虑这一层逻辑,将导致误判为“缺料停线”,造成不必要的采购或延误。
因此,在今天的内容中,我们将正式进入第二级子件(可替代料1)的净需求计算。
判断逻辑
针对第一级中已出现欠料的子件,系统将首先查询其是否登记有“可替代料1”。若存在替代料,则引用该替代料的可用库存,用于冲抵主料的欠料数量,冲抵后的剩余缺口才作为最终缺料纳入后续处理;若无替代料或替代料库存不足,则直接沿用第一级的原始欠料结果,进入预警或采购流程。
这一机制的引入,标志着我们的MRP系统从“静态需求计算”迈向“智能替代响应”的关键一步。接下来,我们将逐步构建替代料匹配引擎,实现“主料缺→查替代→扣库存→算余缺”的完整闭环逻辑,提升物料齐套分析的准确性与生产计划的柔性应对能力。

第1级净需求库存
为了避免在多级需求展开过程中出现库存重复扣减的问题,我们需要为后续层级的净需求计算建立一个统一的库存引用基准。为此,需返回到“库存输入”工作表,新增一列,命名为“第1级净需求库存”。
该列的作用是:记录在完成第一级子件需求扣减后,各物料的剩余可用库存状态,作为第二级(如可替代料1)判断的起始库存依据,确保库存扣减具有顺序性和继承性。:
=IFNA(IF(XLOOKUP(A2#,第1级净需求!F2#,第1级净需求!K2#,,,-1)<0,0),B2#)

公式说明:
A2# :“库存输入”表中的物料编码列
第1级净需求!F2# 净需求表中的“子件编码”列(用于查找)
第1级净需求!K2# 对应的“累计净需求”结果列(负值表示短缺)
XLOOKUP(…,-1):从后往前查找,确保获取该编码最后一行的累计净需求值,即最终库存余缺状态
IF(…<0,0):若最终净需求为负(表示已耗尽甚至超支),则返回0——即主料已无可用库存
IFNA(…,B2#):若未找到匹配项(即该物料未参与第一级需求),则保留原始库存数量B2#(库存数量);
是否有替代
在完成第一级净需求计算并更新库存状态后,我们进入替代料分析的关键步骤——判断哪些欠料的子件存在可替代料,并将其引入后续的补缺逻辑。
为此,我们回到 “第1级净需求” 工作表,新增一列,命名为 “替代料1”,用于查询并返回每个子件对应的第一级替代料编码(即“可替代料1”)。在对应单元格(如 M2)输入以下公式:
=VLOOKUP(B2#&”-“&E2#,PIVOTBY(BOM输出!F2#,BOM输出!E2#,BOM输出!C2#,T),3,0)

公式说明:
该公式通过 PIVOTBY + VLOOKUP 的组合,实现从BOM结构中提取“子件 → 替代料”的映射关系。
B2# & “-” & E2# 构造查找键:将“产品编码”与“子件顺序”拼接为 “A-1” 形式,对应BOM中的唯一行标识
PIVOTBY(BOM输出!F2#, BOM输出!E2#, BOM输出!C2#, T) 动态生成一个二维透视表:
行组:F2# —— “父件&子件顺序号”(如 A-1, A-2)
列组:E2# —— “替代料等级”(如 0=主料,1=替代料1)
聚合值:C2# —— “子件编码”
函数:T —— 返回文本值(避免数值干扰)
→ 最终生成一个结构化的替代料矩阵 | | VLOOKUP(…, 3, 0) | 在生成的透视表中精确查找拼接键,并返回第3列(即“替代料1”字段),0 表示精确匹配 |
