隗燕琳 陳敬超 陳進(jìn)明 李貴乙 張華峰
摘 要:根據(jù)Visual Basic便捷的界面開發(fā)能力及CrystalReport強(qiáng)大的數(shù)據(jù)庫報表設(shè)計能力,研究探討了兩者相結(jié)合的集成編程方法,并分析了各種集成方法中數(shù)據(jù)格式,數(shù)據(jù)交互機(jī)制及具體應(yīng)用實例。采用兩者混合編程對數(shù)據(jù)庫軟件的開發(fā),提高開發(fā)質(zhì)量和效率具有重要意義。
關(guān)鍵詞:混合編程;Visual Basic;CrystalReport;數(shù)據(jù)報表
中圖分類號:TP312 文獻(xiàn)標(biāo)識碼:A
Abstract:In term of the respective advantages of Crystal Report and Visual Basic software,researches are done in this paper on programming with Crystal Report and Visual Basic software together.This paper shows different methods in programming with the two kinds of software and also gives simple illustrations about different methods.It has great importance to help programmers with high quality and efficiency.
Keywords:admixture programming;visual basic;crystal report;data report
1 引言(Introduction)
數(shù)據(jù)庫軟件的編寫,要求軟件開發(fā)者不僅具有較高的數(shù)據(jù)庫報表和查詢功能的設(shè)計能力,而且要具有較高的軟件操作界面的設(shè)計能力。使用任何流行的Windows開發(fā)工具開發(fā)自定義應(yīng)用程序時,若用自己的方法通過逐條訪問數(shù)據(jù)庫記錄來開發(fā)報表功能,那些復(fù)雜的數(shù)據(jù)格式、字體管理、圖形顯示,以及其他和Windows相關(guān)的顯示問題將變得非常重要,這是一個編程挑戰(zhàn)。而報表開發(fā)軟件又不具有實用的界面開發(fā)功能。這就要求開發(fā)者需將各具特點的軟件集成,進(jìn)行混合編程,才能研發(fā)出靈活、高效、實用的數(shù)據(jù)庫軟件系統(tǒng)。
Visual Basic是一種功能強(qiáng)大的編程語言,Windows下的大多數(shù)應(yīng)用程序的開發(fā),它都可以勝任,而且Visual Basic具有易學(xué)易用,編程簡單,程序集成化程度高及界面可視化能力強(qiáng)的特點[1]。但是,Visual Basic中Data Report Designer的報表設(shè)計功能十分不靈活,需要建立一個包含所需查詢數(shù)據(jù)的臨時數(shù)據(jù)表[2],這極大增加了程序開發(fā)的工作量及程序的執(zhí)行時間。此外選擇使用VB中綁定的Crystal Reports版本,在使用上會受到很多限制[3]。
Crystal Reports中的RDC提供了很好的功能以及簡單的使用方法,使用其面向?qū)ο蟮慕涌?,可以輕松地完成許多復(fù)雜的報表定制工作,而不需要使用那些繁瑣的Windows API。RDC同時也提供了嵌入VB的報表設(shè)計功能。雖然在簡單的應(yīng)用中,你會發(fā)現(xiàn)ActiveX控件是集成報表的好方法,但這種設(shè)計方法不利于功能的更新,因為很多功能在Crystal Reports 6.0以后就不更新了。
顯然,如果將Crystal Reports強(qiáng)大的報表設(shè)計功能和VB在界面設(shè)計方面的優(yōu)勢結(jié)合起來,采用程序集成的方式,將提高程序的設(shè)計效率,縮短設(shè)計周期。本文著重分析兩者集成開發(fā)數(shù)據(jù)庫軟件的方法。
2 RDC集成編程技術(shù)(RDC integrated programming technology)
Crystal Report的Report Designer Component(RDC)可以使報表設(shè)計和靈活的報表集成都在VB的集成開發(fā)環(huán)境中實現(xiàn)。
一般使用水晶報表進(jìn)行報表開發(fā)時,都要先連接數(shù)據(jù)庫。下面以“僅字段定義”“ODBC(RDO)”“Access/Excel(DAO)”這三種常用數(shù)據(jù)源為例,闡述RDC集成編程技術(shù)。軟件集成環(huán)境為VB6.0、CrystalReport9。
2.1 采用“僅字段定義”作為數(shù)據(jù)來源編程
如果從事下層數(shù)據(jù)庫軟件開發(fā),一般是不允許水晶報表直接訪問數(shù)據(jù)庫的,而是通過開發(fā)的軟件返回數(shù)據(jù)給水晶報表。此時可使用水晶報表中的“僅字段定義”作為數(shù)據(jù)來源,來徹底擺脫與數(shù)據(jù)庫的直接聯(lián)系,從而開發(fā)出便于發(fā)布、移植以及擺脫數(shù)據(jù)庫限制的報表系統(tǒng)[4]。
第一步:在CrystalReport9中建立報表模板
在CrystalReport9中新建一個報表(圖1),在“Crystal Reports庫”中根據(jù)需要選擇建文檔的方法。確定后點擊“數(shù)據(jù)庫專家”中“僅字段定義”左邊的加號,創(chuàng)建字段定義文件(圖2)。
水晶報表中的字段定義功能是使用一個單獨的dll實現(xiàn)的,水晶報表默認(rèn)安裝時沒有這個組件,所以可能需要重新補(bǔ)充安裝一下,進(jìn)行定制安裝增加該功能組件。如果之前已經(jīng)創(chuàng)建過字段定義文件,可以瀏覽選取,否則就使用“創(chuàng)建文件”來創(chuàng)建新的字段文件。
添加字段時,字段名不能使用漢字,否則制作報表時將出現(xiàn)亂碼(如圖4)。字段設(shè)置完畢,點擊右上角的叉,將這個文件保存,形成字段定義文件“DataFile.ttx”。
保存完畢后,在圖3窗體上點擊“完成”然后將做好的報表模板添加到右側(cè)“選定的表”中(圖5)。點擊“確定”后,就可以設(shè)計報表模板了。此時可根據(jù)需要將字段名修改成漢字,并可添加參數(shù)字段(圖6)。
保存后形成報表模板文件“DataFile.rpt”,該文件及字段定義文件“DataFile.ttx”文件將在VB程序中加載。
第二步:在VB中加入CrystalReport9的相關(guān)文件
在VB“工程”菜單中點擊“部件”,在“控件”選項頁中勾選“Crystal Report Viewer Control 9”,將“CRViewer9”報表預(yù)覽控件布置在窗體上。
在VB“工程”菜單中點擊“引用”,勾選“Microsoft ActionX Data Objects 2.5 Library”和“Crystal Reports 9 ActiveX Designer Run Time Library”兩項庫文件。
第三步:在VB中集成CrystalReport9
首先在窗體中添加如下代碼,以聲明水晶報表應(yīng)用程序Application對象及報表Report對象:
Private objCRAppAs New CRAXDRT.Application
Private objCRReportAs New CRAXDRT.Report
然后聲明記錄集變量及報表相關(guān)變量。
Dim rstAs New ADODB.Recordset
Dim props As CRAXDRT.ConnectionProperties'報表數(shù)據(jù)源參數(shù)集
Dim prop As CRAXDRT.ConnectionProperty'報表數(shù)據(jù)源參數(shù)
構(gòu)建一個數(shù)據(jù)集,定義其中的字段類型,然后添加數(shù)據(jù)信息,實例程序如下:
rst.CursorLocation=adUseClient
With rst.Fields
.Append "XingMing",adVarChar,20
.Append "ZhiWu",adVarChar,20
.Append "ZhiCheng",adVarChar,20
.Append "GongZi",adVarChar,20
End With
rst.Open
With rst
For i=0 To 4
.AddNew
.Fields(0)=”王”&i
.Fields(2)=”職務(wù)”&i
.Fields(0)=”職稱”&i
.Fields(0)=(1000*(5-i))
.Update
Next
End With
該操作可以替換成任意的過程,最終目的就是處理成一個記錄集,作為報表的數(shù)據(jù)來源。
現(xiàn)在添加報表模板,加載報表字段定義文件,并執(zhí)行Report對象的DiscardSavedData方法清除其保持的數(shù)據(jù),將屬性值變成設(shè)計時的值。
Set objCRReport=objCRApp.OpenReport(App.Path&"\DataFile.rpt",1)
Set props=objCRReport.Database.Tables(1).ConnectionProperties
For Each prop In props
If InStr(prop.Name,"Field Definition File")>0 Then
prop.Value=App.Path&"\DataFile.ttx"
Exit For
End If
Next
Set props=Nothing
objCRReport.DiscardSavedData
我們在報表模板“DataFile.rpt”中增加了兩個參數(shù),下面要對Report對象的參數(shù)進(jìn)行設(shè)置。為了讓程序運行時不出現(xiàn)參數(shù)提示框,需添加代碼:
objCRReport.EnableParameterPrompting=False
然后清理參數(shù)可能存在的參數(shù)默認(rèn)值,再對參數(shù)進(jìn)行賦值,添加如下代碼:objCRReport.ParameterFields(1).ClearCurrentValueAndRange
objCRReport.ParameterFields(2).ClearCurrentValueAndRange
Call objCRReport.ParameterFields(1).AddCurrentValue
("報表測試")
Call objCRReport.ParameterFields(2).AddCurrentValue
("2014-12-10")
如果此處出現(xiàn)錯誤提示,那么就要查看傳入的參數(shù)是否有值,參數(shù)的類型是否匹配,是否要進(jìn)行類型轉(zhuǎn)換后才能傳入,傳入?yún)?shù)的值的序號是否對應(yīng)。
最關(guān)鍵的一步是將新建的數(shù)據(jù)集rst賦值給報表的Repor對象。
objCRReport.Database.SetDataSourcerst
然后進(jìn)行報表顯示外觀設(shè)置。報表外觀相關(guān)屬性如下:
是否顯示右上角水晶報表的圖標(biāo):CRViewer1.EnableAnimationCtrl
是否顯示導(dǎo)出報表按鈕:CRViewer1.EnableExportButton
是否顯示關(guān)閉按鈕:CRViewer1.EnableCloseButton
是否顯示左側(cè)樹列表:CRViewer1.EnableGroupTree
是否顯示導(dǎo)航:CRViewer1.EnableNavigationControls
是否顯示彈出菜單:CRViewer1.EnablePopupMenu
是否顯示打印按鈕:CRViewer1.EnablePrintButton
是否顯示刷新按鈕:CRViewer1.EnableRefreshButton
是否顯示工具欄:CRViewer1.EnableToolbar
是否顯示比例調(diào)整窗口:CRViewer1.EnableZoomControl
報表顯示的樣式:CRViewer1.DisplayBackgroundEdge
報表控件是否有邊框:CRViewer1.DisplayBorder
是否顯示報表的選項卡:CRViewer1.DisplayTabs
最后指定報表來源,進(jìn)行報表顯示設(shè)置,并釋放數(shù)據(jù)集變量。
CRViewer91.ReportSource=objCRReport
CRViewer91.ViewReport
Set rst=Nothing
此外,還可使用“工程”菜單中的“添加CrystalReports9”選項,這時會自動添加一個包含“Crystal Report”查看器控件的窗體,并在窗體中自動添加相關(guān)代碼。該方法的程序設(shè)計不需要使用報表數(shù)據(jù)源參數(shù),且不用添加報表模板文件,但需將上述程序中的CRAXDRT.Report類型變量用CrystalReport1類型變量替換即可。
2.2 采用“ODBC(RDO)”作為數(shù)據(jù)來源編程
ODBC(Open DataBase Connectivity)是微軟公司定制的標(biāo)準(zhǔn)編程接口,只要有相應(yīng)的ODBC驅(qū)動程序,就可以通過ODBC連接操作各種不同的數(shù)據(jù)庫。通常通過控制面板的管理工具中的ODBC Data Source來配置ODBC的數(shù)據(jù)源。所謂ODBC數(shù)據(jù)源就是命名的一組信息,包括需要連接的數(shù)據(jù)庫所在位置(可以是磁盤目錄/文件,也可以是網(wǎng)絡(luò)服務(wù)器)、對應(yīng)的ODBC驅(qū)動程序以及訪問數(shù)據(jù)庫所需要的其他相關(guān)信息,用戶可以通過數(shù)據(jù)源的名稱(DSNs,Data Source Names)來指定所需的ODBC連接。
設(shè)置好ODBC數(shù)據(jù)源后,在“數(shù)據(jù)庫專家”中點擊“創(chuàng)建新連接”中的“ODBC(RDO)”連接所設(shè)置的ODBC數(shù)據(jù)源,將所需數(shù)據(jù)表加入到“選定的表”中,然后在“數(shù)據(jù)庫字段”中選擇所需的字段,拖放到報表中設(shè)計所需的樣式。該過程可在CrystalReport9中建立報表模板形成外部的.rpt文件,或使用Project菜單中的Add CrystalReports 9選項這兩種RDC方式實現(xiàn)。需添加的程序代碼與2.1中相似,此時不需要建立臨時數(shù)據(jù)集,只需利用水晶報表的數(shù)據(jù)選擇語句選擇ODBC數(shù)據(jù)源中的數(shù)據(jù)進(jìn)行報表設(shè)計。
ODBC數(shù)據(jù)源可與其他用戶網(wǎng)絡(luò)共享,添加數(shù)據(jù)選擇代碼時不用打開數(shù)據(jù)集,只需選擇數(shù)據(jù)傳遞給報表即可。此外數(shù)據(jù)源的存放地址可以隨意更改,更改后要重新設(shè)置ODBC數(shù)據(jù)源。
2.3 采用“Access/Excel(DAO)”作為數(shù)據(jù)來源編程
將Access/Excel作為數(shù)據(jù)來源時,同樣是在“數(shù)據(jù)庫專家”中點擊“創(chuàng)建新連接”,然后連接Access/Excel(DAO)數(shù)據(jù)源。設(shè)計報表的方式與2.2相同,均可在CrystalReport9中建立報表模板形成外部的.rpt文件,或使用Project菜單中的Add CrystalReports 9選項這兩種RDC方式實現(xiàn)。添加的程序代碼與2.2中相似。
Access/Excel數(shù)據(jù)源在連接時非常直接便捷,數(shù)據(jù)源存放地址可以更改,更改后要進(jìn)行數(shù)據(jù)源位置更新設(shè)置。
3 結(jié)論(Conclusion)
本文詳細(xì)介紹了VB6.0和CrystalReport9兩種語言的混合編程方法,以簡單的應(yīng)用實例講解了三種常用數(shù)據(jù)源的RDC方法,并給出了程序源代碼?!皟H字段定義”的數(shù)據(jù)源類型能開發(fā)出便于發(fā)布、移植以及擺脫數(shù)據(jù)庫限制的報表系統(tǒng),ODBC數(shù)據(jù)源可與其他用戶網(wǎng)絡(luò)共享,而Access/Excel數(shù)據(jù)源在連接時非常直接便捷。CrystalReport和VB結(jié)合,可以充分利用CrystalReport強(qiáng)大的報表設(shè)計功能和VB在圖形化界面設(shè)計方面的優(yōu)勢,大大提高程序的設(shè)計效率,縮短設(shè)計周期。
參考文獻(xiàn)(References)
[1] 金英姿,鄧少鹍.Visual Basic實用培訓(xùn)教程[M].北京:人民郵電出版社,2003.
[2] 劉玉山,劉寶山.VB數(shù)據(jù)庫項目設(shè)計模塊化教程[M].北京:機(jī)械工業(yè)出版社,2009.
[3] George Peck.水晶報表設(shè)計與開發(fā)大全Crystal Reports 9[M].北京:清華大學(xué)出版社,2004.
[4] 阿泰.創(chuàng)建不受數(shù)據(jù)庫限制的報表[DB].http://blog.csdn.net/babyt,2004/2015.
作者簡介:
隗燕琳(1977-),女,博士,工程師.研究領(lǐng)域:電氣工程.
陳敬超(1979-),男,碩士,工程師.研究領(lǐng)域:電氣工程.
陳進(jìn)明(1965-),男,本科,高級工程師.研究領(lǐng)域:電氣工程.
李貴乙(1982-),男,本科,高級工程師.研究領(lǐng)域:電氣工程.
張華峰(1981-),男,本科,高級工程師.研究領(lǐng)域:儀器計量.