最新技术文档
当前位置:首 页>> 技术支持>> 技术文档 [阅读]

紫金桥自由报表工程示例——结合关系库操作


 

 

 

前不久,我在一个工厂做项目,做到报表这,采用了一个不错的方法来实现客户需要的功能。回来后,我还原了报表部分的实现过程,分享给还在此环节徘徊的朋友。

 

无论什么工厂,电这种能源都会用到,下面我就电量的日报表做一个演示。本示例共有两幅画面,一个是报表显示画面即图(1),另一个是人工录入画面即图(2)。


                                  


                                  

 

 

 

接下来分别介绍两个画面的功能和实现它的脚本。

 

一、报表显示

 

1、功能展示

 

报表显示画面,运行时如图(3)所示。绿色处为人工录入数据

 


                                 

 

点击“查询”,报表内显示如日期所示那天的数据,见图(4)。

 

 


                               

图(4)中日期可选过去的任一天,只要有数据就能查出来。超过当前时间就会报错。


点击“导出”按钮,可将报表内的所有内容保存为Excel可打开的文档,如图(5)。


                                 

2、实现原理

 

下面介绍此报表功能的实现,报表中名称与位号的对应关系如下表:

 

自发电

D01

外购电

D02

总供电

D01+D02

生产一部一车间

D03

生产一部总耗电

D04

生产二部一车间

D05

生产二部二车间

D06

生产二部总耗电

D05+D06

生产三部一车间

D07

生产三部二车间

D08

生产三部总耗电

D07+D08

其他用电

D09

总耗电

D04+D05+D06+D07+D08+D09

供与耗差额

总供电-总耗电 即 D01+D02-D04-D05-D06-D07-D08-D09

 

表中一部就只有一车间,一部总耗电也就等于一车间耗电,为什么不直接让一部总耗电=一部一车间耗电,而要另建一个位号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表里的内容进行筛选,把参数strselect表里的第二列(也就是位号名)内容进行比对,如果完全一致返回第四列(也就是日量),否则返回空。要是想取累积量,把“4”改成“3”。

 

有人可能会问:“存储的日量是数据,为什么要当字符串取出?”如果返回实型数据,则位号比对失败后返回0,在查询之前报表内都会显示0,很不好看,也容易给人造成误会。返回空就不会有这种情况,而且对结果毫无影响。使用时只要将需要显示的位号写到参数里就行了,像这样“GetVal(D01)”,记得前面加“=”。从图(6)我们可以清晰的看到。

 

这样,报表的显示就完成了。

 

二、人工录入

 

1、功能展示

 

人工录入页运行时如图(12)所示,在第三列“数据”中输入要录入的数据,然后点保存即可。

 


                             

 

数据会保存到关系数据库表“电日表”里,再次查询数据就能发现,看图(13)。

 


                              

从图中可以看到人工录入的数据“410”已经覆盖了“外购电”之前的数据。与图(4)进行比较能发现变化,而且“总供电”和“供与耗差额”也跟着变化,因为它俩是由“外购电”算出来的。

 

2、实现原理

人工录入的实现比较简单,主要在“保存”按钮上,来看看“保存”按钮内的脚本。

 


 

整体就是用sql update语句把“电日表”的第四列替换为“tab”表第三列的数据,条件是日期和位号名要对应。代码中的“tab”就是录入数据的报表;“sql”是一个隐藏的报表,作用是连接报表关系源点,来执行sql语句。Update()是一个自定义函数,返回24小时前的日期,代码如下。这样,数据就能准确的更新到关系库表“电日表”中。

 


 

另外,“tab”表中的内容是在窗口脚本里被写入的,代码如图(14),因为我这就一条数据,所以直接赋值到单元格里。假如报表多且每一个里都不止一条数据,可以用数组变量把每个表里的所有位号信息分别放到数组里,再取数组里的信息一一设置到“tab”中。


                        

 

最后,本页面还要显示一些其他的信息,根据自身需要吧,我就不多说了。