BOM结构 - Pascal的专栏 - CSDNBlog

来源:百度文库 编辑:神马文学网 时间:2024/04/25 09:30:56
ERP系统开发中BOM结构模型的研究及应用陈琦 刘杰(同济大学经济与管理学院,上海 200092)摘 要:BOM是ERP系统中重要的基本数据.本文首先从数据库设计和算法实现两方面分析了两种典型的BOM结构模型,通过比较总结出BOM设计中的关键问题;然后针对该问题提出改进的BOM结构模型;最后给出运用此模型实现某BOM管理模块的实例。关键字:企业资源计划;物料清单;BOM结构模型
1 引言制造业信息系统从上个世纪50年代起至今经历了MRP(Material Requirements Planning)、闭环MRP(Closed-loop MRP)、MRPⅡ (Manufacturing Resource Planning)及ERP等四个阶段,后一个阶段都是建立在前一阶段基础之上.ERP的核心仍然是解决企业根据市场需求“生产什么”、 “生产多少”、“什么时候生产”等问题,而这些问题的有效解决都是建立在MRP运算,即根据BOM(Bill of Materials)分解MPS(Main Production Schedule)的基础之上。所谓BOM就是产品结构在ERP系统中的一种数据表现形式,换句话说为了方便计算机识别并做分解运算处理,把用图表达的产品结构转换成数据格式,这种用数据格式来描述产品结构的文件就是BOM.从概念中可以看出,BOM的主要作用包括:1.存贮作用,即存储产品结构信息;2.计算依据,即为MRP分解运算提供逻辑依据。BOM是ERP的核心数据之一,BOM的设计与实施是ERP的基础,所以选用合理得BOM结构模型是保障ERP顺利实施得重要环节。2两种典型的BOM结构模型2.1树状结构模型对于制造型企业中生产的单个产品,其结构呈现出一种树状结构,反映出该产品所需的原材料,零件,部件及总装件之间的从属关系和数量。如图1中产品A,是由B,C,D构成的,而B又是由C,D构成的,括号里的数字表示父子之间的数量关系,依此类推,其中不能再分解或处于产品结构树底部的零部件就是需要制造或采购的零部件,有了这种产品结构才能进行分解运算得到物料需求计划。
图1。产品A的结构图为了把这种产品结构存储在关系型数据库中(以sqlserver2000为例,下同),其数据库设计如表1所示: 字段名称 类型 含义 Rootid Varchar(10) 产品代码 Childid Varchar(10) 子件代码 Layer int 层次码 Usage float 零件间用量关系 表1树状结构模型的数据字典其中Rootid, Childid分别表示产品和该产品包含的零部件代码,如该零部件不可再分解就用一个特殊的符号“L”来表示。图1中A产品的结构,在数据库中存储为以下记录: Rootid Childid Layer UsageAmount A B 1 1 A C 1 2 A D L 3 A C 2 2 A D L 1 A E L 6 A F L 8 A E L 6 A F L 8 表2 产品A在树状结构模型中的表示这种数据库设计由于模拟了产品结构的树状特征(如图2),称之为“树状结构模型”,它的优点是直观的刻画了产品结构,不同产品间的数据相互独立的,因而编写分解算法非常简单、高效。缺点主要是数据冗余度大,不同产品中包含的相同结构特征在此模型中仍然要存储多次,例如:产品A包含的部件C为通用件,即可以用在其他产品中。因而当增加或修改这些结构特征时也要重复多次,容易造成BOM数据不一致,或者在数据库设计时需要增加额外的触发机制保证其一致性。另一方面由于这种结构模型只存储了产品与零部间的关系从而抹煞了部件与零件的关系,破坏了BOM数据的完整性。 Parentid Childid Usage A B 1 A C 2 A D 3 B C 2 B D 1 C E 3 C F 4             图2.BOM的树状结构    树状结构模型可以直接采用较为简单的SQL语句来实现产品结构的查询。例如对图1中A产品查询需要制造或采购的所有零部件清单时,SQL语句为:select Childid from ‘表2’ where Rootid=’A’ and Layer=‘L’;需要查询A产品所包含的第n层零部件清单时,SQL语句为:select Childid from ‘表2’ where Rootid=’A’ and Layer=’n’;2.2网状结构模型 对于制造多品种产品的企业,产品与零部件的关系不再是简单的一对多而是多对多关系。由于大量通用件在不同产品间的相互借用,在树状结构中表现为不同的结点可以有相同的子树;即使在同种产品内部,由于一些标准件的重用,同样使零部件关系呈现出复杂的交织,所以图2可以转化为图3所示的网状结构。            图3.BOM的网状结构这种产品结构在数据库中的设计如表1所示: 字段名称 类型 含义 Parentid Varchar(10) 父件代码 Childid Varchar(10) 子件代码 Usage float 父子件间用量关系  表3 网状结构模型的数据字典图1中A产品的结构在数据库中可以存储为以下记录: 表4 产品A在网状结构模型中的表示这种数据库设计模拟了多品种产品的结构特征(如图2),称之为“网状结构模型”,它的优点是对每一种父子结构关系只存储一次,从而消除了冗余数据,另外当这些通用件或标准件的结构发生变化时,在数据库中也只用修改一次,同样以部件C为例,当修改其结构特征时只需在修改数据库中字段Parentid为“C”的记录。因而网状结构模型易于保证BOM数据的完整性和一致性。这种模型虽然能清晰的反映产品结构,但要编写较为复杂的算法来实现对BOM的遍历,常用的算法有: 1.递归算法。利用数据库的临时表来保存递归运算中的临时信息,通过特定变量控制程序的执行.2.分层查找法。就是从被查找的根结点开始,按层次一层一层的往下遍历,类似于数据结构中树的层次遍历过程。3.改进的BOM结构模型3.1 BOM设计中的关键问题综合上面两种模型的设计方法,在BOM设计过程中需着重考虑的两要素是:1.合理的BOM结构模型,即在数据库中设计合理的方式存储BOM数据,保证BOM数据的完整性、一致性、可靠性和无冗余;2.高效便捷的算法完成对产品结构的遍历和分解,满足MRP运算及各种对产品结构的查询、汇总等。前者关系到BOM的易维护性,后者是关系到BOM的易使用性,以下简称为BOM“设计的两要素”。然而,当今流行的数据库大多采用基于关系模型的关系型数据库。在数据库发展历史中较以前的层次模型或网状模型,关系模型对这种树状结构的存储和处理有先天性的不足,如果采取冗余度小的数据库设计,会使算法比较复杂,反之亦然。例如前面的两种模型,树状结构模型的数据库设计冗余度大但算法简单、执行效率高,实际上以较差的易维护性来换取较好的易使用性;而网状结构模型在保持低数据冗余的情况下却使算法复杂,降低查询分析的效率,与前者正好相反。这导致了BOM设计中两要素间的矛盾,而这种矛盾往往是无法避免的。BOM设计的主要问题就是在满足ERP功能的前提下,如何在BOM两要素之间需求最优均衡。为了解决这个问题,笔者综合两种典型BOM结构模型的特点,提出以下改进的BOM结构模型。3.2 改进后的混合结构模型这种模型的设计思路是考虑到在产品生命周期的不同阶段有不同的BOM,其内容和作用各不相同。所以整个产品结构可再细分为销售BOM,制造BOM,采购BOM等。销售BOM列举出制造最终产品所必需的可选物料,它仅仅是为了满足客户订单把相对独立的部件汇总起来的BOM;制造BOM是根据产品结构和工艺流程特点,把销售BOM中的独立部件作为“最终项目”来构建的,用于帮助制定并简化主生产计划;采购BOM是采购部门根据制造BOM中部件需求制定的外购件、外协件清单,是进行MRP运算的逻辑基础。这种划分把整个产品结构分解为粒度大小不同得BOM,销售BOM包含的数据项对应的产品结构粒度最大,接下来依次为制造BOM、采购BOM。然后根据这几种BOM的结构选择不同的BOM结构模型。一般来讲,销售BOM的结构简单且相对固定,对其主要做查询、汇总等简单操作,需要较好的BOM易使用性,故采用树状结构模型,采购BOM的结构复杂且需要经常修改,而且数据存储量大,对其完整性、一致性要求较高,即需要较好的BOM易维护性,故采用网状结构模型,制造BOM视企业的具体情况,同样按照其他BOM的选型方法选取合适的BOM结构模型。这样对整个产品结构综合两种BOM结构模型的优点,而且能满足ERP系统各模块的功能需要,所以称之为“混合结构模型”。4 应用实例    在某压缩机生产企业的ERP系统实际开发中,运用混合结构模型开发了其中的BOM管理模块.该系统采用基于Web的三层B/S架构,主要运用JSP技术,开发环境为:服务器端的操作系统采用Window NT;Web服务器为Aparch+Tomcat;数据库采用SQL Server 2000。4.1 BOM结构设计该企业是典型的多品种大批量的制造型企业,在BOM设计前首先对物料进行了编码,保证每种物料有唯一代码标识,然后参考混合模型把整个产品结构划分(如图4示意)。
      图4 BOM结构划分l         销售BOM压缩机全代码标识交付客户使用的商品,包括压缩机、附件及包装等。在ERP中这部分BOM主要供销售部门使用,使其能够根据客户需要迅速查询相应的配件,或使客户按照自身需要挑选并自由组合各部件。该部分采用树状结构模型,数据库中Rootid字段存放压缩机全代码,Childid字存放压缩机装配码、附件代码或者附件包装代码。l         制造BOM压缩机装配码标识装配线上最终装配出的产品,包括压缩机本体、本体包装和标识铭牌。这部分主要供生产部门的总装配线使用,使其能够按照主生产计划计算各部件的投料量。该部分同样采用树状结构模型,数据库中Rootid字段存放压缩机装配码,Childid字段存放压缩机本体代码,本体包装代码及标识铭牌代码。l         采购BOM采购BOM用来存储压缩机本体的结构信息,由于不同型号的压缩机本体仅存在细微的结构差异,如果采用树状结构模型,必然会产生大量的冗余数据。此外,由于所有产品的技术资料需要与国外母公司保持同步并且随客户需求变化频繁更换,因而对BOM数据的维护是经常性的,所以最终采用网状结构模型,数据库中仅存在具有父子关系的零部件数据,然后编写算法实现其查询、汇总等功能。4.2 关键算法实现    对采用树状结构模型的客户BOM和制造BOM,可以直接用SQL查询语句实现所需功能,而采购BOM需要对网状结构模型实现遍历等功能,算法较为复杂,以下给出用于实现对给定的任一物料查询其包含的所有子件,并按层次关系排列的算法。1.在sqlserver2000下先建立两个临时表#work和#result,前者用于存储运算的中间数据,后者存储运算结果。 字段名称 类型 含义 Lv1 int 层次码 itemid Varchar(20) 物料代码 usage Float(10) 用量 表5.临时表#work 字段名称 类型 含义 Seq Int identity 序号 Lv1 int 层次码 itemid Varchar(20) 物料代码 usage Float(10) 用量 表6.临时表#result2.实现BOM遍历查询的SQL语句为://声明变量declare @lvl int,@curr varchar(20),@usage float(10)//从BOM表中选取需要分解的物料信息,并存入#work表等待运算select top 1 @lvl=1,@curr=”根节点物料代码”,@usage=”用量”  from “BOM表”insert into #work (lvl,itemid,usage) values (@lvl,@curr,@usage)//循环开始,当分解层次码为0时循环终止while (@lvl>0) beginif exists (select * from #work where lvl=@lvl) begin//从#work表中选取层次码为@lvl的首条记录A,保存在变量中并插入表#result,然后将该记录从#work表删除select top 1 @curr=itemid,@usage=usage from #work where lvl=@lvlinsert #result (lvl,itemid,usage) values (@lvl,@curr,@usage)delete #work    where lvl=@lvl and itemid=@curr     //以记录A为父节点在BOM表中选取其所有子节点,并插入表#workinsert #work     select @lvl+1,cid,usage     from “BOM表”     where pid=@curr and pid<>cid//如记录A有子结点集B,则层次码加1,否则减1.然后跳至循环开始if(@@rowcount>0) set @lvl=@lvl+1endelseset @lvl=@lvl-1end//从表#result中选取最终遍历结果select * from #result;    实践证明,采用混合结构模型的BOM设计无论是在数据库结构还是运算效率上都能满足企业需要,为该ERP的顺利实施奠定了基础。4 结束语    本文分析比较了两种典型的BOM结构模型,从中总结BOM设计的主要问题并提出相应的改进BOM结构模型。在笔者参与的ERP系统开发过程中,这种方法得到了很好的应用和证实,希望能给其它ERP系统开发者以参考。基金项目:上海市浦东新区科技发展基金信息化应用推进专项资金资助项目 参考文献:[1]程控,革杨.MRPII/ERP原理与应用[M].北京:清华大学出版社,2002.10.[2]罗鸿,王忠民. ERP原理.设计.实施[M].北京:电子工业出版社,2003.1.[3]黄国瑜,叶乃箐.数据结构(JAVA语言版)[M].北京:清华大学出版社.2002.[4]刘艳凯,于明,张斌,王晨,陈荣兴,苏颖.ERP系统中BOM构造方法研究[J].计算机集成制造系统-CIMS,2003,(4):310-313.[5]严志强,龚京忠,李国喜,史宪明.多级型BOM的遍历[J].机械设计与制造工程,2001,(3):33-34[6]石双庆,张金隆,蔡淑琴.MRPII/ERP中指针码BOM及其算法[J].华中理工大学学报,2000,(11):64-6

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=695907