報表作為信息組織和分析的有效手段和重要呈現(xiàn)形式,是企業(yè)管理信息系統(tǒng)的重要組成部分。如何方便、快捷、準確地生成各種統(tǒng)計報表,是一個值得研究的課題。本文通過對.Net平臺下的報表應用進行研究,讓讀者對水晶報表的應用有個全面認識,并能夠進行水晶報表的設(shè)計與開發(fā)。
.Net;水晶報表
1 引言
報表是一種數(shù)據(jù)管理工具,其目的是在于幫助用戶快速掌握原始數(shù)據(jù)中的基本關(guān)系,以便進行有效的決策。水晶報表(Crystal Reports)是一款主要用于設(shè)計及產(chǎn)生報表的軟件,是一個優(yōu)秀的第三方報表開發(fā)工具,是業(yè)內(nèi)最專業(yè)、功能最強的報表系統(tǒng)。它除了強大的報表功能外,最大的優(yōu)勢是實現(xiàn)了與Visual Studio所有開發(fā)工具的集成。
Visual Studio .Net中的水晶報表是一個實現(xiàn)原理比較復雜但使用方法十分簡單的報表生成工具,它提供了非常豐富的模型,能夠在運行時操作屬性和方法,即可嵌入到C/S結(jié)構(gòu)應用程序中,也可以加入到B/S結(jié)構(gòu)的Web應用程序中。水晶報表可以在設(shè)計器中創(chuàng)建,用戶可以設(shè)計標題、插入數(shù)據(jù)、公式、圖表、子報表等操作。同時水晶報表查看器能夠用于顯示水晶報表的內(nèi)容,包括圖和表。此外,它還具有一些自帶的功能,如翻頁、跳轉(zhuǎn)到某一頁、打印報表、刷新、放大縮小和查找等。因此水晶報表查看器也是一種功能強大的控件。
2 .Net平臺下水晶報表的控制模式
在.Net程序開發(fā)中,經(jīng)常要對合并、匯總等進行編程,水晶報表大大簡化了這些工作,用它能生成漂亮的圖表和格式化文本,而且還能把報表導出為Word、Excel、PDF、HTML等格式。水晶報表程序控制上有兩種模式,即拉(PULL)模式和推(PUSH)模式。選擇的模式不同,程序?qū)崿F(xiàn)上也會有很大差別。
2.1 拉模式(PULL)
拉模式是由水晶報表模板(引擎)直接連接數(shù)據(jù)庫,從數(shù)據(jù)庫里拉取數(shù)據(jù)。通常情況是我們在水晶報表里設(shè)置好數(shù)據(jù)庫信息以及相關(guān)的表,當我們在程序中調(diào)用水晶報表引擎,掛載模板后,水晶報表引擎會根據(jù)模板里的數(shù)據(jù)庫信息,及表信息主動連接數(shù)據(jù)庫,返回數(shù)據(jù)給報表模板,模板根據(jù)設(shè)計樣式進行呈現(xiàn)。
2.2 推模式(PUSH)
推模式是由應用程序從數(shù)據(jù)庫獲取數(shù)據(jù),然后把數(shù)據(jù)推送給水晶報表引擎,水晶報表本身不跟數(shù)據(jù)庫進行交互。使用推模式將會比拉模式要多寫一些代碼。
2.3 拉模式與推模式的比較
由于拉模式是直接連接數(shù)據(jù)庫,和推模式相比,在推送給水晶報表引擎的過程中少了推送給中間結(jié)果集這么一個步驟,而中間結(jié)果集本身就占用系統(tǒng)資源,所以拉模式比推執(zhí)行效率高。
在推模式中,數(shù)據(jù)庫是由應用程序去連接的,水晶報表本身不連接數(shù)據(jù)庫。這樣,系統(tǒng)就能使用公用的數(shù)據(jù)庫連接,也就節(jié)約了數(shù)據(jù)庫的連接消耗。這一點,在多用戶的系統(tǒng)環(huán)境內(nèi),少一次數(shù)據(jù)庫連接對系統(tǒng)和系統(tǒng)性能的影響是比較關(guān)鍵的。
當然我們也應該注意到,推模式因為存在一個中間結(jié)果集,所以會占用系統(tǒng)資源,也正是因為這個中間結(jié)果集的存在,使得從數(shù)據(jù)庫獲取數(shù)據(jù)后,能夠?qū)?shù)據(jù)進行再加工,從而使水晶報表更加靈活多變。所以在具體實現(xiàn)的時候,要綜合考慮實際情況來決定采用哪種模式實現(xiàn)。
3 .Net平臺下水晶報表的實現(xiàn)
.Net平臺下水晶報表開發(fā)最重要的步驟是數(shù)據(jù)的獲取。在拉模式中,數(shù)據(jù)獲取這一步驟是由.Net內(nèi)置的水晶報表引擎自動處理,不需要編寫任何代碼,因此這里主要討論推模式的實現(xiàn)。實現(xiàn)過程主要涉及以下兩個文件:數(shù)據(jù)集(.xsd文件)、水晶報表(.rpt文件)。
3.1 實現(xiàn)步驟
(1)建立解決方案,在其管理器中添加數(shù)據(jù)集,在解決方案中生成.xsd格式的文件。具體過程為:添加→添加新項→類別→數(shù)據(jù)→模板→數(shù)據(jù)集。
(2)在服務(wù)器資源管理器中,添加數(shù)據(jù)連接,選擇所要連接的數(shù)據(jù)庫,將數(shù)據(jù)表拖到之前建立好的數(shù)據(jù)集上,保存整個項目。
(3)在解決方案資源管理器中,添加“Crystal Report”模板,通過“報表專家”完成報表設(shè)計。具體過程為:報表專家→數(shù)據(jù)庫專家→項目數(shù)據(jù)→ADO.NET數(shù)據(jù)集→選擇所需數(shù)據(jù)集對象→插入數(shù)據(jù)表。
3.2 關(guān)鍵功能代碼
(1)在項目的數(shù)據(jù)訪問層編寫獲取數(shù)據(jù)表字段的方法GetFields,該方法返回的為數(shù)據(jù)集。
Public static DataTable GetFields()
{
Database db= DatabaseFactory.CreateDatabase fftConnectionString");
String strSql= "select 列名集合 from 表名 WHERE 條件";
DataTable dtc=db.ExecuteDataSet(CommandType.Text,strSq1).Tables[0];
return dtc;//通過命令方式生成數(shù)據(jù)表
}
(2)添加Web頁面Page_Load事件處理程序。首先,實例化一個DataTable對象dtl,調(diào)用GetFields方法,將返回的數(shù)據(jù)集賦給dt1,然后將dt1綁定到相關(guān)顯示及格式化控件上。其次,實例化一個DataSet對象ds2,創(chuàng)建新命名的DataTable,比如,MyDataTable,并為其添加新列,比如,MyCol1、MyCol2,后將ds2用Session保存。
using CrystalDecisions.Shared;//必須引入水晶報表的類庫
using CrystalDecisions.CrystalReports.Engine;
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));//制定報表路徑及文件
if (1sPostBack==false)//Form_Load()事件的部分代碼
{
DataTable dtl=new DataTable();
DropDownList1.DataSource= dt1;//將數(shù)據(jù)表中的數(shù)據(jù)加載到顯示或格式化數(shù)據(jù)空間,本例為DropDownList1.
DropDownList1.DataTextField="COLUMN_NAME";
DropDownList1.DataBind();
DataSet ds2=new DataSet();//生成數(shù)據(jù)集,本例為MyTable
ds2.Tables.Add("MyTable");
DataColurrm MyCol=new DataColumn();//生成數(shù)據(jù)列類,并添加新列
MyCol.ColumnName="MyCol1" ;
MyCol.DataType=System.Type.GetType ("System.String");
ds2.Tables["MyTable"].Columns.Add(MyCol);
MyCol=new DataColumn();
MyCol.ColumnName="MyCol2";
MyCol.DataType=System.Type.GetType("System.String");
ds2.Tables["MyTable"].Columns.Add(MyCol);
Session["dsTemp"]=ds2;//將數(shù)據(jù)集以變量形式保存為會話
}
(3)報表文件的綁定
DataTable MyTable=new DataTable();
MyCrysta1.SetDataSource(MyTable);//設(shè)置報表文件MyCrysta1的數(shù)據(jù)表來源
CrystalReportViewer1.ReportSource= MyCrysta1;//設(shè)置報表控件的報表文件來源
CrystalReportViewer1.Visible=true;//報表顯示
4 利用向?qū)е谱鲌蟊?/p>
除了使用程序方式開發(fā)報表外,還可利用報表向?qū)лp松地完成一個報表。首先新建一個WebSite,添加報表,向?qū)崾緞?chuàng)建一個數(shù)據(jù)源并打開數(shù)據(jù)庫工具,根據(jù)提示,很容易就能生成一個數(shù)據(jù)源,作為報表的數(shù)據(jù)來源。在報表設(shè)計器中,可以根據(jù)需要畫出想要的報表,并從“數(shù)據(jù)源”中選擇想要的數(shù)據(jù)。這樣,就完成了一個報表,接下來就可以使用ReportViewer控件來顯示這個報表了。新建一個WebForm,從工具箱中拖一個ReportViewer控件到頁面上,它會提示你選擇報表,我們就選擇剛才設(shè)計的報表,運行程序就能看到想要的東西了。
5 結(jié)束語
在ASP.NET環(huán)境下采用水晶報表開發(fā)Web動態(tài)報表,利用水晶報表本身提供的報表設(shè)計器和.Net提供的豐富特性,通過推模型從數(shù)據(jù)庫中讀取滿足查詢條件的數(shù)據(jù),從而靈活地產(chǎn)生報表輸出。這種設(shè)計方法在系統(tǒng)開發(fā)中可以作為一種通用的查詢方法,因此能夠減少系統(tǒng)的開發(fā)和維護的工作量,極大地提高系統(tǒng)的開發(fā)效率。同時,可以減少系統(tǒng)的復雜度,增加報表系統(tǒng)開發(fā)的可復用度,是一種比較實用的報表系統(tǒng)解決方案。
參考文獻
[1]張榮圣,侯鵬志,郭圣路.Crystal Reports 2008.水晶報表從入門到精通.北京:電子工業(yè)出版社,2010.
[2]劉彥博,等.Visual Studio技術(shù)大全.成都:人民郵電出版社,2009.