喻道远 何世林 陆 远 张三强 史登松 李苏珂
(①华中科技大学数字制造装备与技术国家重点实验室,湖北武汉430074①南昌大学机电工程学院,江西南昌 330031)
报表生成是MES(制造执行系统)的核心功能之一,其主要功能是对MES中大量的生产数据进行加工分析,形成结构复杂的、样式多样的生产统计分析报表,力求能够直观、综合、概括生产过程中各业务之间的内在联系,为企业的生产决策层提供准确的生产数据信息[1]。目前很多企业的 MES报表系统采用以EXCEL的形式呈现[2-4],采用此方法的报表系统,用户容易掌握,结构容易调整,但是代码重用度低,报表发布和管理困难,且容易掺杂人为因素,报表格式没有统一的规范,数据的准确性相对较低。
近年来随着.NET技术的迅速发展,使得其自带的水晶报表成为报表系统新的研究对象[5-6],水晶报表的优点是外观显示效果好,代码开发量少,但是在其具体应用中会遇到了很多问题,如:后期的维护不方便,只有开发人员才可以修改报表结构和数据源,用户无法或只能少量的定义和修改,任何的业务变动都有可能需要修改存储过程甚至.NET代码。
MES报表格式因企业业务需求的不同而不尽相同。例如汽车总装线业务所需的报表就有生产月报表、年报表、上线报表、下线报表和入库报表等五大类。各类报表格式迥异,有纵向排列的也有横向伸展的,有些报表的框架结构是固定不变的,另外一些则是根据所得数据量的多少动态搭建的;各类不同报表之间有很多结构相同的报表块,如通用的标题栏等,同类单个报表也有很大一部分结构是由多个相同的小报表块重复叠加组合而成,如年报表就是由12个结构相同的月统计记录报告组合而成;随着MES在装配线上的应用,用户对报表的需求也会随之变化,可能不再拘泥于以上五类报表形式,如上线初期生产线电子看板功能就被提到案上,用户希望可以在MES报表系统上直观地、透明地和交互地设计用户想要的报表。综上,MES报表的特点可以概括为:类型多样,结构动态,重复区多,用户可配置。
MES柔性报表系统的技术方案采用基于.NET和Oracle技术进行开发。这种方案有其自身的优点:统一的操作界面,用户容易熟悉,操作方便,所有的应用在服务器端生成,对客户端配置要求低,报表发布和管理简单。为克服报表系统维护的困难,将整个报表生成过程分为两个层次:报表结构构造层和数据整合层。报表结构构造层的功能有参数的定义与读取、报表结构搭建、表格样式设置以及XML配置;数据整合层为结构层提供丰富、准确的数据,主要实现功能有数据源配置、存储过程的定义、触发器的定义、数据视图的定义、传递查询参数以及从数据库中查询整合并提取数据。报表结构构造层与数据整合层通过各自包含的逻辑类库相互访问,松散耦合,可移植性和通用性强。
图1所示的报表平台中,结构构造层为用户提供可视化的报表绘制界面,用户能够定义和修改行和格的尺寸大小、布局、字体、显示内容,增加、删除和修改报表的行数和格数,定义和修改报表查询参数等,可以认为这种报表编辑界面完全能够达到用户自定义的要求。数据整合层主要完成两项工作,一是和结构构造层一起完成报表的搭建,数据整合层从数据库中读取表格的嵌套结构信息,反馈给结构构造层,结合结构构造层的行、格结构信息,搭建出整张报表;二是获取数据,用户在结构构造层中输入报表查询参数、设置查询语句,数据整合层提取参数、配置数据源并从数据库中获取数据。
首先,通过对企业目前各类不同的报表分析,总结出一张复杂的报表是由许多结构较为简单的内嵌表和单元格组合而成的。“行”是报表的的第1级元素,可以认为在柔性报表系统中任意一张报表都是由多个行对象组成的,报表的每一行包含若干列,行和列所对应的就是格对象。“格”是报表的第2级元素,格的内容可以是单元格也可以是加入格中的内嵌表,有很大一部分报表都有相同结构的内嵌表。因此,采用表格内嵌表的方式,可以大大提高表格结构的复用性,如图2所示。
图2描述了不同类型但有一定相似性的A类报表和B类报表的结构,他们都是由各自的行对象组成,每个行对象中可以放入若干格,格有单元格和内嵌表两种表现形式。可以看出A类报表由两个内嵌表A(内嵌表A中同样也是由内嵌表A1和单元格组成)和单元格组成,B类报表由内嵌表A、内嵌表B以及单元格组成,其中内嵌表A为两类报表所共有,且在A类报表中重复利用。因此定义这两种不同类报表只需定义3个内嵌报表A、B、A1即可,这种内嵌表对象的复用大大降低了报表定义的工作量以及代码的开发量。需要说明的是,图中单元格可以显示静态文字和动态数据,是报表的最小组成元素。内嵌表是指在可以放入到另一个报表中的表格。
在拆分了报表元素之后,得出表对象下各级元素分别为行和格。表对象数目繁多,为了便于管理,故将表分类,用于标示表为普通报表或内嵌表。可以得出以下几个报表成员:表类型、表对象、行对象、格对象和查询参数。其数据结构模型如图3所示。
图3使用UML模型描述报表的数据结构。表类型对象可以放入多个表对象;表对象可以放入多个行对象;行对象可以放入多个格对象。需要指出的是行对象分为两类:普通行和数据行,普通行是行数固定的一行,数据行是根据查询数据量的多少重复显示格式相同但数据不同的行。格对象的类型有四种:静态数据格、动态数据格、中间参数格和对象格,静态数据格用于写入一些固定不变的信息,这些信息不会因查询参数的不同而不同,如标题栏的文字、表头信息等等。动态数据格用于绑定其自身表的数据源字段,中间参数格用于绑定不同表之间的数据源字段,如当内嵌表中的某一格需要填充外部总表的数据源字段时,则需要采用中间参数格,对象格用于放入某个内嵌表,实现表格的嵌套。查询参数是与表对象相关联的,是多对一的关系,即与表对象可以有多个关联也可以没有关联的查询参数,表对象根据其自身的数据源和查询参数通过数据整合层从数据库中查询并写入数据。数据源一般情况下是一段SQL语句,也可以是在数据库中已经定义的存储过程名。
上述柔性报表系统方案已经在国内某汽车总装线MES上得到应用。此MES的开发环境是VS2008,采用的数据库是 Oracle9i。以绘制下线报表为例,在页面表示层中定义报表基本信息、报表查询参数以及报表结构。报表基本信息中可以定义报表ID、报表名称、报表类型、边框样式和数据源。下线报表查询参数包括车型类型、起始日期和终止日期、查询自起始日期到终止日期某车型的下线记录。报表结构定义则根据报表结构模型定义此报表的行数、列数、行样式、格样式、行类型、格类型等。报表结构对象的表、行、格可直接与HTML中的TABLE、TR、TD等元素相对应。为得到真正“所见即所得”的报表设计,行和格的尺寸均采用mm单位。下线报表采用了三层嵌套结构,最外层总表是由2个行对象组成,第1行是表头信息,包含7个静态数据格,分别显示“序号”、“车型”等静态数据,第2行只有1格,为对象单元格,用于放入一级内嵌表。一级内嵌表结构由2个行对象组成,第1行放入动态数据格用于显示“2009-06”和“2009-07”这样的动态月份数据,第2行只有1格,为对象单元格,用于放入二级内嵌表。二级内嵌表只有一个行对象,有两格,第1格为对象单元格,放入三级内嵌表,第2格为动态数据格,显示“小计(台)”字段,统计各天完工下线的车辆总数。三级内嵌表只有1行,此行属于“数据行”,会根据查询数量的多少动态显示行数,并显示下线车辆的详细信息,此行有6格,均为动态数据格。最终查询2009年6月29日~7月2日CV7/CV9的完工下线报表如图4所示。
采用将报表划分为多个简单内嵌表的组织方式,可以有效快速地绘制格式复杂报表,适用范围广,理论上可以构建任意格式的报表,充分体现MES报表系统的柔性。采用双层报表生成机制,为用户提供可视化的报表搭建界面,用户无需掌握任何C#和THML代码就可轻松绘制出想要的报表格式,使得报表的制定更具灵活性。此方法同样适用其他报表系统。
[1]王元珍,汪皓.达梦智能报表工具的设计与实现[J].计算机工程与应用,2001,37(4):65-67.
[2]彭海波,王哓东.JAVA环境中基于XML的一种EXCEL报表生成方法[J],电脑应用技术,2006(68):34-38.
[3]王桂霞,魏海平,梁永烨.MES生产报表子系统的优化[J],当代化工,2009,38(2):188-190.
[4]王锐,吕苏环.企业生产数据报表集成方式研究与实现[J].自动化博览,2009,11:57-60.
[5]谢星岸,王志新.B/S在水泥企业制造执行系统MES中的应用[J].微计算机信息,2006,22(7-1):148-150.
[6]陈传波,黄刚,刘清慧.一种基于ASP.NET的自定义报表的设计与实现[J].计算机工程与科学,2006,28(6):112-114.