1、環境安裝html
開發工具使用VS2010+SAP Crystal Reports13_0+.NETformwork4.0
web
由於vs2010已經再也不集成水晶報表,因此須要咱們去找合適的版本下載http://scn.sap.com/docs/DOC-7824redis
或者直接點擊鏈接下載開發安裝包(開發工具包)數據庫
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0.exe服務器
直接下載部署環境安裝包(MSI環境包):ide
32位系統:http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_32bit_13_0.zip工具
64位系統:http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_64bit_13_0.zip佈局
系統打包須要文件(MSM集合包):post
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_mergemodules_13_0.zip開發工具
Install Executable: 包括VS插件、報表設計器、運行環境等全部東西,裝上後就能夠在VS中建立CR報表。也就是說是開發環境的安裝包;
MSI 32/64 Bit: 運行環境獨立安裝包,分別適用於32/64平臺。用於開發完成服務器部署使用;
MSM 32 Bit: 也是運行環境,只不過是用來合併在安裝包中的,不能獨立安裝。看起來只有32位版;下文我所謂的MSM合併法就指它
「下一步」安裝,成功後在左側工具欄會發現多處三個工具。
工具 | 做用 |
CrystalReportViewer | 該控件將報表顯示在基於頁面的佈局中,可在頁面之間進行移動。 |
CrystalReportPartsViewer | 該控件將報表摘要信息顯示在一個相似於門戶的小窗口中,可經過一系列的連接部件向下鑽取到報表。 |
CrystalReportSource | 數據源空間,綁定數據後做爲CrystalReportViewer的數據源使用。 |
2、報表應用與設計
把CrystalReportViewer空間放在頁面上,接下來能夠爲其配置數據源。
數據源的配置有兩種方式,直接經過數據庫鏈接綁定數據,另外一種位靈活數據員綁定(自建實體類或者自建數據集)。
介紹一種經常使用的定義數據源也就是你們說的PUSH模式。
一、設計數據集
在此由於報表中涉及到綁定數據庫篩選結果的多條記錄,因此先建立.xsd數據集
新建文件後,點擊添加工具箱DataTable,一個做爲獲獎記錄顯示,一個做爲培訓記錄顯示。
設置完成後,保存。能夠在頁面CS文件進行直接賦值。
2.設計報表
報表頭部和尾部在報表中製做一次顯示。
打開數據專家,創建數據鏈接。
在報表中綁定數據字段
這個地方值得注意的是,在設計好詳細資料的數據,若是詳細資料的空白位置拉的太長會將下一條數據顯示至至空白後,入股頁面太小將會形成只辦電影出一條數據。
對於實際需求,在本報表中出了頭部信息和上面的培訓信息外還須要獲獎信息,這些都是一句我的的狀況去綁定,因此這時須要添加子報表來完成數據的綁定。
插入子報表,以相同的模式編輯自報表,爲了顯示數據的美觀,咱們能夠把頁眉和頁腳設置爲「抑制顯示(無向下鑽去)」,也就是說不在界面中顯示他們。
子報表是能夠在主報表添加新欄進行編輯的。
由於報表中出現了蓋章等信息,能夠經過‘節專家’添加報表尾abc或更多。
三、數據綁定
string path = Server.MapPath("~/ReportForm/CrystalReport.rpt"); ReportDocument myReport = new ReportDocument(); myReport.Load(path); //爲包含子報表和主報表指定數據源,這部分數據可重疊在(詳細資料)綁定 DataSet1 DSourse = new DataSet1(); //獲取培訓記錄 DataTable DtTRecord = new Facade_PX.Info.InfoQuery().Query_Px_Ercp_People_Train_Record(strCondtion); if (DtTRecord != null && DtTRecord.Rows.Count > 0) { for (int tr = 0; tr < DtTRecord.Rows.Count; tr++) { DataRow TRdr = DSourse.PX_ERCP_PEOPLE_TRAIN_RECORD.NewRow(); TRdr["HOSPITAL_NAME"] = "醫院名稱"; TRdr["TRAIN_HOSPITAL"] = DtTRecord.Rows[tr]["TRAIN_HOSPITAL"]; TRdr["DURATION_NAME"] = "培訓時間"; TRdr["TRAIN_DURATION"] = DtTRecord.Rows[tr]["TRAIN_DURATION"]; DSourse.PX_ERCP_PEOPLE_TRAIN_RECORD.Rows.Add(TRdr); } } //綁定獲獎記錄 DataTable DtTAwards = new Facade_PX.Info.InfoQuery().Query_Px_Ercp_People_Awards(strCondtion); if (DtTAwards != null && DtTAwards.Rows.Count > 0) { for (int aw = 0; aw < DtTAwards.Rows.Count; aw++) { DataRow AWdr = DSourse.PX_ERCP_PEOPLE_AWARDS.NewRow(); AWdr["AWARDS_NAME"] = "獲獎經歷"; AWdr["AWARDS_RECORD"] = DtTAwards.Rows[aw]["AWARDS_RECORD"]; DSourse.PX_ERCP_PEOPLE_AWARDS.Rows.Add(AWdr); } } myReport.SetDataSource(DSourse); //爲RTF報表指定靜態文本
((TextObject)myReport.ReportDefinition.ReportObjects["Title"]).Text = "中國ERCP技術標準化人才培訓項目申請表"; //用實體類的數據填充表格中出現字段
((TextObject)myReport.ReportDefinition.ReportObjects["ApplyName"]).Text = Info.Apply_name; //隱藏工具欄 CrystalReportViewer1.DisplayToolbar = false;
//隱藏菜單欄工具
CrystalReportViewer1.HasToggleGroupTreeButton = false;
CrystalReportViewer1.DisplayGroupTree = false;
CrystalReportViewer1.HasCrystalLogo = false;
CrystalReportViewer1.HasGotoPageButton = false;
CrystalReportViewer1.HasPageNavigationButtons = true;
CrystalReportViewer1.HasSearchButton = false;
CrystalReportViewer1.HasZoomFactorList = false;
CrystalReportViewer1.HasRefreshButton = false; //指定數據源 CrystalReportViewer1.ReportSource = myReport;
數據綁定,開始預覽時,每每程序會出現無效數據員等異常。解決辦法:首先檢查綁定數據對象是否存在,經過調試檢查是否有代碼上的問題。若是代碼沒問題那麼就要檢查類庫的引用是否爲同一個版本,若是不是則修改版本爲最新版本。修改版本一致,主要修改幾項以下:
頁面修改:
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
Webconfig修改:
<system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </assemblies> <buildProviders> <add extension=".rpt" type="CrystalDecisions.Web.Compilation.RptBuildProvider, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </buildProviders> </compilation> </system.web>
預覽結果:
3、報表打印與部署
1.報表打印
獲取當前默認打印機
/// <summary> /// 打印機實例 /// </summary> private static PrintDocument fPrintDocument = new PrintDocument(); /// /// 獲取本機默認打印機名稱 /// public static String DefaultPrinter { get { return fPrintDocument.PrinterSettings.PrinterName; } }
打印數據
myReport.PrintOptions.PrinterName = DefaultPrinter; myReport.PrintToPrinter(1, false, 0, 0);
2.服務器部署
服務器部署正確配置也比較簡單
下載在第一部分提到的環境32位和64位環境包,若是是在32環境下開發,而且已經在應用程序池Enable 32-Bit Applications 爲True。那麼必定要安裝32位CRforVS_redist_install_32bit_13_0.zip不然會出現<add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>的引用錯誤。
調試經過後,點擊打印預覽會發現報表一片空白,這時由於還未將皮膚引用文件引用到IIS的WebSite,須要將C:\inetpub\wwwroot\aspnet_client此路徑下的文件拷貝到站點的根目錄,瀏覽便可。
值得注意的是在服務器,因爲PrintDocument獲取的是服務器打印機因此會出現「默認打印機未設置」的錯誤提示,因此這裏咱們就使用水晶報表工具欄自帶打印按鈕。
首選,先將CrystalReportViewer1設置爲PrintMode="ActiveX",再將工具欄的打印按鈕顯示出來CrystalReportViewer1.HasPrintButton = true。
在你彈出打印預覽的Click事件中使用Session記錄ReportDocument
代碼以下:Session["keepreport"] = myReport;
在頁面加載Page_Load中加入
if (Session["keepreport"] != null) { CrystalReportViewer1.ReportSource = (ReportDocument)Session["keepreport"]; }
主要是由於頁面刷新的問題。
3.異常處理
用着用着,一段時間後會發現出現異常「已達到系統管理員配置的最大報表處理做業數限制」,
在這篇博客中也有講到如何解決
水晶報表服務器運行一段時間提示錯誤:已達到系統管理員配置的最大報表處理做業數限制。
但正由於這個緣由致使,後期打印按鈕不能打印。
通過對頁面生命週期分析後,將ReportDocument資源釋放放在Page_Disposed中便可完美解決,不能打印問題。
Page_Unload:頁面從內存中卸載
Page_Disposed:Page對象從內存中釋放掉。這是Page對象生命週期中的最後一個事件
因此明顯就能夠對比處結果。