1. 程式人生 > >水晶報表安裝配置

水晶報表安裝配置

  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