工控网首页
>

应用设计

>

基于ActiveX技术的组态软件通用报表控件的实现

基于ActiveX技术的组态软件通用报表控件的实现

2006/11/14 9:37:00
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图1 拉模型示意图
图2推模型的示意图图2推模型的示意图
在组态软件中直接引用水晶报表控件,存在着一些不足:报表是在数据库的基础上生成得,所以肯定有生成报表所要显示得数据集,或者把报表要显示的数据存储到一个报表引用的临时表。这个功能是需要和用户进行交互的,要通过写代码来实现,而组态软件的编程功能是相当薄弱的,所以我们采取基于水晶报表来制作通用报表控件。 4 VB开发通用报表控件 4.1 报表控件设计的基本思路 作为优秀的报表模块,应具备良好的用户交互性,控件根据用户的需求选择生成相应的报表[4],我们设计的报表控件如图3所示,有着年月日报表、班报表、故障报表等供用户选择,并提供了打印、导出等功能。
图3图3 报表控件界面图
为了方便满足用户的交互性,使用水晶报表的“拉模型”,当用户点击显示报表按钮时,根据用户的选择,报表控件自动生成SQL语句,利用ADO技术,从SQL server数据库中提取出报表数据,存储到一个临时数据库表中,而此临时表是预先设计好的水晶报表模板的数据存储表,所以显示报表时,驱动程序连接到数据库的该临时表并将数据“拉”进来,生成报表,供用户预览打印,报表控件的3层结构图如图4所示。
图4图4 报表控件结构图
4.2 报表控件属性和方法 为了实现报表控件的通用性,该控件应该具备完整的接口,以方便组态软件对其的调用[5]。在此报表控件中,我们制作了如表1所示的主要属性和方法: 表1 报表ActiveX控件的主要属性和方法
4.3 将此报表控件嵌入到组态软件 在支持ActiveX控件的组态软件或者其他软件,如IE,WORD等,均可引用此报表控件,下面以INTOUCH9.5为例。 在INTOUCH中引AcitveX控件的主要步骤:WindowMaker---特别---配置---向导/ActiveX安装,在可用的AcitveX控件中,选择我们做的通用报表控件-ReportCommon 1.0 INTOUCH使用此ActiveX控件范例如下: #ReportCommon.Db_server="dataserver"; #ReportCommon.Initial_cata="intouch"; #ReportCommon.UserId="sa"; #ReportCommon.PassWord="intouch";以上为设置数据库 #ReportCommon.RptSource="C:\RptSource\month.rpt";设置报表模板位置 #Report_common.RptPrinterName="printer1";选择打印机 #Report_common.Autoprint_en=1;允许自动打印 #Report_common.Ymd_option=1; #Report_common.Month_check=1;选择月报表 #Report_common.ReportView();显示报表 #Report_common. QuickPrint();打印报表 4.4 制作通用报表控件应注意的问题 基于水晶报表做通用报表控件,可以大大简化底层报表的具体设计工作,提高效率。在基于水晶报表设计通用报表控件时应该注意以下事项: ①为了实现报表控件的通用性,要考虑周全控件的属性和方法,这样才能成为真正意义上的“通用报表控件”。 ②为了方便编程,我们使用水晶报表的“拉”模型,所以只需在数据库中针对每个报表模板定义一个表,只是在生成报表时使用此表。当用户要求生成报表时,首先清空此表,通过SQL语句按照用户的选择从历史数据库中提取数据,写入该表,然后再显示报表。 ③在使用分布式数据库服务器,应该注意在把数据写入临时表后,暂停一定时间,再显示报表,因为SQL语句的查询、写入和计算机之间的数据传送需要一定时间,所以在设计时,写入临时表数据后,暂停几毫秒,再显示报表,代码如下: 暂停0.05秒 Dim PauseTime, Start PauseTime = 0.05 设置暂停时间。 Start = Timer 设置开始暂停的时刻。 Do While Timer < Start + PauseTime DoEvents 将控制让给其他程序。 Loop ④在Windows XP操作系统下,使用水晶报表控件,显示报表后,系统会在某个盘符的根目录下,或者应用程序所在的目录下生成一些临时文件,而报表关闭时,这些临时文件不会自动删除,所以我们需要在显示完报表后,删除这些临时文件,代码如下: On Error Resume Next Kill App.Path + "\*.tmp" Kill "c:\*.tmp" Kill "d:\*.tmp" Kill "e:\*.tmp" 5结束语 基于ActiveX技术的通用报表控件,有着较好的移植性和重用性,并可方便的嵌入到组态软件中,弥补了组态软件的报表功能缺陷,避免了报表的重复设计和代码的重复编写。该报表控件成功的在某自来水厂自动化工程的INTOUCH组态软件中使用,该组件运行可靠,解决了以往组态软件缺少报表模块的难题。 [参考文献] [1] 潘爱民. COM原理与应用[M].北京: 清华大学出版社,1999,11. [2] 王跃宣,苏宏业,褚健,胡昔详. 基于COM技术得先进控制软件开发及应用[J].化工自动化及仪表, 2002,29(4):51-53. [3] 麦科伊.水晶报表Crystal Reports 9从入门到精通[M]. 冯华英 等译.北京: 电子工业出版社,2003. [4] 王志琪,方康玲. 关系数据库在Fix工控系统报表生成中的应用[J]. 武汉科技大学学报(自然科学版), 2002, 25(1):88-91. [5] 瞿有甜,童宝军,丁健龙.报表的插件技术及其动态设计[J]. 计算机工程,2005,31(19):231-232.
投诉建议

提交

查看更多评论