采用MES数据存储与水晶报表开发中国式报表
2016-03-06莫洪艳
莫洪艳
(天津天铁冶金集团热轧板有限公司,河北涉县056404)
采用MES数据存储与水晶报表开发中国式报表
莫洪艳
(天津天铁冶金集团热轧板有限公司,河北涉县056404)
针对MES中的报表格式复杂,信息量大,且企业报表存在“善变”的特点,采用数据库存储过程与水晶报表结合的方式,对中国式报表进行开发,加强了报表的统计和对比功能,提高了整个系统的可靠性。
MES;存储;水晶报表;中国式报表
1 引言
天铁热轧板卷工程产线覆盖炼钢、连铸、热轧和各系统配套的公辅设施。天铁热轧MES系统作为天铁热轧公司生产制造的核心,接收集团ERP系统的销售订单,设计、协调、组织、监控各工序的生产。MES系统查询统计模块提供各种方便、灵活、实时、有效的查询、统计和分析功能,对从各个工序收集上来的生产实际数据进行统计和分析,形成各类报表,为公司的生产、经营、财务、购销管理提供数据基础,帮助管理人员对生产进行管理和决策。
2 MES系统中报表特点
一般情况下国外的报表样式非常规整,没有格线,表头非常简单,没有斜线表头、没有分层分组。单张报表提供的信息有限,如果要查看所有信息,只能将几张表进行对照。
而中国式的报表格式复杂、信息量大。中国报表很少有不带格线的,因为中国的表头比较乱,三五层的大格套小格很常见,还有著名的斜线,没有格线容易看走眼。中国式报表的信息量大,各种各样的数据,明细、汇总往往都集中在一张纸上。中国式报表的复杂有多种原因,有人认为是应用水平低、业务不规范造成的;也有人认为可能报表习惯与文化有关。中国式报表要求格式复杂意味着报表开发工具需要具有强大的版面设计能力;信息量大意味着报表开发过程中需要大量的复杂的统计运算。一个适合中国式报表的工具应该能够同时解决以上两个问题,这才能算是一个好的工具。
天铁热轧MES系统中的多数报表也是典型的具有中国特色的中国式报表。如图1(部分数据进行遮挡处理)所示,一个炼钢连铸区域的生产日报表,涵盖炼钢连铸产线中多个工序、不同工位和班次的生产情况。针对生产出的板坯又要根据钢种分别统计产量、检验合格量、外销量、库存量,这里面多个数值不仅要求当日数值,还有要求累计数值,月累计或年累计;此外,又要对重点设备的运行情况进行监控,比如转炉的炉龄。这样一个复杂的报表将中国式报表“一表展乾坤”的特色演绎得淋漓尽致。针对报表复杂性的特点,又考虑到企业报表存在“善变”的特点,我们从统计运算和报表格式两个方面下手,采用数据库存储过程与水晶报表结合的方式开发报表,效果还是非常不错的。
图1 天铁热轧MES系统中部分报表
3 使用存储过程结合水晶报表开发的优越性
在MES报表开发中,不同于二级报表更注重生产过程和曲线,MES报表更注重统计和对比,这样就涉及到大量的计算和统计,这些报表数据大多来自于一个或多个生产实际数据表,尤其针对日报表或以日报为基础的各类数据统计,每个终端客户查询一次报表就在本地对各工序数据进行一次统计是不现实的,通讯流量、本地资源占用等都会受到很大影响。最好的办法就是在数据库中做好任务,每天由数据库利用闲时来进行统计,然后供客户端查询。
利用存储过程来处理报表的计算具有很高的优越性,原因源于存储过程的执行效率高,并具有非常强的可重用性、可移植性、可维护性和安全性。
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度;存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后,存储在数据库服务器中,应用程序使用时只要调用即可。只需要写一次,即可以由数据库任务来调用,也可以在客户端由应用程序调用;本项目的Oracle在AIX系统下运行,即使将来操作系统变化或版本升级,Oracle良好的移植性也可以完全应对;针对生产过程中存在的不确定因素,各种报表也要根据需要进行调整,针对数据统计计算方面的更改,只需要进行存储过程的修改和编译就可以了,而客户端代码的零修改极大地方便了开发和使用人员;存储过程可设定只有指定用户才具有对其具有使用权。
水晶报表在布局方面支持交叉报表、子报表。报表格式方面支持添加文本对象、线条对象和框对象,支持插入图片;提供了非常灵活的机制来自定义报表中对象的外观,比如数据库字段、文本对象、公式。通过使用为这些对象准备的各种格式选项,开发人员可以根据需要从各个方面改变报表的外观,比如字体、大小、颜色、对齐方式等。在计算与统计方面,水晶报表可以添加各种公式字段、汇总字段,提供分组,支持条形图、饼图等各种图表的插入;另外水晶报表还提供如打印日期等特殊字段以及参数字段、未绑定字段等,方便报表的开发与完善。以上特点是可以满足中国式报表对报表格式和统计的要求。
4 存储过程的开发
图1中报表为例开发存储过程,考虑篇幅问题,下面例子进行了简化处理,并部分采用伪SQL语句方便理解。首先,分析该报表涉及到的所有的源数据表,以及需要统计的内容和方法,然后编写存储过程,并将结果保存到数据库中供报表程序使用。如:1#转炉甲班某日生产炉数,需要访问的数据库表为t_bof,统计方法为查询t_bof表中生产日期为参数日期、班次为甲班并且工位对应1#转炉的所有数据的条数。
CREATE OR REPLACE PROCEDURE RI_BAO_SHU_JU——存储过程的名字
(StartTime in varchar2)——参数为统计时间,yyyy-mm-dd
As
……
bof1_jb_zlls number(8,0);——1#转炉甲班的生产炉数
……
BEGIN
Delete from rp_acto where production_date= StartTime;——如果统计结果已经存在,删除原有重新计算,针对生产实绩中数据有误,修正后重新进行统计的情况
…
Select count(*)into bof1_jb_zlls number——数据的计算统计过程
from t_bof
where生产日期=StartTime and班次=甲班and工位=1#转炉;
…
Insert into rp_acto (production_date… , bof1_jb_zlls number,…)
values(StartTime,…,bof1_jb_zlls number,…);——将数据存储到数据表中
END RI_BAO_SHU_JU
在存储过程开发并编译成功后,可以在sql*plus中调用并测试,在通过测试后,利用Oracle任务进行自动调度。数据库任务开发时调用该存储过程并将参数设置为“昨天”ri_bao_shu_ju(to_char (trunc(sysdate-1),’yyyy-mm-dd’)),然后设置执行时间和间隔时间等参数。
5 水晶报表的开发
水晶报表在与数据关联时存在Pull,Push两种开发模式,Pull模式基本上不需要编写什么代码,访问数据源有限,做好模板直接调用即可,只是在部署或数据库等发生变动时比较麻烦;相比较之下,Push模式虽然要多写些代码来实现Push的过程,但该方式不仅可以更灵活的组织数据库里的数据,甚至可以自行任意组织数据,更加灵活可控,通过ADO.Net等可以访问各种数据源,后面的例子也采用了Push模式。当然,不管选用何种模式,首先要完成的都是报表模板的制作。
开发报表格式可以与存储过程开发同步进行,只要在开发之初定义好共同使用的数据库表就可以了。通常我们做普通报表模板开发时重点注意数据源设置、数据字段绑定、特殊字段应用、文本对象设置这些就可以了。以上述报表为例,在.NET项目中添加新建项Crystal报表,选择相应的模板,可以看到生成.rpt文件。通过打印机设置、纸张设置来完成打印机、纸张大小A4、方向横向、页边距设置。通过数据库专家添加数据源RP_ACTO,绘制报表模板,这里可以从工具箱中拖拽文本对象、线条对象、框对象到报表模板,通过编辑对象来调整其外观,并将需要的字段项从字段资源管理器中,通过拖拽将需要展示的字段放到报表模板指定位置上。在字段资源管理器中公式字段中增加公式字段,如:1#连铸机当日4个班次的合计产量=1#连铸机当日甲班产量+乙班+丙班+丁班,然后将产生的公式字段拖拽到报表模板上。在字段资源管理器运行总计字段中增加汇总字段,如:1#连铸机所有钢种当日产量合计=所有1#连铸机当日产量求和。从字段资源管理器特殊字段中拖拽打印日期、打印时间到报表页脚。通过以上操作报表模板基本就完成了。这里面的例子并未包含水晶报表的所有功能,它还支持交叉报表、子报表,可以插入参数字段、未绑定字段、图片、图表等,在数据统计方面还可以增加分组并统计。水晶报表强大的功能使得中国式报表模板开发这个难题变得迎刃而解,见图2。
6 客户端程序的开发
在完成前面两项开发之后,开发人员需要将报表整合到MES系统的报表模块中,此处完成的工作相对简单好多,这也体现了此种开发方法的优越性。下面的例子采用C#.Net开发,需要引用CrystalDecisions.CrystalReports.Engine。首先定义 Re-portDocument对象,装载上一步开发好的.rpt报表文件,此处重点是指定好报表文件的存储位置,路径可以是绝对路径也可以是相对路径,一般情况我们采用的是相对项目的相对路径。
图2 水晶报表
ReportDocument myReport=new ReportDocument();
stringreportPath=Application.StartupPath.ToString ()+@"Reports"+strReportFileName;
myReport.Load(reportPath);
在定义报表对象并指定装载的报表文件后,需要对报表的数据源进行指定。这个步骤我们要结合界面输入的查询条件来完成,在此不赘述。
OracleConnection oraconn=new OracleConnection(connectString);
OracleDataAdapter oda=new OracleDataAdapter (SelectSqlString,oraconn);
DataSet ds=new DataSet();
……
oda.Fill(ds,"students");
myReport.SetDataSource (ds.Tables ["students"]);//为报表填充数据源
最后把报表绑定到CrystalReportViewer控件,供用户查询导出,CrystalReportViewer控件具有打印、缩放、导出等多种功能,对于一般报表来说,它的功能足够强大了。
crystal Report Viewer1.ReportSource=myReport。
7 结束语
报表作为MES系统中非常重要的一部分,一个好的开发方法给整个系统带来的好处不仅是开发时间的缩短,还极大提高了整个系统的可靠性和可维护性。本文中只是从总体结构上介绍了开发过程中,在实际开发过程中还有很多细节需要优化,如存储过程在开发过程中要注重PL/SQL的优化,在保障功能的前提下如何进行效率和性能的提升;在水晶报表中如何动态控制字段的宽度和高度等。
[1] 顾云锋,杨素霞,王智钢,等.Oracle数据库中存储过程开发研究[J].计算机与现代化,2011(10):138-142.
[2]欧阳艳阶.Net平台下水晶报表的应用研究[J].软件工程师,2012(7):38-40.
[3] 丛凤侠,杨玉强.通用水晶报表平台关键技术研究[J].计算机技术与发展,2013(6):219-222.
Chinese Style Report Development with MES Data Storage and Crystal Report
MO Hong-yan
(Plate Hot Rolling Company Limited,Tianjin Tiantie Metallurgy Group,She County, Hebei Province 056404,China)
Aiming at complicated reports with massive information in MES and the"changing"characteristic of enterprise reports,from aspects of statistical operation and report format,Chinese style report was developed by way of the combination of database storage process and crystal report.The statistics and comparison functions of report were enhanced and the reliability of the whole system was improved.
MES;storage;crystal report;Chinese style report
10.3969/j.issn.1006-110X.2016.06.006
2016-08-11
2016-08-25
莫洪艳(1982—),女,工程师,主要从事钢铁行业MES的开发与维护工作。