如何匹配MRP需求与库存报表提取库存耗尽对应到期日
库存耗尽日(INV. RUNOUT)自动计算落地方案
核心计算规则
- 数据预处理:所有需求行先按物料编码(ITEM)分组,组内按需求交期(Due-Date)升序排列(交期更早的需求优先扣减库存)
- 触发判定:逐行累加对应交期的需求数量(QTY-REQ),找到*累计需求值首次严格大于在手库存(OHQ)*的行,该行的Due-Date即为该物料的库存耗尽日
- 异常兜底:如果某物料所有可统计需求加总后,累计值始终未超过OHQ,对应INV. RUNOUT标注为「需求覆盖范围内无库存耗尽」
规则匹配示例验证:对应物料B的OHQ为5,首笔需求交期4/29/21的数量为5,累计值等于OHQ、未触发超过条件,因此不计入耗尽节点;次笔4/30/21的需求数量为1,累计值达到6、首次超过5的OHQ,最终取4/30/21为耗尽日,和预期结果完全匹配。
两类源报表的固定字段结构
- 需求明细表:每行对应一笔独立销售订单,包含字段
Due-Date(需求交期)、QTY-REQ(需求数量)、ITEM(物料编码),同一物料可对应多行需求 - 现有库存表:每行对应唯一物料,包含字段
OHQ(在手可用库存)、ITEM(物料编码)、INV. RUNOUT(待计算填充的库存耗尽日字段)
可落地实现路径
路径1:Excel/WPS 零代码实现(适配日常手动导出报表的处理场景)
- 第一步:将导出的需求明细表导入表格工具,新增「累计需求数」辅助列
- 第二步:对需求明细表做双条件排序,优先按ITEM列升序、同ITEM下按Due-Date列升序排列
- 第三步:在累计需求数列逐行写入公式,按物料分组计算截止当前行的累计需求(以数据从第2行开始、ITEM在C列、QTY-REQ在B列为例,D2单元格公式为
=SUMIFS($B$2:B2,$C$2:C2,C2),下拉填充整列即可自动计算) - 第四步:将计算结果匹配到现有库存表,使用XLOOKUP函数直接提取首次超库存的交期(以库存表OHQ在A列、ITEM在B列、INV. RUNOUT列在C列为例,C2单元格公式为
=XLOOKUP(1,(需求明细!C:C=库存表!B2)*(需求明细!D:D>库存表!A2),需求明细!A:A,"无库存耗尽",0),下拉即可批量生成结果)
路径2:Python 轻量脚本实现(适配固定周期批量跑数的场景)
核心可直接运行的计算逻辑如下,无需依赖外部付费服务:
import pandas as pd # 读取MRP系统导出的两类报表 demand_df = pd.read_excel("需求明细表.xlsx") stock_df = pd.read_excel("现有库存表.xlsx") # 需求表按物料、交期排序,逐行计算同物料的累计需求 demand_df = demand_df.sort_values(by=["ITEM", "Due-Date"], ascending=[True, True]) demand_df["cum_qty"] = demand_df.groupby("ITEM")["QTY-REQ"].cumsum() # 定义单物料的耗尽日查找逻辑 def get_runout_date(material_demand, ohq_val): exceed_row = material_demand[material_demand["cum_qty"] > ohq_val].head(1) if len(exceed_row) == 0: return "无库存耗尽" return exceed_row["Due-Date"].iloc[0] # 匹配库存表逐行计算结果 stock_df["INV. RUNOUT"] = stock_df.apply( lambda row: get_runout_date( demand_df[demand_df["ITEM"] == row["ITEM"]], row["OHQ"] ), axis=1 ) # 导出带耗尽日的最终库存报表 stock_df.to_excel("带耗尽日计算结果的库存表.xlsx", index=False)
边界场景特殊处理
- 同物料同交期多笔需求:需先将同一交期下的多笔需求数量合并求和,再参与累计对比,避免拆分计算的误差
- 负库存物料:若物料本身OHQ为负,直接取该物料最早的需求交期作为INV. RUNOUT即可
- 交期时区统一:所有系统导出的交期统一转换为本地业务时区,避免时间错位导致的日期取值错误
内容的提问来源于stack exchange,提问作者Machinist
相关产品推荐
相关产品推荐

