水晶报表的使用经验和资料总结
?
一.???????????? 前言
該文檔就集團分析系統研發過程中水晶報表(Crystal Reports)的使用經驗和值得注意的地方進行了總結和歸納,它不是水晶報表的使用手冊,如果您要了解水晶報表使用的細節,那么您可以閱讀《水晶報表中文手冊》,或者使用水晶報表本身自帶的聯機幫助。本文乃經驗之談,錯誤之處在所難免,請不吝斧正。
二.???????????? 簡介
Crystal Reports是世界領先的桌面及 Web 報表工具,可用于處理數據庫,幫助用戶分析和解釋重要信息。使用 Crystal Reports 可以方便地創建簡單報表,同時它也提供了創建復雜或專用的報表所需的整套工具。
Crystal Reports 幾乎可以從任何數據源生成您需要的報表。內置報表專家在您生成報表和完成一般的報表任務過程中,會一步一步地指導您進行操作。報表專家通過公式、交叉表、子報表和設置條件格式幫助表現數據的實際意義,揭示可能被隱藏掉的重要關系。如果文字和數字確實不夠充分,則用地理地圖和圖形進行形象的信息交流。
Crystal Reports 的靈活性并未停留在創建報表這一功能上,您可以用各種各樣的格式發布報表,包括用 Microsoft 的 Word 和 Excel 發布、通過電子郵件甚至 Web 發布。高級的 Web 報表功能允許工作組中的其他成員在他們自己的 Web 瀏覽器中查看或更新共享報表。
通過將 Crystal Reports 的報表處理功能整合到自己的數據庫應用程序中,應用程序和 Web 開發人員可以節省開發時間并滿足用戶的需求。Crystal Reports 支持大多數流行的開發語言,可以方便地在任何應用程序中添加報表。鑒于實際項目經驗本文中僅結合C#語言進行歸納總結。
三.???????????? 安裝
Crystal Reports 已經集成在Visual Studio.NET 2003中,因此它的安裝非常簡單方便,您只需要在安裝Visual Studio.NET時勾選相應的選項即可,但必須提醒您,您必須注冊,否則使用三十次以后Crystal Reports 將不能繼續使用。目前網上可以搜索出大量注冊碼,但請您慎重使用。另外值得一提的是按照上面這種方式安裝后,Crystal Reports的開發(程序代碼部分)和設計(報表格式設計部分)都只能在Visual Studio.NET工具下進行。
其實Crystal Reports 也可以作為獨立的模塊進行安裝,公司內部有人制作了相應版本的ISO安裝文件《Crystal Reports 9.iso》,您可以使用FTP工具登陸192.168.2.7(user:fox123,password:fox123)在 /SoftRoot/C#/目錄下便可找到,同時該目錄下還有Visual Studio.NET2003的安裝程序。在您得到該文件后便可以安裝,需要提醒您由于Crystal Reports 目前已經發布了眾多版本,集團分析系統研發人員在研發過程中發現Crystal Reports不同版本之間的兼容性并不是很好,如果安裝過程中出錯會給以后的使用造成巨大的麻煩,請務必注意。因此,在您安裝之前請先確認您即將安裝Crystal Reports的這臺電腦上是否安裝過其它版本的Crystal Reports工具,當然這也包括Visual Studio.NET中自帶的Crystal Reports,如果有那么請您最好先將其刪除,以除后患。這里的安裝同樣非常簡單,您只需要雙擊安裝文件,注意默認的典型安裝中有些數據庫驅動程序并沒有安裝,這其中就包括公司里一直使用的SYBASE數據庫,因此您需要選擇自定義安裝,進行相應的選擇。安裝結束時請注冊,注冊碼在安裝程序文件夾下保存,可任選其一進行注冊。注冊后您可以使用Crystal Reports設計工具進行報表的設計,也可以使用Visual Studio.NET進行代碼的設計兩者可以分開獨立進行。
四.???????????? 報表設計
用Crystal Reports 設計報表是件非常簡單的事情,當然設計一張結構負責、外觀清新爽朗的報表也是需要下一番功夫的。Crystal Reports 帶有一個報表設計向導,該向導會指導您一步一步的完成從選擇報表類型、定義數據源到選擇報表呈現模版的全部過程。當然您也可以避開這些繁瑣的環節直接創建空白報表進行自行設計。接下來我就報表設計過程中比較重要的環節以及一些比較特殊實用的技巧進行簡單介紹。
u??? 數據源
Crystal Reports 的主要用途就是訪問存儲在數據庫中的數據并生成有關該數據的報表。Crystal Reports 可以訪問的數據分為五大類:
?????? 直接訪問數據庫文件:(dBASE、FoxPro、Clipper、Pervasive、Paradox、Microsoft Access)
Crystal Reports 可以直接訪問絕大多數常用的 PC 數據庫格式的文件。換句話說,程序具備直接打開 dBASE、FoxPro、Clipper、Pervasive、Paradox、Microsoft Access 及其他此類軟件中設計的數據庫文件和表所需的內置功能。安裝 Crystal Reports 后即具備此功能。一旦將程序安裝在系統中,就可以立即開始選擇適當的文件以創建基于這些數據庫之上的報表。這是一種連接速度最快的方式,但是如果直接通過 Crystal Reports 訪問某個數據庫,則報表只能使用這一種數據庫類型。不創建新的報表,就無法切換到不同類型的數據庫或表。
?????? ODBC 數據源:(Access,Excel,Infoxmix,OLE Db,Visual Foxpro,)
現在大多數常用的數據庫管理系統都提供 ODBC 驅動程序,而且日益增多,因此 Crystal Reports 可以使用您擁有的任何數據類型。因為 ODBC 內置了很大的靈活性,所以可以在同一報表文件中使用不同的 ODBC 數據源。例如,可以使用 Oracle 數據源設計報表,以后當公司轉換到 Microsoft SQL Server 時,則只需更改報表使用的 ODBC 數據源。通過 ODBC 將數據從數據庫傳遞到應用程序涉及到很多層,因此出錯幾率變大,另外在能使用 ODBC 數據源之前,必須正確配置 ODBC 數據源并在 Odbc.ini 和 Odbcinst.ini 文件中設置它們。如果在一個系統上創建報表,而在另一個沒有安裝同一 ODBC 數據源的系統上打開此報表,則 Crystal Reports 無法連接到那些數據。
?????? OLE DB
OLE DB 是 Microsoft 開發的、在概念上類似于 ODBC 的數據庫連接實體。OLE DB 是一種連接方法論,而不是一種數據庫。與 ODBC 一樣,它通過提供一個接口層,使得在其它數據庫管理系統中創建的數據易于交換。OLE DB 要求使用 OLE DB 提供程序,此程序是相當于 ODBC 驅動程序的 OLE DB 程序 。 Crystal Reports 為 OLE DB 使用者提供 P2soledb.dll 文件,使得 OLE DB 可以與 OLE DB 提供程序通訊。
?????? Crystal SQL Designer 文件:(Crystal SQL Designer)
Crystal SQL Designer 是一個查詢,它只是對數據庫中一組特定數據的請求。數據被收集后,即存儲為 Crystal SQL Designer 文件 (.QRY)。之后,可以象使用數據庫表一樣使用 Crystal SQL Designer 文件。從 SQL 數據庫中收集的數據成為新的數據集,可以添加到報表中。但非常遺憾的告訴您,上面的安裝文件安裝后Crystal SQL Designer并沒有被安裝,所以此處點到為止。
?????? 字典
字典是結構化和簡化的數據視圖,可以為組織中使用 Crystal Reports 的某些人或所有人創建字典. 與某些強制用戶通過數據分發元層訪問數據的系統不同,字典是可選組件。用戶仍然可以直接訪問數據。字典只是提供完全的便利,沒有任何限制。同樣非常遺憾的告訴您,上面的安裝文件安裝后Crystal SQL Designer并沒有被安裝,所以此處點到為止。
?
在介紹完Crystal Reports 可以訪問的五大類數據后,請允許我著重介紹一下SYBASE。在介紹Crystal Reports時,我曾經提過安裝Crystal Reports時SYBASE的數據庫驅動程序是需要手選的這個請大家注意,另外就是安裝Crystal Reports這臺電腦需要安裝SYBASE客戶端程序,同時設置正確的數據庫連接。接下來我們就可以在Crystal Reports的數據庫專家的創建新連接里找到SYBASE服務器這一項了,點擊它后便可以進行水晶報表與指定的SYBASE數據庫的連接設置了,輸入正確的服務器名登陸名密碼以及要訪問的數據庫,那么數據源便定義完畢。
接下來還要介紹一個很重的技巧—修改數據源。在一些特殊的情況下,比如我們定義好了報表的數據源,它是A服務器上的一個存儲過程,但情況有變我們需要把數據源更改為另一個過程(此處僅借此情況為例,意指數據源的更改),但糟糕的是此時整個報表的所有字段的格式字體等都已經設置好,如果此刻要更改數據源怎么辦?先說明一下想通過數據庫專家重新選擇新數據源是行不通的,您可以嘗試.最糟糕的辦法是重新做一張報表。其實Crystal Reports設置了一個這樣的功能來完成這個任務,您可以點擊菜單下的數據庫->設置數據源位置來完成這個工作,非常簡單方便,操作方法是先選中需要更新的舊的數據源描述然后選擇新的數據源然后點更新即可,這個功能對不知道該操作的人來說是非常重要的,您不妨一試。
u??? 報表類型
我們在設計報表時,最好使用Crystal Reports的報表向導,它會按照不同類型的報表給以不同的指導,幫助您正確得設計出您想要的報表雛形,此處就不詳細講解報表的具體設計過程,下面僅針對于不同類別報表設計時的一些技巧予以提示共享.
?????? 交叉表
Crystal Reports把每個交叉表看作一個交叉表對象,所謂的交叉表對象很簡單,它是由幾部分組成的,包括:行,列,匯總字段,行總計,列總結以及總計.交叉表可以有多個行,多個列以及多個匯總字段, 如果需要您也可以在一個報表中插入多個“交叉表”對象,但“交叉表”對象必須插入報表頁眉或報表頁腳或者插入組頁眉或組頁腳中, 當然您可以將“交叉表”對象放在子報表中。當要引用來自其他報表中的結果時,這一點很有用.另外當交叉表的匯總字段有多個時,而且不同的匯總字段要按照不同的方法進行匯總,這時候交叉表對象的行總計和列總計以及總計就失去了作用,那么怎么辦呢?我們可以直接在數據庫中算好把他們呈現出來,而這里需要把交叉表本身的總計都隱藏掉,方法很簡單右擊交叉表對象選擇交叉表專家,選擇自定義樣式標簽,勾選抑制顯示行總計,抑制顯示列總計復選框即可,當然在此你也可以進行其它嘗試,比如抑制顯示空行抑制顯示空列等等.其它的設置請參閱聯機指南.
?????? 圖表
Crystal Reports 使您可以在報表中包含復雜的、多彩的圖表。任何時候都可以使用這些圖表來增加報表的可用性. 您可以根據以下內容繪制圖表: 匯總和小計字段, 詳細資料、公式和運行總計字段, 交叉表匯總, OLAP 數據。通常在組級根據匯總和小計信息繪制圖表。但是,根據所用數據類型,您可以為報表創建高級圖表、交叉表圖或 OLAP 網格圖表
?????? 子報表
子報表是報表中的報表。創建子報表的過程與創建常規報表的過程相似。子報表有報表的大多數特性,包括它自己的記錄選擇條件。子報表與主報表之間的唯一區別是子報表多節報表是作為對象插入到主報表中;它不能獨立存在(但可以將子報表另存為主報表),它可以放置在報表的任意一節內,整個子報表將在該節中打印, 它不能包含另一個子報表,也不要包含頁眉或頁腳節.使用子報表的情況很多比如: 將不相關的報表組合到單個報表中, 協調本無法鏈接的數據,在單個報表中顯示相同數據的不同視圖, 從在查閱字段上沒有索引的字段中執行一對多查閱等等,您可以根據自己的實際需要進行設計
?
u??? Crystal Reports之專家
?????? 數據庫專家
“數據庫專家”提供了一個可在 Crystal Reports 中使用的所有數據源的集成樹視圖。使用“數據庫專家”,您可以:
- 使用當前連接的數據源之一創建報表。
- 基于存儲在 Crystal 儲備庫中的 SQL 命令創建報表。
- 基于數據源的自定義“收藏夾”列表(也由您在“數據庫專家”中維護)創建報表。
- 基于最近訪問過的數據源的列表(由“數據庫專家”自動替您維護)創建報表。
- 通過連接到現有數據源(例如,位于本地的數據文件或已經建立的 ODBC 數據源)創建報表。
- 通過先創建新連接(例如,新的 ODBC 數據源或 OLE DB 文件數據鏈接)來創建報表。
- 查看有關某個數據庫連接的信息,方法是右擊該連接的圖標,然后從快捷菜單中選擇“屬性”。
?????? 組專家
使用“組專家”可指定字段在報表中的分組方式。還可以使用該對話框重新定位組,以及編輯用于觸發和對組進行排序的條件。值得一提的是如果需要將組數據保持在同一頁,那么您可以在組專家下進行設置,使用組專家的選項您可以進行很多與分組相關的設置。
?????? 組排序專家
報表必須包含一個匯總值才能執行“組排序”。 使用“組排序專家”可標識最前或最后幾組(例如,客戶報表中客戶最多/最少的省)。還可以標識最高或最低百分比。
?????? 選擇專家
使用選擇專家選擇想包括在報表中的記錄或組(如果不想全部包括在報表中),使用選擇專家時,程序基于您在對話框中指定的設置自動生成記錄或組選定公式,該專家使您得以設置相當復雜的選定條件,但若要對所生成的公式有更多的控制,請使用 “公式編輯器”對話框。
?????? 節專家
使用節專家格式化影響整個報表節的更改。可以插入、刪除以及合并節,當然這些操作也可以通過鼠標直接完成。另外我們可以通過節專家對節屬性進行設置,比如:抑制顯示,延伸到后續節,新建節的位置,保持在一起等等,我們也可以通過設定不同的顏色標示不同的報表節,節專家在報表設計過程中會經常使用到
?????? 圖表專家
圖表專家在下列情況下出現:
- 單擊標準工具欄上的“插入圖表”按鈕時。
- 從“插入”菜單中選擇圖表命令時。
- 右擊圖表并選擇“圖表專家”時。
使用圖表專家你可以進行圖表類型的選擇,常用的條形圖、折線圖、面積圖、餅圖、圓環圖以及甘特圖等等。圖表專家提供了四種布局,分別對應特定的數據集,它們是高級,組,交叉表以及OLAP. 當有多個圖表值或在報表中沒有分組和摘要字段時,請使用“高級”布局. 為了用“分組”布局創建圖表,您必須至少有一個分組和用于該分組的摘要字段使用“交叉表”布局在交叉表對象上繪制圖表。交叉表圖表使用交叉表中的字段作為其條件和摘要字段. 使用 OLAP 布局在 OLAP 網格上繪制圖表。OLAP 圖表使用 OLAP 網格中的字段作為其條件和摘要字段
?????? 交叉表專家
從“插入”菜單中選擇交叉表命令時,或者當選定一個現有交叉表,然后從“格式”或右擊菜單中選擇“交叉表專家”命令時,會出現該專家. “交叉表專家”中有三個選項卡:
- “交叉表”選項卡(交叉表專家)
- “樣式”選項卡(各種專家)
- “自定義樣式”選項卡(交叉表專家)
“交叉表”選項卡包含創建交叉表所需的基本功能。可定義行、列以及匯總字段。也可直接從該選項卡創建組和公式. 使用“樣式”選項卡可以選擇交叉表或 OLAP 網格的預定義樣式. 使用“自定義樣式”選項卡可以用背景色、網格線和單元格邊距格式化交叉表的網格
五.???????????? 程序
u??? 模式
?????? 拉模式(PULL)
在拉模型中,驅動程序將連接到數據庫并根據需要將數據“拉”進來。使用這種模型時,與數據庫的連接和為了獲取數據而執行的 SQL 命令都同時由 Crystal Reports 本身處理,不需要開發人員編寫代碼。如果在運行時無須編寫任何特殊代碼,則使用拉模型。
???????????????????? 圖一:PULL模式
?????? 推模式(PUSH)
推模型需要開發人員編寫代碼以連接到數據庫,執行 SQL 命令以創建與報表中的字段匹配的記錄集或數據集,并且將該對象傳遞給報表。該方法使您可以將連接共享置入應用程序中,并在 Crystal Reports 收到數據之前先將數據篩選出來。在些這種情況下,通過使用連接共享以及限制記錄集合的大小,可以使用報表性能最大化。
???????????????????? 圖二:PUSH模式
u??? 如何開始
Visual Studio.NET提供了兩個控件來實現你對水晶報表的控制,它們是CrystalReportViewer控件和CrystalReportDocument控件.這里只簡單演示如何在Asp.net中使用一個現成的水晶報表文件,其實水晶報表的主要功能
1) 從WebForm工具欄中拖動水晶報表查看器控件(Crystal Report Viewer)至.aspx頁面中。
2) 調出水晶報表查看器控件的屬性窗口
3) 點擊[...]按鈕查看"Data Binding"屬性,并彈出了DataBinding窗口。
4) 從左邊的"Bindable屬性”區中選擇“Report Source”
5) 選中"自定義綁定表達式"單選按鈕,在右邊的底部的窗口中指定.rpt文件的文件名和路徑,例如:"C:\\ProgramFiles\\MicrosoftVisualStudio.NET\\CrystalReports\\Samples\\Reports\\General Business\\World Sales Report.rpt",然后確定
注意:文件"World Sales Report.rpt"文件是在VS.Net安裝時創建的。如果你在安裝過程中指定了其它目錄,此時你最好確認一下路徑的正確性。
6) 在Page_Load方法中調用DataBind方法。(代碼為VB.Net)
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
?? ??? ?DataBind()
End Sub
7) 保存并編譯你的頁面。 現在,你就有一個內嵌水晶報表的WebForm頁面了。
u??? 相關問題匯總
下面詳細討論水晶報表在使用過程中肯定遇到的主要的問題以及解決辦法。
?????? 報表打印
目前較低版本的Crystal Reports 不能實現網頁直接打印,要實現網頁打印我們只能采取其它的方式,目前主要有下面幾種方法:
l???????? 使用客戶端瀏覽器打印
我們在IE瀏覽器下可以找到打印以及打印預覽等所有有關打印的功能,但是這個打印會把網頁上很多沒用的東西一起打印出來,另外我們需要在我們自己編寫的程序里控制這些功能,那么怎么辦呢?我們需要使用一個ACTIVEX控件<OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WB width=0></OBJECT>這個Object 其實就是 IEWebBrowser 設定 Width 和 Height 以后,我們在界面上就看不到控件的形狀了,然后,我們就可以使用這個object 實現我們選紙和預覽的功能了.
?? WB.ExecWB(8,1) //打印設置
?? WB.ExecWB(7,1) //打印預覽
??? ?? WB.ExecWB(6,1) //打印
??? 這里說明一點,要使用這個打印方法,我們必須另外設計一個頁面,該頁面上只有一個CrystalReportViewer控件,該控件用來呈現要打印的報表,而且我們必須通過設置CrystalReportViewer屬性來控制該報表顯示在一頁上以及隱藏工具條等不需要打印的部分,經測試發現如果頁數很多的報表不能使用該方法.
l???????? 使用PDF
??? string Fname = null;//用來暫存水晶報表利用pdf文件進行打印時調用的臨時文件
??? ExportOptions crExportOptions = new ExportOptions();
?????? DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions();
?????? Fname = "c:\\temp_cpt_print";
?????? crDiskFileDestinationOptions.DiskFileName = Fname;
?????? crExportOptions = crReportDocumentHere.ExportOptions;
?????? crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
?????? crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
?????? crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
?????? crReportDocumentHere.Export();
?????? Response.ClearContent();
?????? Response.ClearHeaders();
?????? Response.ContentType = "application/pdf";
?????? Response.WriteFile(Fname);
?????? Response.Flush();
?????? Response.Close();
?????? System.IO.File.Delete(Fname);
l???????? 導出打印
實際上就是將報表導出為某種類型文件然后進行打印,下面會詳細介紹報表導出方法;
?????? 報表導出
水晶報表可以導出為WORD文檔,PDF文檔,EXECL文檔, RichText文件以及相應得html文件,在到處過程中我們主要使用ReportDocument對象的Export()方法,具體代碼請參考如下程序:
DiskFileDestinationOptions crDiskFileDestinationOptions=
new DiskFileDestinationOptions();
ExportOptions crExportOptions = crReportDocumentHere.ExportOptions;
stringExportPath= System.Configuration.ConfigurationSettings.AppSettings["Report_Export_Path"];
if(Directory.Exists(ExportPath)==false){
?System.IO.Directory.CreateDirectory(ExportPath);
}
string sessionFile=ExportPath+Session.SessionID.ToString();
string extractName=string.Empty;
if (ExportFileType.SelectedItem.Text == "RichText文件 (RTF)")
{
??? //Export to RTF.
??? extractName=".rtf";
??? crDiskFileDestinationOptions.DiskFileName =sessionFile+extractName;
??? crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
??? crExportOptions.ExportFormatType = ExportFormatType.RichText;
??? crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
}
else if (ExportFileType.SelectedItem.Text == "PDF文件 (PDF)")
{
//Export to PDF
?
??? extractName=".pdf";
??? crDiskFileDestinationOptions.DiskFileName = sessionFile+extractName;
??? crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
??? crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
??? crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
??? }
??? else if (ExportFileType.SelectedItem.Text == "Word文件 (DOC)")
??? {
??? //Export to Word
??? extractName=".doc";
??? crDiskFileDestinationOptions.DiskFileName =sessionFile+extractName;
??? crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
??? crExportOptions.ExportFormatType = ExportFormatType.WordForWindows;
??? crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
??? }
??? else if (ExportFileType.SelectedItem.Text == "Excel文件 (XLS)")
??? {
??? //Export to Excel
??? extractName=".xls";
??? crDiskFileDestinationOptions.DiskFileName =sessionFile+extractName;
??? crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
??? crExportOptions.ExportFormatType = ExportFormatType.Excel;
??? crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
??? }
crReportDocumentHere.Export();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", @"attachment;filename="+HttpUtility.UrlEncode(crrntQuery.Title+extractName,System.Text.Encoding.UTF8));
Response.WriteFile(sessionFile+extractName);
Response.Flush();
Response.End();
System.IO.File.Delete(sessionFile+extractName);
我們發現使用9系列的水晶報表將報表導出為excel文件時,excel的表格線不能夠自動導出生成,只能通過手工添加去處理,為了解決這個問題我們轉么設計另一張導出報表已方便使用者添加格線,實屬無奈之舉.
?????? 參數傳遞
通過ReportDocument控件我們可以實現講外部參數傳入水晶報表中從而實現報表數據動態顯示,具體實現請參考如下代碼:
private void BuildReportViewerParameters(CrystalDecisions.Web.CrystalReportViewer rptViewer, Hashtable ParamTable)
????????{
????????????//定義報表視圖的參數的方法
????????????ParameterFields ParamFields = new ParameterFields();
????????????foreach (object key in ParamTable.Keys)
????????????{
????????????????ParameterField ParamField = new ParameterField();
????????????????ParameterValues ParamValues = new ParameterValues();
????????????????ParameterDiscreteValue ParamValue = new ParameterDiscreteValue();
????????????????ParamValue.Value = ParamTable[key].ToString();
????????????????ParamValues.Add(ParamValue);
????????????????ParamField.ParameterFieldName = key.ToString();
????????????????ParamField.CurrentValues = ParamValues;
????????????????ParamFields.Add(ParamField);
????????????}
????????????rptViewer.ParameterFieldInfo = ParamFields;
????????}
????????private void BuildReportClassParameters(CrystalDecisions.CrystalReports.Engine.ReportClass rpt, Hashtable ParamTable)
????????{
????????????//定義報表類的參數的方法
????????????foreach (object key in ParamTable.Keys)
????????????{
????????????????ParameterValues ParamValues = new ParameterValues();
????????????????ParameterDiscreteValue ParamValue = new ParameterDiscreteValue();
????????????????ParamValue.Value = ParamTable[key].ToString();
????????????????ParamValues.Add(ParamValue);
????????????????rpt.DataDefinition.ParameterFields[key.ToString()].ApplyCurrentValues(ParamValues);
????????????}
????????}
????????
????????protected void BuildReportParameters(CrystalDecisions.Web.CrystalReportViewer rpt,Hashtable ParamTable)
????????{
????????????//定義報表參數的方法
????????????ParameterFields ParamFields = new ParameterFields();
????????????foreach(object key in ParamTable.Keys)
????????????{
????????????????ParameterField ParamField;
????????????????ParameterValues ParamValues;
????????????????ParameterDiscreteValue ParamValue;
????????????????ParamField = new ParameterField();
????????????????ParamValues = new ParameterValues();
????????????????ParamValue = new ParameterDiscreteValue();
????????????????ParamValue.Value = (string)ParamTable[key];
????????????????ParamValues.Add(ParamValue);
????????????????ParamField.ParameterFieldName=(string)key;
????????????????ParamField.CurrentValues = ParamValues;
????????????????ParamFields.Add(ParamField);
????????????}
????????????rpt.ParameterFieldInfo = ParamFields;
????????}??
總結
以上是生活随笔為你收集整理的水晶报表的使用经验和资料总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web Service和Servlet的
- 下一篇: arm的一些概念(ARM7、Cortex