ERP系统开发中BOM结构模型的研究及应用15367.pdf
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 数据的完整性。图 2.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 树状结构模型可以直接采用较为简单的SQL 语句来实现产品结构的查询。例如对图 1 中 A 产品查询需要制造或采购的所有零部件清单时,SQL 语句为:select Childid from 表2where Rootid=A and Layer=L;需要查询 A 产品所包含的第 n层零部件清单时,SQL 语句为:select Childid from 表 2 where Rootid=A and Layer=n;22 网状结构模型 对于制造多品种产品的企业,产品与零部件的关系不再是简单的一对多而是多对多关系。由于大量通用件在不同产品间的相互借用,在树状结构中表现为不同的结点可以有相同的子树;即使在同种产品部,由于一些标准件的重用,同样使零部件关系呈现出复杂的交织,所以图 2 可以转化为图 3 所示的网状结构。图 3.BOM 的网状结构 这种产品结构在数据库中的设计如表1 所示:表 3 网状结构模型的数据字典 图1中A产品的结构在数据库中可以存储为以下记录:表4 产品A在网状结构模型中的表示 这种数据库设计模拟了多品种产品的结构特征(如图 2),称之为“网状结构模型”,它的优点是对字段名称 类型 含义 Parentid Varchar(10)父件代码 Childid Varchar(10)子件代码 Usage float 父子件间用量关系 每一种父子结构关系只存储一次,从而消除了冗余数据,另外当这些通用件或标准件的结构发生变化时,在数据库中也只用修改一次,同样以部件 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服务器为 AparchTomcat;数据库采用 SQL Server 2000。4.1 BOM 结构设计 该企业是典型的多品种大批量的制造型企业,在 BOM 设计前首先对物料进行了编码,保证每种物料有唯一代码标识,然后参考混合模型把整个产品结构划分(如图 4示意)。图 4 BOM 结构划分 销售 BOM 压缩机全代码标识交付客户使用的商品,包括压缩机、附件及包装等。在 ERP 中这部分 BOM 主要供销售部门使用,使其能够根据客户需要迅速查询相应的配件,或使客户按照自身需要挑选并自由组合各部件。该部分采用树状结构模型,数据库中 Rootid 字段存放压缩机全代码,Childid 字存放压缩机装配码、附件代码或者附件包装代码。制造 BOM 压缩机装配码标识装配线上最终装配出的产品,包括压缩机本体、本体包装和标识铭牌。这部分主要供生产部门的总装配线使用,使其能够按照主生产计划计算各部件的投料量。该部分同样采用树状结构模型,数据库中 Rootid 字段存放压缩机装配码,Childid 字段存放压缩机本体代码,本体包装代码及标识铭牌代码。采购 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.临时表#result 2.实现BOM遍历查询的SQL语句为:/声明变量 declarelvl int,curr varchar(20),usage float(10)/从 BOM 表中选取需要分解的物料信息,并存入#work 表等待运算 selecttop 1 lvl=1,curr=”根节点物料代码”,usage=”用量”from“BOM 表”insert into#work(lvl,itemid,usage)values(lvl,curr,usage)/循环开始,当分解层次码为 0 时循环终止 while(lvl0)begin if exists(select*from#work where lvl=lvl)begin/从#work 表中选取层次码为 lvl的首条记录 A,保存在变量中并插入 表#result,然 后 将 该 记 录 从#work 表删除 select top 1 curr=itemid,usage=usage from#workwhere lvl=lvl insert#result(lvl,itemid,usage)values(lvl,curr,usage)delete#work where lvl=lvl and itemid=curr /以记录 A 为父节点在 BOM 表中选取其所有子节点,并插入表#work insert#work select lvl+1,cid,usage from“BOM表”where pid=curr and pidcid/如记录A有子结点集B,则层次码加 1,否则减 1.然后跳至循环开始 if(rowcount0)set lvl=lvl+1 end else set lvl=lvl-1 end/从表#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-66.