告别手工算料:动态数组打造智能BOM替代分析- 13
优秀创作者
在昨天的文章中,我们通过对替代料2的运算和库存状态的更新,成功提取出替代料3的明细信息。今天,我们将继续执行对替代料3的净需求计算。整个过程延续了前几级的逻辑,是一个标准化、可复用的递进式计算流程。通过不断重复“主料缺 → 启用替代料1 → 替代料2 → 替代料3……”的判断链条,系统逐步推进多级替代分析,直至找到可用资源或确认最终缺料。这一机制实现了物料短缺场景下的逐层响应,为生产齐套性分析和采购决策提供了完整、可靠的依据。
筛选数据
在执行替代料4的计算前,需先将替代料3的相关数据筛选出来,作为下一级运算的基础。通过筛选,提取出存在“替代料3”的记录,并将其作为本级的运算子件,同时将替代料3的净需求(负数)转化为实际需补足的缺料量,作为替代料4的需求输入。
替代子件3:=FILTER(第3级净需求!M2:M30000,第3级净需求!$M$2:$M$30000<>"")
替代子件3需求:=-FILTER(第3级净需求!L2:L30000,第3级净需求!$M$2:$M$30000<>"")
公式解释:
使用 FILTER 函数从“第3级净需求”表中提取“替代料3”列(M列)非空的记录,确保只处理存在下一级替代的物料;
将“净需求”列(L列)中的负值取反,转换为正数,表示替代料3未能覆盖的缺货数量,即为替代料4需要补足的需求量;
通过该方式,实现“缺多少 → 谁来补”的逐级传递逻辑,为后续库存引用与净需求判断做好准备。
引用库存
在执行替代料4的欠料计算之前,必须先将“替代料3”层级的运算结果同步回库存系统,确保后续判断基于最新的资源状态。为此,需更新“库存输出”工作表中的库存基准列,反映前三级(主料 → 替代料1 → 替代料2 → 替代料3)已扣减后的实际可用库存,录入动态数组公式:
=LET(K,E2#,A,XLOOKUP(A2#,第3级净需求!F2#,第3级净需求!K2#,,,-1),IF(K=0,0,IFNA(IF(A<0,0,A),K)))
公式解释:
A2#:库存表中的物料编码(唯一标识)
第3级净需求!F2#:第3级表中的“子件编码”列,用于匹配
第3级净需求!K2#:第3级的“累计净需求”结果(负数表示已耗尽)
XLOOKUP(..., -1):从后往前查找,获取该物料在第三级运算中的最终状态
IF(A < 0, 0, A):若最终净需求为负,说明该物料已无可用库存,返回 0
IFNA(..., K):若未找到匹配项(即未参与第三级运算),则保留原库存 K
IF(K = 0, 0, ...):若前序库存已为0,则不再更新,防止资源“复活”
计算欠料
在成功引用更新后的库存数据后,接下来将基于当前库存与需求进行核心运算,判断“替代料3”是否足以覆盖前级遗留的缺料缺口。该过程延续了前几级的标准化计算逻辑,确保多级替代推演的一致性与准确性。
1. 计算第3次累计净需求:
=J2#-I2#
公式说明:
J2#:引用的最新可用库存(即前三级运算后的剩余库存)
I2#:通过 SCAN 函数计算出的“替代子件3累计需求”
结果表示:在使用替代料3补缺后,该物料的总体库存余缺状态
正数:库存富余,可满足全部需求
0:刚好满足
负数:仍存在短缺,需继续判断是否存在“替代料4”
计算第3次单行净需求(独立欠料):为精确识别每条生产任务的缺料情况,进一步计算每行的独立净需求:
=LET(Y,H2#,L,I2#,K,J2#,J,K-L,A,IF(J>=0,0,J),IF(ABS(A) <Y,A,-Y))< span> </Y,A,-Y))<>
公式解释:
Y:当前行的单项需求量(替代子件3需求)
L:累计需求,K:当前库存
J = K - L:累计净需求
A:若累计为负,则为实际累计短缺量;否则为0
最终判断:
若累计短缺绝对值小于当前需求 → 仅部分短缺(返回 A)
否则 → 全部未满足(返回 -Y)
✅ 输出结果为每条记录的实际缺料量(负数),可用于后续追溯与替代料4的触发判断。
WPS寻令官