【IT168 信息化】
0 引言
订单驱动的中小型制造企业之间的竞争的主要目标就是获取订单,但是接到订单对于本企业的整个供应链来说只是一个开始,所有的后续生产工作都是围绕订单为主线来展开,其大致过程如下:企业在接到订单后就要根据订单上所列出的客户所需要的产品明细和数量,并参照产品的物料清单(bill of material,BOM)来决定需要生产和采购哪些零配件和部件,再结合产品和零部件库存数量就可以确定每个零部件需要生产或是采购多少个。所以BOM是中小型制造企业生产过程的基础,由于ERP软件所实现的也正是这样的一个生产管理过程,所以BOM也就成为制造企业实施ERP的基础数据之一。BOM 表达的是每一个产品由哪些零部件组成,每一个部件是由哪些零部件组成。由此可以知道,BOM的表达是一个递归的过程,如果要明确地想知道每一个产品是由哪些零配件组成,就要将BOM逐层展开,直到最下层的全部是零配件,没有部件为止,这样整个产品的树状结构就完全显现出来。
作者在为广东省某卫浴企业以JSP为技术手段开发浏览器/Web服务器/数据库服务器(B/W/D)3层结构ERP的过程中,实现了在JSP客户端网页上BOM的逐层显示与隐藏,使BOM的编辑与查询非常直观方便。
1 BOM信息的结构
BOM表达的是产品与零部件之间的关系,具体内容包括一个产品是由哪几个零件或是部件组成,每个零部件又在这个产品中需要几个。而在实际应用中,还要根据工厂的具体情况加上这个零件或是部件的加工方式(生产/外购)信息和备注信息。由于产品和配件都有可能有重复的名字,所以对产品和配件都进行了编号,具体每个产品和配件的其它信息要到产品表和配件表中进行查询得到。所以,整个BOM表的实体属性图及其与产品表与配件表的关系如图1所示。
由于最终显示到浏览器上的BOM信息是由BOM表、产品表和配件表中联合查到的,所以在显示BOM信息之前,要将BOM信息、产品信息和配件信息统一到一个数据结构中,这一数据结构包括的具体字段为:零部件编号、零件/部件、零部件数目、生产/外购、零部件类型、零部件名称、规格型号。在每一条记录中还要记载有没下一级BOM信息,所以还要有一个“是否有下一级”的信息。由于BOM是一种树状结构的数据结构,所以还要明确知道每一条记录属于哪一级,所以还要有一个“属于哪一级”的信息。整体结构如图2所示。
2 JSP中实现客户端动态显示与隐藏功能的技术路线
使用JSP (Javas erverp age)实现的B/W/D结构的优点是操作方便,运行效率高。JSP是使用Java实现的动态网页,其动态性主要表现在同一个网页在输入不同的参数后,Java程序能根据输入参数去查询数据库从而显示出不同的内容,这是与传统的静态网页的不同之处!但是显示到浏览器的网页其实也是一个静态的网页,要实现静态网页与用户的互动,只能通过客户端脚本语言JavaScript与HTML相结合来进行。
2.1 客户端动态显示与隐藏
HTML中的DIV标签用来标记某一块独立的信息单元,将这个DIV标签的style属性设置为displaymone时,DIV所包含的内容可以实现隐藏;当将这个DIV标签的style属性设置为display:时,DIV所包含的内容就可以显示出来。由于DIV是一个HTML标签,所以可以使用客户端脚本语言JavaScript来控制DIV标签的style属性值,达到客户端信息的动态显示与隐藏的目的。
对于需要逐层显示与隐藏的BOM来说中,要求BOM信息按照显示的顺序在网页上排列好,这样才能通过DIV来控制上层信息对下层信息的显示与隐藏,事实上BOM信息的显示与隐藏并不改变BOM信息在网页上的实际排列。如某行显示的是一个部件,那么其下一行开始显示的信息是在BOM中将这个部件当成一个产品来所查得的部件BOM信息,而上一层的BOM数据就要顺序后移。
2.2 Java中的数据访问与集合技术的结合
使用JSP技术通过Java代码来实现数据库的存取,并返回一个ResultSet类型的结果集对象。因为ResultSet数据集中的数据是一次查询的结果。而查得的下层BOM信息有可能插入到上层BOM信息中间,所以BOM信息在Web服务器端的临时存贮就不能以一个ResultSet数据集来完成,解决这个问题的办法就是要将每次查询得到的结果集数据按照要显示的顺序放到一个动态数组中。
在Java2中的Vector类可以支持动态数组,并且可以将不同类型的对象(当然相同类型的对象更没有问题)引用到Vector类的对象中去。Vector引用的对象存储的是一条条BOM 信息,而不是一个个的ResultSet数据集,所以在构建Vector对象时就必须对每一次查询得到的ResultSet数据集中的BOM信息进行重新处理,使数据集中的BOM信息能够按照要显示的1顷序在Vector对象中排列好。这是一个先序遍历过程,具体操作过程流程如图3所示。网页上显示的是Vector对象中的一条条BOM信息,由于这些信息已经在Vector对象中按照相互的从属关系排列好,所以只要完全按照Vector中的顺序显示出来后,这些BOM信息之间的相互关系就可以正确显示出来,通过BOM信息中的“属于哪一级”信息,保证每一个层次的BOM信息都属于同一个DIV。通过“是否有下一级”就可以确定层与层之间的相互关系。
所以如果某一层DIV可见,则该层BOM能显示,如果该层DIV不可见,则该层BOM就隐藏。结合JSP中的集合技术、HTML中的DIV及Javascript代码实现了BOM在客户端的动态显示与隐藏。
3 结束语
通过一次先序遍历就可以将一个树状结构的产品BOM信息从数据库中提取出来(实际的实现中是通过多次数据库表的查询来完成),并按照需要显示的顺序存储到Vector对象的引用中。在网页上通过使用JavaScript来控制DIV标签的style属性的设置,就可以控制DIV标签的显示与隐藏,从而做出动态逐层显示与隐藏BOM信息的网页效果,有利于有效利用网页空间来显示BOM的树状信息。