水晶報表安裝配置
3、VS與CR的版本對應
VS 2010 - 13.0原始版本和更高版本
VS 2012 - 13.0_7和更高
VS 2013 - 13.0_9和更高
VS 2015rc–13.0_14
VS 2015 - 13.0_15和更高
VS 2017 - 13.0_21和更高
二、安裝
VS2010中,可以安裝CRforVS_13_0_1,也可以安裝CRforVS_13_0
注意:要用管理員來執行安裝程式,否則可能報錯:錯誤2753。檔案“agent.exe.6ed28686”沒有為安裝作標記
安裝CRforVS_13_0_1.exe之後,VS2010工具箱中自動出現“報表設計”水晶報表工具
CR不支援Visual Studio的Express版本
預設情況下Windows 10沒有安裝3.5框架,VS的CR仍然需要它。通過“開啟或關閉Windows功能”來選擇它,並選擇這兩個選項。(By default Windows 10 does not install the 3.5 framework, CR for VS still needs it. Select it by “Turn Windows feature on or off” and choose both options.)
注意:版本號後邊的13_0_1為小版本號,下載時2個檔案的小版本號要相同。開發電腦和伺服器上安裝的版本號要一致。
安裝之後顯示CRforVS_13_0_1.exe的版號是13.0.1.22 ,web.config檔案中使用這個版本號,CR瀏覽的ASPX檔案中會自動生成這個版本號;
CRforVS_13_0.exe的版本號是13.0.0.99
CRforVS_13_0_21.exe的版本號是13.0.21.2533
CRforVS_redist_install_32it_13_0_1.zip、CRforVS_redist_install_64bit_13_0_1.zip這兩個版本
網上說VS2010只能安裝32位,但我在伺服器上直接安裝的是64位的,沒問題。
三、部署和排錯
1、VS2010系統專案中新增引用5個庫檔案
CrystalDecisions.CrystalReports.Engine 版本13.0.1.22
CrystalDecisions.ReportSource 版本13.0.1.22
CrystalDecisions.Shared 版本13.0.1.22
CrystalDecisions.Web 版本13.0.1.22
ICSharpCode.SharpZipLib.dll 版本0.86替換原來的0.84
前4個都在C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet
如果專案是C/S的程式,引用CrystalDecisions.Windows.Forms來替換CrystalDec主sions.Web
注:VS2017 版本號13.0.21.2533 引用檔案也在上面的資料夾中
2、樣式檔案aspnet_client
安裝CRforVS_13_0_1.exe後,C:\inetpub\wwwroot自動生成了aspnet_client資料夾,這裡面是水晶報表的樣式檔案
把aspnet_client複製到專案檔案的根目錄,沒這個樣式,水晶報表顯示的是一片空白,工具欄按鈕都沒有。
我的電腦就怪了,複製了這個樣式,也沒顯示,檢視網頁原始檔,才知道有兩點不同:
1)專案指定的樣式資料夾是aspnet_client不存在的,叫4_6_81,本應是4_0_30319。處理方法:複製4_0_30319,貼上為4_6_81 。不同的專案,指定的編號不同,有一次伺服器補丁後,編號也變了。
2)專案指定的樣式檔案路徑不在專案根目錄,而是真指C:\inetpub\wwwroot\aspnet_client\4_6_81
伺服器上是指向專案根目錄的aspnet_client\4_6_81
3、資料集模式
資料庫中直接讀表的方式,很容易就實現了水晶報表的功能。
但專案報表不可能這樣一成不變,必須選用資料集的模式。這個模式下,把我整得好苦。
最關鍵的是資料集繫結時的寫法必須是:rptDocument.SetDataSource(rptDataSet.Tables[0].DefaultView);
我以前在CR10中執行十多年,用的都是:rptDocument.SetDataSource(rptDataSet);
結果:以前的繫結不能把資料傳進RPT,也不顯示錯誤,卻顯示:您請求的報表需要更多資訊,要求登入伺服器名、資料庫登入資訊,而且無法輸入登入資訊
這個問題困擾我3天3夜,最後是參考了網上一篇文章才實現的:http://blog.csdn.net/jsjpanxiaoyu/article/details/42360659
4、log4net版本錯誤提示
執行開啟水晶報表,報錯:log4net要更高版本,可整個系統與log4net沒半毛錢關係,log4net是一個日誌功能。
實際問題是:VS2008專案轉VS2010後,水晶報表瀏覽頁要重做,沒有原因,重做了就好
5、亂碼問題
水晶報表瀏覽頁出現亂碼。這跟上面的問題解決方法是一樣的。
6、crystalreportviewer屬性設定
1)VS2008下設定的屬性不能再用了,會報錯;
2)去掉左邊的樹圖:在“設計”檢視下單擊你的CrystalReportView,點選右上角的小箭頭,設定“選擇工具面板檢視”為“none”
相當於屬性中新增 ToolPanelView="None"
3)工具欄新增報表頁選擇框:
4)無法設定水晶報表瀏覽器居中:這個問題還沒解決
5)VS2008下製作的證書格式(更改RPT顯示到HTML中的格式,有些複雜),現在不認了。還沒找到解決辦法
6)CS中設定屬性:
//不顯示組樹
CrystalReportViewer1.DisplayGroupTree = false;
//不顯示徽標
CrystalReportViewer1.HasCrystalLogo = false;
7、RPT檔案生成CS檔案的錯誤
在VS2008中,操作RPT檔案,會自動生成CS檔案,然後整個專案就無法編譯了,整個專案都無法識別引用和名稱空間。
刪除RPT下的CS檔案,就沒事了。
但刪除了,再操作,又生成了,再刪除就沒事了。
VS2008下做的幾個專案,都存在這個問題
專案轉到VS2010下,還是一樣存在這個問題。沒解決掉。
但是,我在VS2010中,新建一個測試專案,卻沒有這個問題。
8、XSD資料集檔案的錯誤
跟上面的情況一樣一樣的。
9、資料集繫結資料實現水晶報表的步驟:
1)建資料集:專案中,新增--新建項--資料--資料集,輸入一個與RPT檔名稱一樣的檔名,便於區分;
在新建彈出的介面,右鍵--新增--資料表,名稱可以改成資料集的名稱一樣的,也可以不改,就用DataTable1
新增列,報表需要的列都新增進去
2)寫SQL查詢語句,照著資料集的列名,組織SQL語句,要完全對應
3)建RPT檔案,不要用嚮導。生成後,在資料專家中,選擇:建立新連線--ADO.NET(XML)--建立新連線,找到剛建的資料集檔案,點選“完成”
將此資料集加到“選定的表”,確定。
4)選擇“欄位資源管理器”,展開資料庫欄位,把欄位拉入RPT檔案。
5)繫結資料與RPT檔案:定義一個數據集,用SQL語句資料把資料讀入資料集,把資料集繫結到水晶報表。
這步實際很簡單。但要注意,繫結語句用這個:rptDocument.SetDataSource(rptDataSet.Tables[0].DefaultView);
10、許可權問題
水晶報表涉及到檔案讀寫,涉及到的資料夾應當新增 ASP.NET或network service使用者的讀寫許可權
11、清除報表快取:
網上說,水晶報表併發數是5個,這很危險呀。
如果超過,就報錯,提示數量受管理員限制。
資料集資源釋放:ds.Dispose();
報表記憶體釋放:
protected void Page_UnLoad(object sender, EventArgs e)
{
//建立完頁面時,釋放報表文件資源
doc.Close();
this.Dispose();
this.ClearChildState();
12、DataSet\SqlDataReader選哪個好(網上的,沒測試,我用的是前者)
SqlDataReader優點:讀取資料非常快。如果對返回的資料不需做大量處理的情況下,建議使用SqlDataReader,其效能要比datset好很多。缺點:直到資料讀完才可close掉於資料庫的連線
(SqlDataReader 讀資料是快速向前的。SqlDataReader 類提供了一種讀取從 SQL Server 資料庫檢索的只進資料流的方法。它使用 SQL Server 的本機網路資料傳輸格式從資料庫連線直接讀取資料。DataReader需及時顯式的close。可及時的釋放對資料的連線。)
Dataset是把資料讀出,快取在記憶體中。缺點:對記憶體的佔用較高。如果對返回的資料需做大量的處理用Dataset比較好些可以減少對資料庫的連線操作。優點:只需連線一次就可close於資料庫的連線
*一般情況下,讀取大量資料,對返回資料不做大量處理用SqlDataReader.對返回資料大量處理用datset比較合適.對SqlDataReader和Dataset的選擇取決於程式功能的實現。
13、設定宿客戶端快取的問題
為防止不重新整理,頁面加上:<%@ OutPutCache Location="None"%>
14、列印時出現:出現通訊錯誤 將停止列印
原因:點列印後,報表要重新載入一回,原來放在if(!IsPpstBack){}中的程式碼不會執行,這樣就會缺少一些報表需要的值;
處理方法:把if(!IsPpstBack){}中的程式碼拿出來。
問題:這個效率太低了:翻頁、列印都要重新載入,需要完善。
15、[水晶報表]伺服器後臺自動生成PDF等檔案 http://blog.csdn.net/david_520042/article/details/7044482
三、設計技術點
水晶報表採用Visual Basic 的語句和函式
1、設定頁面寬度
節專家--詳細資料節--勾選“多列格式化”--佈局,設定寬度
對於有子“詳細資料”節的,要選擇top“詳細資料”節才會顯示“多列格式化。
2、Split({案卷表.增2},'*')[1]
按分隔符分裁字元段,從1開始,不是從0開始
dim arr1() as string
dim ret as string
dim i as number
dim k as number
k=0
arr1=split({盒表.分類名稱},"|")
for i=1 to ubound(arr1)
if k=0 then
ret=arr1(i)
else
ret=arr1(i)+"|"+ret
end if
k=k+1
next i
formula=ret
3、Cstr({盒表.盒號})) 轉字元函式
4、if isnull({盒表.專業名稱}) 判斷空值
if isnull({盒表.BH})=false
5、if Length ({盒表.分類號}) > 6 判斷字元長度
6、trim({盒表.專業名稱}) 清除空格
7、擷取字元
Left ({盒表.分類號}, 4)
Right ({盒表.分類號},Length ({盒表.分類號}) - 6 )
left(Cstr({hos_cureHis_ds.fee_time}),4)+'年'+right(left(Cstr({hos_cureHis_ds.fee_time}),6),2)+'月'+right(left(Cstr({hos_cureHis_ds.fee_time}),8),2)+'日'
8、日期格式化
if Month ({盒表.起始時間})=Month ({盒表.結束時間}) then
cstr(Month ({盒表.起始時間}),0) +"月"
else
cstr(Month({盒表.起始時間}),0)+"-"+cstr(Month({盒表.結束時間}),0)+"月"
參考文章:
2、VS.NET2010水晶報表安裝部署[VS2010]:http://blog.csdn.net/jsjpanxiaoyu/article/details/42360659