基于ActiveX技術(shù)的組態(tài)軟件通用報表控件的實現(xiàn)
1 引 言 通用組態(tài)軟件有著強大的功能,具有易用性,可以大大縮短用戶的開發(fā)時間,所以目前組態(tài)軟件在工業(yè)控制領(lǐng)域應(yīng)用的非常廣泛。作為通用得組態(tài)軟件,在某些方面可能不滿足我們的需求,這就要求我們通過其他工具進行功能模塊開發(fā),集成到通用組態(tài)軟件中。 報表作為一種信息組織和分析的有力手段,是信息系統(tǒng)的重要組成部分。但很多組態(tài)軟件本身不具備報表功能,我們有必要開發(fā)通用報表控件,彌補組態(tài)軟件的不足,以滿足工程的需求。 要實現(xiàn)報表控件的通用性,最根本的技術(shù)措施是用對象、組件技術(shù)去開發(fā),利用對象的機理去組織報表,提高報表模塊的通用性和重用性,基于COM組件的ActiveX 技術(shù)能夠滿足該需求。 2 ActiveX技術(shù) ActiveX是Microsoft 提出的功能強大的程序設(shè)計和開發(fā)技術(shù),基于Component Object Model (COM)的可視化控件結(jié)構(gòu)的一種封裝技術(shù)。ActiveX控件是以二進制代碼形式發(fā)布,具有與語言無關(guān)的特點,可以為任何支持COM 的高級語言及軟件所調(diào)用,有著較好的電腦移植性。利用組件技術(shù),可以實現(xiàn)一次編寫,多處使用,而不需要重新編譯鏈接,極大地推動了軟件的集成化[1] [2]。 可以用多種語言在WIN32環(huán)境下開發(fā)ActiveX組件,如MFC,ATL,VB,DELPHI等。在本文中,用VB對其進行開發(fā)為例。VB提供了ActiveX控件界面向?qū)?,可以方便我們定義控件的屬性、方法和事件。 3 水晶報表控件 水晶報表(Crystal Reports)是一種報表系統(tǒng)常用的解決方案,能方便的與多種數(shù)據(jù)源建立連接,有著豐富的實現(xiàn)復(fù)雜報表格式和結(jié)構(gòu)、網(wǎng)絡(luò)輸出和打印輸出等功能。水晶報表主要有以下幾個重要組成部分組成: 報表引擎、報表設(shè)計器、報表查看控件、. rpt報表文件和數(shù)據(jù)源。 我們通過報表設(shè)計器來設(shè)計報表模板,如設(shè)計標(biāo)題,插入數(shù)據(jù)、公式、圖表、子報表等,并設(shè)置數(shù)據(jù)源,從而生成.rpt報表文件,在其他編程語言如VB中,可以通過報表引擎對報表數(shù)據(jù)進行操作,通過報表查看控件預(yù)覽報表。 數(shù)據(jù)源作為報表非常重要的一個組成部分 。在拉模型中,驅(qū)動程序連接到數(shù)據(jù)庫并根據(jù)需要將數(shù)據(jù)“拉”進來。使用這種模型,與數(shù)據(jù)庫的連接和為了獲取數(shù)據(jù)而執(zhí)行的SQL 命令都同時由Crystal 報表本身處理,不需要開發(fā)人員編寫代碼。與拉模型相反,推模型需要開發(fā)人員編寫代碼以連接到數(shù)據(jù)庫,執(zhí)行SQL 命令以創(chuàng)建與報表中的字段匹配的記錄集或數(shù)據(jù)集,并且將該對象傳遞給報表文件。該方法使您可以將連接共享置入應(yīng)用程序中,并在Crystal 報表收到數(shù)據(jù)之前先將數(shù)據(jù)篩選出來。 在組態(tài)軟件中直接引用水晶報表控件,存在著一些不足:報表是在數(shù)據(jù)庫的基礎(chǔ)上生成得,所以肯定有生成報表所要顯示得數(shù)據(jù)集,或者把報表要顯示的數(shù)據(jù)存儲到一個報表引用的臨時表。這個功能是需要和用戶進行交互的,要通過寫代碼來實現(xiàn),而組態(tài)軟件的編程功能是相當(dāng)薄弱的,所以我們采取基于水晶報表來制作通用報表控件。 4 VB開發(fā)通用報表控件 4.1 報表控件設(shè)計的基本思路 作為優(yōu)秀的報表模塊,應(yīng)具備良好的用戶交互性,有著年月日報表、班報表、故障報表等供用戶選擇,并提供了打印、導(dǎo)出等功能。 為了方便滿足用戶的交互性,使用水晶報表的“拉模型”,當(dāng)用戶點擊顯示報表按鈕時,根據(jù)用戶的選擇,報表控件自動生成SQL語句,利用ADO技術(shù),從SQL server數(shù)據(jù)庫中提取出報表數(shù)據(jù),存儲到一個臨時數(shù)據(jù)庫表中,而此臨時表是預(yù)先設(shè)計好的水晶報表模板的數(shù)據(jù)存儲表,所以顯示報表時,驅(qū)動程序連接到數(shù)據(jù)庫的該臨時表并將數(shù)據(jù)“拉”進來,生成報表。 4.2 報表控件屬性和方法 為了實現(xiàn)報表控件的通用性,該控件應(yīng)該具備完整的接口。 4.3 將此報表控件嵌入到組態(tài)軟件 在支持ActiveX控件的組態(tài)軟件或者其他軟件,如IE,WORD等,均可引用此報表控件,下面以INTOUCH9.5為例。 在INTOUCH中引AcitveX控件的主要步驟:WindowMaker---特別---配置---向?qū)?ActiveX安裝,在可用的AcitveX控件中,選擇我們做的通用報表控件-ReportCommon 1.0 INTOUCH使用此ActiveX控件范例如下: #ReportCommon.Db_server="dataserver"; #ReportCommon.Initial_cata="intouch"; #ReportCommon.UserId="sa"; #ReportCommon.PassWord="intouch";以上為設(shè)置數(shù)據(jù)庫 #ReportCommon.RptSource="C:\RptSource\month.rpt";設(shè)置報表模板位置 #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 制作通用報表控件應(yīng)注意的問題 基于水晶報表做通用報表控件,可以大大簡化底層報表的具體設(shè)計工作,提高效率。在基于水晶報表設(shè)計通用報表控件時應(yīng)該注意以下事項: ①為了實現(xiàn)報表控件的通用性,要考慮周全控件的屬性和方法,這樣才能成為真正意義上的“通用報表控件”。 ②為了方便編程,我們使用水晶報表的“拉”模型,所以只需在數(shù)據(jù)庫中針對每個報表模板定義一個表,只是在生成報表時使用此表。當(dāng)用戶要求生成報表時,首先清空此表,通過SQL語句按照用戶的選擇從歷史數(shù)據(jù)庫中提取數(shù)據(jù),寫入該表,然后再顯示報表。 ③在使用分布式數(shù)據(jù)庫服務(wù)器,應(yīng)該注意在把數(shù)據(jù)寫入臨時表后,暫停一定時間,再顯示報表,因為SQL語句的查詢、寫入和計算機之間的數(shù)據(jù)傳送需要一定時間,所以在設(shè)計時,寫入臨時表數(shù)據(jù)后,暫停幾毫秒,再顯示報表,代碼如下: ''暫停0.05秒 Dim PauseTime, Start PauseTime = 0.05 '' 設(shè)置暫停時間。 Start = Timer '' 設(shè)置開始暫停的時刻。 Do While Timer < Start + PauseTime DoEvents '' 將控制讓給其他程序。 Loop ④在Windows XP操作系統(tǒng)下,使用水晶報表控件,顯示報表后,系統(tǒng)會在某個盤符的根目錄下,或者應(yīng)用程序所在的目錄下生成一些臨時文件,而報表關(guān)閉時,這些臨時文件不會自動刪除,所以我們需要在顯示完報表后,刪除這些臨時文件,代碼如下: On Error Resume Next Kill App.Path + "\*.tmp" Kill "c:\*.tmp" Kill "d:\*.tmp" Kill "e:\*.tmp" 5結(jié)束語 基于ActiveX技術(shù)的通用報表控件,有著較好的移植性和重用性,并可方便的嵌入到組態(tài)軟件中,彌補了組態(tài)軟件的報表功能缺陷,避免了報表的重復(fù)設(shè)計和代碼的重復(fù)編寫。該報表控件成功的在某自來水廠自動化工程的INTOUCH組態(tài)軟件中使用,該組件運行可靠,解決了以往組態(tài)軟件缺少報表模塊的難題。 |