服务热线:
您当前的位置:首页 > 世纪星月刊 > 第6期 (2011年6月)

【世纪星秘笈】简单快捷做报表

2011/9/21 15:12:49

 

技术部 孙秀丽

 

1 概述


  工业控制领域的生产数据,经常涉及到数据信息的分析、加工,最终还需把统计结果形成各种形式的报表自动生成,甚至自动打印,提供给用户,用户在报表生成的页面中只需要输入报表生成的条件如需要查询的日期点击数据查询即可生成当日报表。
  报表生成系统与数据库生成系统有关,在进入报表编辑之前必须完成数据库的生成,也就是说报表中定义的动态点必须在相应数据库中定义过,另一方面他又与控制方案生成系统有关,定时保存数据需要用功能块来驱动。今天,我们就为您讲讲世纪星的报表。


 

2 世纪星报表介绍


  在报表上用户最感兴趣的是出来的报表如何漂亮,出报表的操作如何熟悉简单,不用专门学习。世纪星组态软件提供的组态报表模板是具有自己特点的、实用性极佳的实现报表方式之一。为了方便使用,世纪星组态报表模板的使用方法类似与EXCEL电子表格,在组态报表模板中可以插入图表(柱状图、条形图、折线图、饼图、散点图、面积图)及图片,让你的报表看起来更生动更直接。


  同时也提供了很多函数供用户使用。前面说到报表的生成与数据库生成系统有关,世纪星提供的报表实现方式可以与世纪星自带的数据库相连,也可以通过ODBC 链接所有的历史数据库(如SQLserver,Access等)。当然如果客户需要实时刷新数据,那就需要在组态报表模板中直接连接变量,然后把报表模板与表格框连接就可以实现了。


 

3 报表类型


工业生成中常用的报表大致分为定时报表、实时报表。
  

定时报表:一般用来在规定的时刻打印生产过程的操作记录和统计(求和、平均等),主要用来取代操作工的抄表工作。这类报表一般采用定时驱动,通常有班报、日报、月报、年报等。
 

实时报表:用来打印当前时刻报表,可以由人工触发。
 

历史报表:用户指定时间,打印报表在过去某时刻的值。


 

4 操作过程


  在此,以日报表为例,举例说明在世纪星中如何实现报表生成系统。

  1)首先,打开世纪星软件,在菜单项文件中找到组态报表模板,点开,编辑模板如图:
此例是用ODBC连接ACCESS数据库,所以我们还要连接ODBC,具体操作请参考《世纪星帮助》中关于ODBC数据源定义。在此不再详细介绍。

 

 

  2)建立SQL表格模板,目的是以此模板在Access中建表。具体操作在《世纪星帮助》有详解,请参考。建如下模板:

 


 
  除此之外还要建记录列表,目的是以此列表为模型来存储数据。具体操作请参考《世纪星帮助》中关于记录列表管理的详细描述。


  特别要注意的是一定要保持记录列表中字段的顺序和标准数据库表格中的顺序一致。因为我们此例中数据库的表是通过上面建的表格模板创建的,所以也就要求记录列表的字段名要和前面建立的表格模板的字段名相一致。

 

 


 
3)页面编辑工作
 
在页面中添加表格框,连接模板为前面所建的组态模板——日报,添加一些查询按钮。

 


4)命令语言


  首先要把世纪星与数据库连接起来,并以前面建的表格为模板创建表。在命令语言下的应用程序命令语言编辑框中写如下命令:
ConnectionID=SQLConnect( "DSN=chart;UID=;PWD=" );
SQLCreateTable( ConnectionID, "日报表", "日报" );
前面提到报表生成系统一方面与数据库生成系统有关,另一方面他又与控制方案生成系统有关,定时保存数据需要用功能块来驱动,下面我们就添加命令以实现定时保存数据。
在左侧浏览器中找到命令语言下的事件命令语言,添加增加,出现命令语言编辑框,在事件描述中编辑:$分==59,命令语言如下:
 


 

“日报表”是数据库中表的名称,“日报写”是前面建的SQL记录列表模板,点击保存后该功能就实现了定时保存数据。报表也就完成了一半,下面就是查询数据了。
回到页面中,点击”数据查询”按钮,在命令语言中写如下命令:


FOR 行=3 TO 26 STEP 1
 FOR 列=1 TO 11 STEP 1
  zgSetString("日报",列,行,"");
 NEXT;
NEXT;
FOR 行=27 TO 30 STEP 1
 FOR 列=2 TO 11 STEP 1
  zgSetString("日报",列,行,"");
 NEXT;
NEXT;
{以下是表格框}
查询条件=" 年= "+StringFromIntg(查询年,10)+" AND 月= "+StringFromIntg(查询月,10)+" AND 日= "+StringFromIntg(查询日,10);
Result=SQLSelect( ConnectionID, "日报表", "日报读", 查询条件,"时 ASC" );
n=SQLNumRows( ConnectionID );
if n>0 then
   FOR 行=3 TO n+3;
  zgSetString( "日报", 1,行,查询时间 );
  zgSetValue("日报",2,行,查询电量);
  zgSetValue("日报",3,行,查询水量);
  zgSetValue("日报",4,行,查询吨耗);
  zgSetValue("日报",5,行,查询流量);
  zgSetValue("日报",6,行,查询水位);
  zgSetValue("日报",7,行,查询压力);
  zgSetValue("日报",8,行,查询功率);
  zgSetValue("日报",9,行,查询电流);
  zgSetValue("日报",10,行,查询电压);
  SQLNext( Result );
 NEXT;
else
ShowMessage( 200, 200, 250, "提示信息", "您查询的该日没有数据", "确定", "", "取消", "" );
endif;
SQLEndSelect( Result );


  大家可以看到,在用SQLSelect这个函数的时候所用到的模板是“日报读”,这个是因为笔者要查询的数据字段有些是不需要的,所以笔者建了两个列表模板,一个用来保存数据,一个用来读取数据。如果是用数据库列表框就可以在命令语言中直接选择字段,不需要建两个列表模板。


  强调一点的是:Result这个是SQLSelect的句柄,是个整数,在建这个变量的时候它的取值范围一定要足够大,不然在SQLNext( Result )引用到Result的时候就会出现错误导致查不到正确的条数。


  另外要说明的就是引用函数的问题,前面说过在组态报表模板中可以提供函数,但是要说明一点的是,这个函数是加载报表的时候进行运算,也就是说如果是在组态报表模板中直接连接的变量,那么这个函数是可以用到,但是如果上面通过代码来加载表格框中的数据,这个函数是不能正确运算的,是需要通过代码来计算,然后再加载到表格框中。


点击”报表删除”按钮:在命令语言中写:
查询条件="  年= " +StringFromIntg( 查询年, 10 )+" and 月= " +StringFromIntg( 查询月, 10 )+" and 日="+StringFromIntg( 查询日,10 );
SQLDelete( ConnectionID, "日报表", 查询条件);
删除用户所选择的日期报表。


   点击”当前报表”按钮,在命令语言写代码和”查询数据”按钮代码一样,只要把查询条件中“查询年”换成“$年”, “查询月”换成”$月”, “查询日”换成“$日”即可。

  点击“打印预览设置输出”按钮,写如下命令:zgPrint( "日报",2 );运行过程中点击该按钮出现报表预览页面,可以在该页面候总设置页面,然后打印,这是实时打印或则历史打印,如果要定时打印的话,可以在事件命令语言编辑框的事件描述中确定打印时间,在命令语言编辑框中编写打印的命令语言。


  好了,就这几个步骤,你需要的报表就可以轻松完成。当然,还可以再深究看看世纪星其他的实现报表的方法,也许会更简单呢!

 


 


企业邮箱  |  法律公告  |  隐私保护  |  联系我们  |