发表于:2006-11-11 21:10:00
楼主
[color=#FF0000]来源于http://bingfeng.blog.edu.cn/[/color]
基于ActiveX技术的组态软件通用报表控件的实现
彭哲 浙江大学 系统工程研究所,浙江 杭州 310027
摘 要: 针对大部分组态软件不具备报表功能的现状,探讨了一种基于水晶报表控件,结合ActiveX Data Objects(ADO)技术和标准Structured Query Language(SQL)语句的组态软件通用报表控件的设计方法,以弥补组态软件的不足,具有较好的移植性和重用性,并指出了开发通用报表控件时需要注意的事项。
Abstract: Aim at most Supervisory Control and Data Acquisition (SCADA) system having no report function, this paper discusses how to design common report module with ActiveX Data Objects(ADO)technology and standard Structured Query Language(SQL)based on Crystal Report to solve SCADA report problem. This module can be repeated used. This paper point out what should be taken notice during developing common report module.
关键词:ActiveX; 水晶报表; 组态软件; 通用报表控件; ADO
Key word: ActiveX; Crystal Report; SCADA; Common report module; ADO
1 引 言
通用组态软件有着强大的功能,具有易用性,可以大大缩短用户的开发时间,所以目前组态软件在工业控制领域应用的非常广泛。作为通用得组态软件,在某些方面可能不满足我们的需求,这就要求我们通过其他工具进行功能模块开发,集成到通用组态软件中。
报表作为一种信息组织和分析的有力手段,是信息系统的重要组成部分。但很多组态软件本身不具备报表功能,我们有必要开发通用报表控件,弥补组态软件的不足,以满足工程的需求。
要实现报表控件的通用性,最根本的技术措施是用对象、组件技术去开发,利用对象的机理去组织报表,提高报表模块的通用性和重用性,基于COM组件的ActiveX 技术能够满足该需求。
2 ActiveX技术
ActiveX是Microsoft 提出的功能强大的程序设计和开发技术,基于Component Object Model (COM)的可视化控件结构的一种封装技术。ActiveX控件是以二进制代码形式发布,具有与语言无关的特点,可以为任何支持COM 的高级语言及软件所调用,有着较好的电脑移植性。利用组件技术,可以实现一次编写,多处使用,而不需要重新编译链接,极大地推动了软件的集成化[1] [2]。
可以用多种语言在WIN32环境下开发ActiveX组件,如MFC,ATL,VB,DELPHI等。在本文中,用VB对其进行开发为例。VB提供了ActiveX控件界面向导,可以方便我们定义控件的属性、方法和事件。
3 水晶报表控件
水晶报表(Crystal Reports)是一种报表系统常用的解决方案,能方便的与多种数据源建立连接,有着丰富的实现复杂报表格式和结构、网络输出和打印输出等功能。水晶报表主要有以下几个重要组成部分组成: 报表引擎、报表设计器、报表查看控件、. rpt报表文件和数据源。
我们通过报表设计器来设计报表模板,如设计标题,插入数据、公式、图表、子报表等,并设置数据源,从而生成.rpt报表文件,在其他编程语言如VB中,可以通过报表引擎对报表数据进行操作,通过报表查看控件预览报表。
数据源作为报表非常重要的一个组成部分,有2种数据访问方式供开发人员使用:拉模型(pull) 和推模型(push) [3] 。在拉模型中,驱动程序连接到数据库并根据需要将数据“拉”进来。使用这种模型,与数据库的连接和为了获取数据而执行的SQL 命令都同时由Crystal 报表本身处理,不需要开发人员编写代码。与拉模型相反,推模型需要开发人员编写代码以连接到数据库,执行SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表文件。该方法使您可以将连接共享置入应用程序中,并在Crystal 报表收到数据之前先将数据筛选出来。
拉模型和推模型示意图如图1和图2所示。
图1 拉模型示意图
图2推模型的示意图
在组态软件中直接引用水晶报表控件,存在着一些不足:报表是在数据库的基础上生成得,所以肯定有生成报表所要显示得数据集,或者把报表要显示的数据存储到一个报表引用的临时表。这个功能是需要和用户进行交互的,要通过写代码来实现,而组态软件的编程功能是相当薄弱的,所以我们采取基于水晶报表来制作通用报表控件。
4 VB开发通用报表控件
4.1 报表控件设计的基本思路
作为优秀的报表模块,应具备良好的用户交互性,控件根据用户的需求选择生成相应的报表[4],我们设计的报表控件如图3所示,有着年月日报表、班报表、故障报表等供用户选择,并提供了打印、导出等功能。
图3 报表控件界面图
为了方便满足用户的交互性,使用水晶报表的“拉模型”,当用户点击显示报表按钮时,根据用户的选择,报表控件自动生成SQL语句,利用ADO技术,从SQL server数据库中提取出报表数据,存储到一个临时数据库表中,而此临时表是预先设计好的水晶报表模板的数据存储表,所以显示报表时,驱动程序连接到数据库的该临时表并将数据“拉”进来,生成报表,供用户预览打印,报表控件的3层结构图如图4所示。
图4 报表控件结构图
4.2 报表控件属性和方法
为了实现报表控件的通用性,该控件应该具备完整的接口,以方便组态软件对其的调用[5]。在此报表控件中,我们制作了如表1所示的主要属性和方法:
表1 报表ActiveX控件的主要属性和方法
控件属性
Db_server
数据库服务器名
Initial_cata
数据库名
UserId
数据库用户名
PassWord
数据库密码
RptSource
数据源物理地址
RptPrinterName
打印机名
&nb