摘要:本文针对ERP中MRP核心模块的算法进行了分析,描述的角度有多方面,首先从基础定义上做了一些简单的解释说明,其次在每一个小算法里面做了流程图分析,最后用伪代码将所有的函数进行了梳理,本文或许会需要一个较长的更新周期,但相信大家在顺着本文的思路可以开发一个小小的MRP计算程序,也可以完全做一个比较实用的生产调度系统。
 

下面就逐步介绍该算法

一、ERP计算总体流程

或许大家大都对这个流程图比较熟悉,但是这里还是把他列了出来,因为这是本文的一个开始,也是一个基奠,如下图:

 

 

 

分 三个部分,首先是MRP的输入部门,其次是MRP计算部分,最后是MRP的计算结果。从本图例上看,其过程应该是我们根据主生产计划、物料主文件、物料清单、库存信息以及工作日历通过MRP计算器得到采购计划及自制计划。下面将做分步详细的说明。

(一)、主生产计划(MPS)

          1、主生产计划(MPS)存储

代号产品编码产品图号产品名称需求数量订货日期需求日期
MPS001AAA52011/1/252011/2/25
MPS001AAA102011/1/252011/2/30
MPS001AAA102011/1/252011/3/2

 

          2、主生产计划(MPS)数据库设计

 

名称代码数据类型非空是否主键
MPS代号IDnvarchar(20)TRUETRUE
产品代码ItemCodenvarchar(20)TRUEFALSE
产品图号DrawIDnvarchar(20)TRUEFALSE
产品名称DrawNamenvarchar(20)TRUEFALSE
需求数量DemandNumintTRUEFALSE
订单日期OrderTimedatetimeTRUEFALSE
需求日期DEMandTimedatetimeTRUEFALSE

 

(二)、物料主文件(Materiel)

           1、物料主文件(Materiel)存储结构

 

物料编码物料名称图号计量单位物料类型物料来源批量最小订货量订货倍量固定提前期可变提前期安全库存是否独立需求是否虚拟件
AAAEAMM5  51500
BBBEAMM10  5210000
CCCEAMM10  5210000
DDDEAMP3030305210010
EEEEAMP4040405210000
FFFEAMP4040405210000
GGGEAMM20  5210001
HHHEAMP5050505210010
IIIEAMP5050505210010

 

           2、物料主文件(Materiel)数据库设计

 

名称代码数据类型非空是否主键说明
物料编码ItemCodenvarchar(20)TRUETRUE 
物料名称ItemNamenvarchar(20)TRUEFALSE 
图号DrawIDnvarchar(20)TRUEFALSE 
单位UMchar(4)TRUEFALSE 
物料类型MatTypechar(4)TRUEFALSE 
物料来源Soursechar(4)TRUEFALSEM或P
批量LotSizenumericTRUEFALSE 
最小订货量OrderMinnumericTRUEFALSE 
订货倍量OrderMulnumericTRUEFALSE 
固定提前期LeadTimeintTRUEFALSE 
可变提前期VleadTimeintTRUEFALSE 
安全库存SafeStocknumericTRUEFALSE 
是否独立需求Mpsflagchar(4)TRUEFALSE0或1
虚拟标识Phflagchar(4)TRUEFALSE0或1
……     

 

(三)、产品物料清单(BOM)

            1、产品物料清单(BOM)图示

 

 

                                   产品A的结构

        2、产品物料清单(BOM)库存储结构

 

物料编码父物料编码数量关系层级……
A 10 
BA31 
CA21 
DA41 
EB22 
FB12 
GC22 
FC32 
HG43 
IG13 

 

         3、产品物料清单的数据库设计

 

名称代码数据类型非空是否主键
物料编码ItemCodenvarchar(20)TRUEFALSE
父物料编码FaItemCodenvarchar(20)TRUEFALSE
数量关系NumintTRUEFALSE
层级StepintTRUEFALSE

 

 (四)、库存文件(INVENTORY)

         1、库存文件(INVENTORY)的存储结构

 

物料编码物料名称当前实存计划入库已分配量预计可入库量
AA55  
BB1001005050
CC1001005050
DD1001005050
EE1001005050
FF1001005050
GG1001005050
HH1001005050
II1001005050

 

         2、库存文件(INVENTORY)的数据库设计

 

名称代码数据类型非空是否主键说明
物料编码ItemCodenvarchar(20)TRUETRUE 
物料编码ItemCodenvarchar(20)TRUEFALSE 
物料名称ItemNamenvarchar(20)TRUEFALSE 
当前实存StoNownumericTRUEFALSE 
计划入库StoPlannumericTRUEFALSE 
已分配量StoDownnumericTRUEFALSE 
预计可入库量StoHavenumericTRUEFALSE 

 

 (五)、工作日历(WORKDAY)

          1、工作日历(WORKDAY)数据库设计

 

名称代码数据类型非空主键说明
日期编号wd001varchar(20)TRUETRUE 
日期wd002varchar(20)TRUEFALSE 
是否为工作日wd003varchar(1)TRUEFALSEO或1
工作日数量wd004numericTRUEFALSE 
对应工作日日期wd005datetimeTRUEFALSE 

 

          2、对工作日历数据库设计的说明

工作日数量:如果是工作日,则自动加1

对应工作日日期:如果是工作日则对应日期,如果不是工作日则是最近的工作日日期

(——今天先到这里吧……)

二、物料需求计划(MRP)计算逻辑

(一)、基本逻辑,MRP的基本逻辑可做如下解释

                 A、要生产什么,包括采购的和制造的,生产多少?

                 B、生产这些东西要用的什么物料?这些数据可以通过BOM表获得

                 C、已经有了什么?这些数据可以根据库存文件获得

                 D、还缺什么?需要多少?这些由通过MRP计算结果得到

                 E、何时开始制造(采购),什么时间完成?这些信息由MRP计算结构得到

(二)、物料需求计划(MRP)的相关计算

                 1、计算毛需求Demandrough(T) 

                是指在T计划周期内对物料的总需求量,分两种情况,第一种情况是如果是独立需求件,毛需求量根据主生产计划得到;第一种如果是相关需求件,则通过如下计算公式:Demandrough(T)=

N
∑Di (T)*Qi
i=1

 其中Di (T)是指该物料的第i个父项在第T时段计划下达数量,Qi为单位第i个父项所需子项的数量,即BOM表中的数量关系。

注意:在实际的计算过程中或许会碰到同一物料在不同层级上的现象,这时候就引用了底层码的概念,低层码是指如果同一物料在不同层级上出现则其低层码取层级较低的那个,从数字上看就是数字较大的那个;在实际的MRP计算中是按照低层码顺序对产品结构树进行层序遍历的。

                2、有效库存(V(t))与净需求量(G(t))

有效库存  V(t)=S(t)-A(t)+R(t)-safestock,净需求量 G(t)=Demandrough(T)-V(t)

S(t) 为当前是存量,A(t)为已分配量,R(t) 为预计到货量;如果G(t)>0,在T时段能够满足需求,需要下达任务;如果G(t)<0,则说明当前库存能够满足T时段的需求,不需要下达任务。

              3、计划产出量P(t)

          为了满足净需求,我们需要计算计划产出量,从上面的分析或大家认为,计划产出量为Demandrough(T) 不就可以了吗?!实际上这里面有个策略的问题,大家或许都比较明白经济订货批量或经济生产批量的定义或最小订货量的定义,我们把这个参数定义为EOQ,为此这里我们需考虑这些因素,所以这里需要做个判断:

            如果G(t)>EOQ,则订货量为G(t)

           如果G(t)<EOQ,则订货量为EOQ

注:当然这里或许还有一个订货倍量或者物品的包装规格的计算问题,在这里就搞这么复杂了。

                4、计划投入量R(t)

        之所以提出这个概念是因为里面考虑一个参数,这个参数就是废品率P,在实际的生产或采购过程中必然会遇到废品率或不合格率的问题,所以我们的投入一般都要根据这个参数将计划产出量(P(t))进行放大,其计算方法如下:

                   R(t)=P(t)*(1-p)

              5、期末库存量(H(t))

       指的是在某物料在T计算周期期末的库存量,这里有两种情况,第一,当毛需求量Demandrough(T) 大于上一期的期末H(t-1)再减去安全库存safestock时,则期末库存H(t)为计划产出量与净需求之差,第二,反之,则为上一期的期末库存与毛需求之差,用公式表示如下:

若Demandrough(T) <H(t-1)-safestock,则H(t)=P(t)-G(t);

若Demandrough(T) <=H(t-1)-safestock,则H(t)=H(t-1)-Demandrough(T)

   (三)、物料需求计划(MRP)的计算流程 

            1、MRP计算流程,如下图:

    

 

            2、MRP计算逻辑

      1)初始化,导入主生产计划(MPS)、物料清单(BOM)、库存信息、工作日历等文件数据

 

      2)分解计算,对每个物料按期在BOM中的层次自上而下,自左而右进行循环分解,从层级为0的物料开始,依次执行步骤3)——9)

      3)计算毛需求Demandrough(t),计算出当前层次上物料的毛需求量

      4)若该物料的底层码等于当前层次号,则执行步骤5)——7)否则该物料的毛需求结果进行暂时保存,并跳转步骤8)

     5)计算净需求G(t)

     6)计算计划产出量P(t)

     7)计算计划投入量R(t)

     8)若该物料有子节点,转步骤9),否则计算该层下一个物料的相关需求量,并跳转步骤3)

     9)若N不是最后的层次,则N=N+1,转步骤3),否则表明该物料的所有层次遍历完毕,分解结束 

 

 3、MRP计算结果报表格式

 

物料编码物料名称毛需求量净需求量计划产出量计划投入量预计期末库存量开工时间完工时间
         
         
         
         

 

 

 三、物料需求计划(MRP)的软件实现

        一)MRP系统总体功能结构图

 

          二)数据库设计见上述表格

         三)物料需求计划(MRP)代码设计

        

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐