前不久,我在一个工厂做项目,做到报表这,采用了一个不错的方法来实现客户需要的功能。回来后,我还原了报表部分的实现过程,分享给还在此环节徘徊的朋友。
无论什么工厂,电这种能源都会用到,下面我就电量的日报表做一个演示。本示例共有两幅画面,一个是报表显示画面即图(1),另一个是人工录入画面即图(2)。
接下来分别介绍两个画面的功能和实现它的脚本。
一、报表显示
1、功能展示
报表显示画面,运行时如图(3)所示。绿色处为人工录入数据。
点击“查询”,报表内显示如日期所示那天的数据,见图(4)。
图(4)中日期可选过去的任一天,只要有数据就能查出来。超过当前时间就会报错。
点击“导出”按钮,可将报表内的所有内容保存为Excel可打开的文档,如图(5)。
2、实现原理
下面介绍此报表功能的实现,报表中名称与位号的对应关系如下表:
表中一部就只有一车间,一部总耗电也就等于一车间耗电,为什么不直接让一部总耗电=一部一车间耗电,而要另建一个位号D04。其实,它们现在只是数值上相等,却代表着不同的意义,这样不容易混淆,以后也方便维护。
图(6)中的红色文本是给它们命名的名称,“time”是起始时间组件,去掉了时间部分,只留下了日期部分。“Table”是一个自由报表,数据由此表呈现。“select”也是一个自由报表,把它设置成隐藏不显示,它的作用是与关系库通讯,把需要显示的数据从sqlserver库里的相关表中取到“select”,再把数据设置到Table表的对应位置。
接下来有必要对我用的关系数据库做一个介绍,我用的是SQLserver 2000,建立了一个数据库“bbal”,建立表“电日表”。表的结构如下图(7)所示。一共四列,“TIM”指日期时间,字符串型;“NAME”是点位号名,字符串型;“VAL1”是该位号的累积量,实型;“VAL2”是该位号的日量,即两天的差值,实型。四列都不许为空。
查询命令是“查询”按钮发出的,那我们先看看“查询”按钮的代码,见图(8)。
注意,这里执行sql语句的是对象select,也就是那个隐藏的报表。查询的条件有两个,一个是查询的时间要符合变量sTime,另一个是点位号名要符合函数TagName(),TagName()是一个自定义函数,它的代码如下图(9)。它返回的就是报表里要显示的所有点位号的集合。
如果日期判断为不合法,将提示错误。如果合法通过,将执行sql语句,这时报表select里就该有内容了,如果把它设置为显示并放大,你就能看到如图(10)所示的内容。这里的四列与关系库表“电日表”的列是一一对应的。
最后用一个自定义函数GetVal(str)将数据设置到报表Table中。函数GetVal(str)中的str是函数的一个字符串型的参数整个函数的代码如下图(11)。
可以看出,整个代码都是对隐藏报表“select”进行操作的。因此建立的报表关系源点应与报表select相连,这样所有的操作才能有效。对select表里的内容进行筛选,把参数str和select表里的第二列(也就是位号名)内容进行比对,如果完全一致返回第四列(也就是日量),否则返回空。要是想取累积量,把“4”改成“3”。
有人可能会问:“存储的日量是数据,为什么要当字符串取出?”如果返回实型数据,则位号比对失败后返回0,在查询之前报表内都会显示0,很不好看,也容易给人造成误会。返回空就不会有这种情况,而且对结果毫无影响。使用时只要将需要显示的位号写到参数里就行了,像这样“GetVal(“D01”)”,记得前面加“=”。从图(6)我们可以清晰的看到。
这样,报表的显示就完成了。
二、人工录入
1、功能展示
人工录入页运行时如图(12)所示,在第三列“数据”中输入要录入的数据,然后点保存即可。
数据会保存到关系数据库表“电日表”里,再次查询数据就能发现,看图(13)。
从图中可以看到人工录入的数据“410”已经覆盖了“外购电”之前的数据。与图(4)进行比较能发现变化,而且“总供电”和“供与耗差额”也跟着变化,因为它俩是由“外购电”算出来的。
2、实现原理
人工录入的实现比较简单,主要在“保存”按钮上,来看看“保存”按钮内的脚本。
整体就是用sql update语句把“电日表”的第四列替换为“tab”表第三列的数据,条件是日期和位号名要对应。代码中的“tab”就是录入数据的报表;“sql”是一个隐藏的报表,作用是连接报表关系源点,来执行sql语句。Update()是一个自定义函数,返回24小时前的日期,代码如下。这样,数据就能准确的更新到关系库表“电日表”中。
另外,“tab”表中的内容是在窗口脚本里被写入的,代码如图(14),因为我这就一条数据,所以直接赋值到单元格里。假如报表多且每一个里都不止一条数据,可以用数组变量把每个表里的所有位号信息分别放到数组里,再取数组里的信息一一设置到“tab”中。
(14)
最后,本页面还要显示一些其他的信息,根据自身需要吧,我就不多说了。