ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

物料管理三张表:Excel与Python实现MRP核心逻辑

物料管理三张表:Excel与Python实现MRP核心逻辑 1. 这篇文章真正要解决的问题如果你是一名制造业的物料控制MC或仓库管理WMS从业者或者正在向这个方向发展你是否经常感到困惑为什么别人能快速定位库存问题、精准预测物料需求而你却总在救火被生产催料、被采购抱怨、被财务质疑库存金额问题的核心往往不在于你不够努力而在于你没有掌握一套系统化、可复制的数据管理方法。网上流传的“三张表”概念听起来像是一个“一招鲜”的秘籍仿佛学会了就能立刻月薪过万。但真相是它不是一个具体的表格模板而是一套用数据驱动物料管理的底层思维框架。真正让从业者价值倍增的不是表格本身而是你如何构建、维护并利用这三张表背后的数据关系来解决实际业务中的“信息孤岛”问题。本文将彻底拆解这“三张表”究竟是什么它们如何联动以及你该如何在自己的工作中落地实践。我们不会空谈理论而是会结合具体的业务场景给出可操作的Excel/SQL示例并指出从入门到精通路上最常见的“坑”。读完本文你将能建立体系化认知清晰理解物料控制的核心数据流是哪三条。获得实操工具获得构建核心数据表的具体思路和字段设计。掌握分析方法学会如何让这三张表“对话”从而提前发现缺料、呆滞料等风险。明确进阶路径了解在ERP/MES系统环境下如何将这套思维升级为自动化流程。2. 基础概念与核心原理什么是驱动物料管理的“三张表”在深入细节之前我们必须统一认知这里所说的“三张表”并非指三张固定的Excel文件。它指的是物料管理活动中必须持续维护和关注的三类核心数据实体它们共同构成了物料动态的“全景图”。2.1 第一张表动态库存表核心是“现在有什么”这是所有物料管理的基础但它不仅仅是仓库台账上静态的数量。真正的动态库存表需要体现物料的“实时状态”。核心字段物料编码、物料名称、规格型号唯一标识。当前库存数量仓库实际物理数量。可用库存数量当前库存-已分配数量-冻结数量。这是最关键的数据决定了能否被新的需求占用。在途数量已下单但尚未入库的数量。已分配数量已承诺给具体生产订单或出货单但尚未领料或发货的数量。安全库存、最低库存、最高库存库存控制的策略水位线。库位信息便于快速定位。它解决什么问题 回答“我现在能动用多少货”避免因只看总库存而导致的超发或重复采购。例如总库存100个但已有80个被生产订单锁定那么面对一个新的20个需求可用库存其实只有20个而非100个。2.2 第二张表需求明细表核心是“未来要什么”需求是驱动物料流动的源头。这张表需要整合所有类型的物料需求并将其量化、时间化。需求来源独立需求如销售订单、产品预测直接产生对成品或关键部件的需求。相关需求由独立需求通过物料清单BOM分解而来是原材料和半成品的需求。核心字段需求来源单号销售订单号/生产计划号。物料编码。需求数量。需求日期需要物料到位的具体日期。需求类型销售订单、生产工单、研发领用、维修备件等。需求状态已计划、已下达、已关闭。它解决什么问题 将模糊的“最近需要很多A物料”转化为清晰的“下周三之前需要为订单SO-2024052001准备50个A物料”。这是进行物料需求计划MRP运算的输入基础。2.3 第三张表供应计划表核心是“怎么满足需求”基于动态库存和未来需求制定出具体的行动方案即“何时采购/生产多少”。核心字段物料编码。计划订单数量。建议下单/开工日期。计划到货/完工日期。计划类型采购申请、生产工单、调拨单等。关联需求单号追踪这个供应计划是为了满足哪个需求。计划状态建议、已审核、已执行。它解决什么问题 它是沟通物料控制MC、采购Purchasing和生产Production的“作战指令”。它回答了“为了不缺料我们应该在什么时间点做什么事”。2.4 核心联动原理一个简单的模拟MRP逻辑这三张表通过一个简单的逻辑紧密相连这个逻辑就是MRP物料需求计划的核心思想净需求计算对于某个物料在某个时间点净需求 需求明细表中的毛需求 - (动态库存表中的可用库存 供应计划表中已计划但未到的数量)。生成供应计划如果净需求 0且超出了安全库存的缓冲范围则需要在供应计划表中生成一条记录建议在需求日期之前考虑采购/生产提前期下达订单。更新库存展望结合动态库存、在途量和已生成的供应计划可以模拟出未来每一天的库存展望即“预计可用量”从而提前预警缺料或爆仓风险。通俗比喻动态库存表是你的“钱包余额”需求明细表是你的“未来待支付账单”供应计划表就是你为了按时付清账单而制定的“赚钱/借钱计划”。只看钱包可能觉得钱够但一看账单才发现危机四伏。3. 环境准备与前置条件从Excel起步在接触或企业未上完整ERP系统前Excel是实践这套方法的最佳工具。它灵活、直观能帮助你深刻理解数据间的逻辑。软件环境Microsoft Excel 2016及以上版本建议使用Office 365以获得更好的函数和透视表支持。WPS表格也可但部分高级函数可能有差异。关键技能准备基础操作表格整理、数据验证、条件格式。核心函数VLOOKUP/XLOOKUP关联查询、SUMIFS多条件求和、IF逻辑判断。这些是让三张表“活”起来的关键。数据分析工具数据透视表用于快速汇总和分析需求与库存。思维准备放弃“一个超级大表走天下”的想法接受“数据分表管理通过关键字段关联”的关系型数据库基础思维。4. 核心流程拆解如何手工构建并联动三张表我们以一个简化版的“手机组装”为例来演示从0到1构建这三张表并让其联动的过程。场景公司需要根据销售订单组装一批手机产品编码P-Phone。每台手机需要1个屏幕M-Screen、1块主板M-Mainboard和1块电池M-Battery。目前仓库有一定库存。4.1 第一步建立动态库存表 (Inventory)在Excel中新建一个工作表命名为Inventory。物料编码物料名称当前库存已分配数量可用库存安全库存在途数量M-Screen手机屏幕15030120500M-Mainboard手机主板8010703050M-Battery手机电池200501501000P-Phone手机成品20515100关键点可用库存列使用公式计算C2-D2当前库存 - 已分配。这是核心字段。安全库存是预设的缓冲值。在途数量来自已下达的采购单但未收货的部分。4.2 第二步建立需求明细表 (Demand)新建工作表命名为Demand。需求可能来自销售订单对成品P-Phone的需求系统会自动展开为对原材料的需求相关需求。这里我们手工模拟BOM展开。需求单号物料编码需求数量需求日期需求类型上级需求单号SO-001P-Phone1002023-10-27销售订单-SO-001M-Screen1002023-10-25相关需求SO-001SO-001M-Mainboard1002023-10-25相关需求SO-001SO-001M-Battery1002023-10-25相关需求SO-001MO-100M-Battery202023-10-20生产工单-关键点需求日期对于原材料通常比成品的需求日期提前考虑组装时间。上级需求单号用于追溯需求来源对于相关需求尤其重要。4.3 第三步建立供应计划表 (SupplyPlan)新建工作表命名为SupplyPlan。这张表最初是空的需要我们通过分析来填充。物料编码计划数量建议下单日期计划到货日期计划类型关联需求单号状态4.4 第四步让数据联动——手工模拟MRP计算这是最关键的一步。我们需要创建一个“计算表”来模拟MRP逻辑。新建工作表命名为MRP_Calculation。物料编码毛需求可用库存在途量已计划量净需求建议行动M-ScreenM-MainboardM-Battery现在我们使用Excel函数来填充这张表实现三张表的联动。1. 获取毛需求在MRP_Calculation表的B2单元格M-Screen的毛需求输入公式SUMIFS(Demand!$C$2:$C$100, Demand!$B$2:$B$100, A2)这个公式的意思是在Demand表的C列需求数量中求和所有B列物料编码等于当前行A2即M-Screen的数量。向下填充即可得到每个物料的毛需求。2. 获取库存与在途信息在C2单元格可用库存输入VLOOKUP(A2, Inventory!$A$2:$G$100, 5, FALSE)在D2单元格在途数量输入VLOOKUP(A2, Inventory!$A$2:$G$100, 7, FALSE)VLOOKUP函数根据物料编码从Inventory表中查找并返回对应列的值5是可用库存列7是在途数量列。3. 获取已计划量在E2单元格已计划量输入假设SupplyPlan表中“状态”不为“已完成”的计划都算已计划SUMIFS(SupplyPlan!$B$2:$B$100, SupplyPlan!$A$2:$A$100, A2, SupplyPlan!$G$2:$G$100, 已完成)4. 计算净需求在F2单元格净需求输入核心逻辑公式MAX(B2 - C2 - D2 - E2, 0)公式解释毛需求 - 可用库存 - 在途量 - 已计划量。如果结果为负数代表库存充足则用MAX(..., 0)将其显示为0。5. 生成建议行动在G2单元格建议行动输入判断公式IF(F20, 生成采购计划, 库存充足)如果净需求大于0则提示需要行动。完成上述公式填充后MRP_Calculation表将动态显示结果物料编码毛需求可用库存在途量已计划量净需求建议行动M-Screen100120000库存充足M-Mainboard10070500-20 - 0库存充足M-Battery120150000库存充足分析结果M-Screen毛需求100可用库存120足够无需行动。M-Mainboard毛需求100可用库存70在途50合计120足够无需行动。M-Battery毛需求12010020可用库存150足够。根据这个结果我们暂时不需要向SupplyPlan表添加任何计划。如果净需求大于0我们就需要手动或通过更复杂的公式在SupplyPlan表中创建一条新的计划记录包括计算建议下单日期需求日期 - 采购提前期。5. 完整示例与代码实现进阶——使用Python实现简易MRP逻辑当数据量变大Excel公式会变得复杂和缓慢。此时可以用PythonPandas库来实现同样的逻辑这更贴近企业级系统的数据处理方式。环境准备安装Python及Pandas库。pip install pandas openpyxl代码实现 创建一个名为simple_mrp.py的Python脚本。# simple_mrp.py import pandas as pd # 1. 模拟读取三张表的数据 (实际中可能从数据库或Excel读取) # 动态库存表 inventory_data { 物料编码: [M-Screen, M-Mainboard, M-Battery, P-Phone], 当前库存: [150, 80, 200, 20], 已分配数量: [30, 10, 50, 5], 在途数量: [0, 50, 0, 0], 安全库存: [50, 30, 100, 10] } df_inventory pd.DataFrame(inventory_data) df_inventory[可用库存] df_inventory[当前库存] - df_inventory[已分配数量] # 需求明细表 demand_data { 需求单号: [SO-001, SO-001, SO-001, SO-001, MO-100], 物料编码: [P-Phone, M-Screen, M-Mainboard, M-Battery, M-Battery], 需求数量: [100, 100, 100, 100, 20], 需求日期: [2023-10-27, 2023-10-25, 2023-10-25, 2023-10-25, 2023-10-20] } df_demand pd.DataFrame(demand_data) # 供应计划表 (初始为空) supply_plan_data { 物料编码: [], 计划数量: [], 状态: [] } df_supply_plan pd.DataFrame(supply_plan_data) # 2. 计算每个物料的毛需求 gross_demand df_demand.groupby(物料编码)[需求数量].sum().reset_index() gross_demand.columns [物料编码, 毛需求] # 3. 关联库存和计划信息 # 将库存、毛需求、供应计划关联起来 mrp_calc pd.merge(gross_demand, df_inventory[[物料编码, 可用库存, 在途数量]], on物料编码, howleft) mrp_calc pd.merge(mrp_calc, df_supply_plan.groupby(物料编码)[计划数量].sum().reset_index(), on物料编码, howleft) mrp_calc[已计划量] mrp_calc[计划数量].fillna(0) # 将NaN填充为0 mrp_calc.drop(columns[计划数量], inplaceTrue) # 4. 计算净需求 mrp_calc[净需求] mrp_calc[毛需求] - mrp_calc[可用库存] - mrp_calc[在途数量] - mrp_calc[已计划量] mrp_calc[净需求] mrp_calc[净需求].apply(lambda x: max(x, 0)) # 将负数需求归零 # 5. 生成建议行动 def generate_action(row): if row[净需求] 0: return f需计划采购/生产 {row[净需求]} 个 else: return 库存充足 mrp_calc[建议行动] mrp_calc.apply(generate_action, axis1) # 6. 输出计算结果 print( MRP 计算报告 ) print(mrp_calc[[物料编码, 毛需求, 可用库存, 在途数量, 已计划量, 净需求, 建议行动]].to_string(indexFalse)) # 7. (可选) 将净需求大于0的物料生成新的供应计划建议 new_plan mrp_calc[mrp_calc[净需求] 0][[物料编码, 净需求]].copy() new_plan[计划类型] 采购建议 new_plan[状态] 建议 if not new_plan.empty: print(\n 生成的供应计划建议 ) print(new_plan.to_string(indexFalse)) else: print(\n 库存充足无需新增供应计划。 )运行与验证 在命令行中执行该脚本。python simple_mrp.py预期输出 MRP 计算报告 物料编码 毛需求 可用库存 在途数量 已计划量 净需求 建议行动 M-Battery 120 150 0 0.0 0 库存充足 M-Mainboard 100 70 50 0.0 0 库存充足 M-Screen 100 120 0 0.0 0 库存充足 P-Phone 100 15 0 0.0 85 需计划采购/生产 85 个 生成的供应计划建议 物料编码 净需求 计划类型 状态 P-Phone 85 采购建议 建议这个Python脚本清晰地复现了Excel中的逻辑并发现了一个新问题成品P-Phone的净需求为85。这是因为我们之前只计算了原材料而成品本身也有独立需求。这正体现了系统化计算的重要性——它能发现手工排查容易遗漏的环节。6. 运行结果与效果验证无论是Excel还是Python方案运行成功的标志是能输出一份清晰的MRP计算报告。验证时应关注以下几点数据完整性检查所有涉及的物料是否都出现在计算报告中有无遗漏。逻辑正确性手动验证1-2个关键物料的计算结果。例如M-Mainboard毛需求100库存70在途50净需求应为max(100-70-50, 0)0。脚本结果需与此一致。行动建议的合理性报告给出的“建议行动”是否基于净需求对于净需求0的物料是否生成了明确的采购/生产建议异常情况处理可以修改输入数据测试一些边界情况如需求为0时净需求是否为0库存远大于需求时净需求是否为0某个物料在库存表中不存在时程序是报错还是能处理上述简单脚本会因merge时howleft而出现NaN需要更健壮的代码处理。对于Python脚本还可以将结果输出到Excel文件便于业务人员查看。# 在脚本末尾添加 with pd.ExcelWriter(mrp_output.xlsx) as writer: mrp_calc.to_excel(writer, sheet_nameMRP计算, indexFalse) if not new_plan.empty: new_plan.to_excel(writer, sheet_name供应计划建议, indexFalse) print(结果已保存至 mrp_output.xlsx)7. 常见问题与排查思路在实际构建和应用这套方法时你会遇到各种问题。下表列出了典型问题及解决思路问题现象可能原因排查方式解决方案Excel公式计算错误如#N/AVLOOKUP查找值不存在区域引用错误。1. 检查VLOOKUP第一个参数查找值是否在查找区域的第一列。2. 检查表格区域引用如$A$2:$G$100是否包含了所有数据。1. 使用IFERROR(VLOOKUP(...), 0)函数将错误值显示为0或空白。2. 使用XLOOKUP函数替代容错性更好。净需求计算为负数公式逻辑错误未使用MAX(...,0)进行归零处理。检查计算净需求的公式。将公式修正为MAX(毛需求 - 可用库存 - 在途 - 已计划, 0)。Python脚本运行报错“KeyError”尝试合并merge的DataFrame中用于关联的列名不一致或不存在。打印DataFrame的列名(df.columns)检查on参数指定的列名是否完全一致。统一列名或使用left_on和right_on参数指定左右表不同的关联列名。需求日期未参与计算当前的简易模型是“无限产能”模式只计算总量未按时间维度展开。检查需求表和计算逻辑是否区分了时间。这是简易模型的局限。进阶做法是建立“分时段净需求”计算即按天或周汇总需求再与同期的库存、在途、计划进行滚动计算。系统中有数据但计算时遗漏数据表中有空白行、格式不一致如数字存为文本、或筛选状态未取消。1. 检查数据源区域是否完整。2. 使用Excel的“分列”功能或Python的pd.to_numeric()统一数据类型。规范数据录入使用表格CtrlT或数据库来管理源数据确保数据纯净。安全库存未考虑计算逻辑中只做了简单减法未将安全库存作为必须维持的底线。检查净需求公式。修正净需求公式为净需求 MAX(毛需求 安全库存 - 可用库存 - 在途 - 已计划, 0)。这样当预计可用量低于安全库存时就会触发补货。8. 最佳实践与工程建议掌握基础的三表联动后要将其转化为真正的“必杀技”需要遵循以下最佳实践数据源头唯一与准确这是所有工作的基石。必须与销售、生产、采购、仓库部门确定唯一的数据录入和更新入口如ERP系统的一个模块避免多头维护导致数据矛盾。引入时间维度时栅管理真正的MRP是“分时段”的。你需要将未来划分为几个时间段如紧急时栅、冻结时栅、计划时栅不同时栅内的需求其处理优先级和可调整性不同。这能大大提高计划的可行性和稳定性。区分计划层与执行层计划层使用上述方法跑出长期的物料需求计划指导采购战略和产能规划。执行层关注未来1-4周的短期计划精确到天用于指导每日的物料配送和生产排程。这两层需要不同的数据颗粒度和更新频率。善用可视化工具用Excel的条件格式高亮显示缺料预警净需求0、呆滞料超过X天无动态、库存超限。用数据透视表快速分析不同物料组、不同供应商的需求趋势。从Excel过渡到系统思维Excel是学习和验证逻辑的绝佳工具但不适合长期管理海量数据和复杂流程。当你精通此道后你的核心价值在于将这套逻辑转化为需求推动企业上线或优化ERP/MES系统中的MRP模块。你的角色将从“制表员”升级为“系统逻辑设计师”和“业务流程分析师”。建立异常处理与沟通机制系统跑出计划后需要人工审核。对于异常数据如需求暴增、供应商交期突变必须有一套清晰的流程谁角色在什么时间频率通过什么方式会议/邮件/系统进行评审和调整。持续维护基础数据物料清单BOM的准确性、采购/生产提前期的合理性、损耗率的设置直接决定了MRP运算结果的质量。这些数据的维护是物料控制员的长期核心工作之一。9. 总结与后续学习方向“三张表”的本质是教你用结构化的数据思维来解构复杂的物料管理问题。它让你从被动的“救火队员”转变为主动的“预警调度员”。月薪过万的价值就体现在你通过这套方法为企业减少的停线损失、降低的库存资金占用、提升的订单交付率上。下一步你可以深入的方向深入学习MRP理论研究经典MRP的运算逻辑包括毛需求、净需求、计划订单下达、计划订单接收等概念理解提前期、批量规则的影响。学习SQL在企业中数据大多存储在数据库。掌握SQL查询技能能让你直接从数据库获取、整合、分析这三张表的数据能力将产生质的飞跃。研究一种ERP系统无论是SAP、Oracle还是用友、金蝶尝试理解其中物料管理、生产计划、采购模块的设置和流程。了解系统如何实现你目前在Excel中手工完成的逻辑。拓展到供应链协同将视角从企业内部延伸到供应商。了解供应商管理库存VMI、协同规划、预测与补货CPFR等概念思考你的“供应计划表”如何与供应商系统交互。记住表格和工具会过时但数据驱动的决策思维和系统化的流程理解能力才是你职业生涯中持久的核心竞争力。从今天起尝试用这“三张表”的框架去审视你手头的工作你会发现混乱的局面开始变得清晰而你的价值也正于此显现。
返回列表