原理:
用 Microsoft Installer (MSI)在您的安裝包中包括的合并子產品 (MSM) 分發。
MSI 合并子產品(MSM)可在“C:/Program Files/Common Files/Merge Modules”目錄中找到。
合并子產品(MSM)分為三類:托管元件、資料庫通路和密鑰号碼。
托管元件 MSM 處理所有托管元件的分發,其中包括 Windows 窗體檢視器、Web 窗體檢視器和所有 Crystal Decisions 命名空間。對于使報表運作所需的所有其他檔案,由資料庫通路 MSM 處理其分發。其中包括資料庫、導出和圖表驅動程式。KeyCode MSM 處理 Crystal Decisions 密鑰号碼的安裝,這樣您的使用者在檢視報表時,就不會被要求注冊他們的 Crystal版本。
具體操作步驟:
1)建立“安裝和部署項目”-->“安裝向導”
2)選擇項目類型(這裡選“建立用于windows應用程式的安裝程式”)-->下一步
3)選擇要包含的檔案:添加你的程式檔案 + C:/Program Files/Common Files/Merge Modules下的managed.msm、managed_chs.msm、database_access.msm、database_access_chs.msm、regwiz.msm、VC_CRT.msm、VC_STL.msm。-->完成
具體功能如下:
managed.msm、managed_chs.msm、(托管元件 MSM 處理所有托管元件的分發,其中包括 Windows 窗體檢視器、Web 窗體檢視器和所有 Crystal Decisions 命名空間)
database_access.msm、database_access_chs.msm、(對于使報表運作所需的所有其他檔案,由資料庫通路 MSM 處理其分發。其中包括資料庫、導出和圖表驅動程式。)
regwiz.msm、(KeyCode MSM 處理 Crystal Decisions 密鑰号碼的安裝)
VC_CRT.msm、VC_STL.msm(這個在msdn上絕對沒提起,是vc的運作庫,估計是Crystal Report或涉及到的某些程式是用vc寫的,是以需要它!)
選擇要包含的檔案:添加你的程式檔案 + C:/Program Files/Common Files/Merge Modules下的managed.msm、managed_chs.msm、database_access.msm、database_access_chs.msm、regwiz.msm、VC_CRT.msm、VC_STL.msm。-->完成
這裡的添加是在“解決方案資料總管”裡,安裝項目,彈右鍵,選“合并子產品”,來添加。
managed.msm、managed_chs.msm、database_access.msm、database_access_chs.msm、regwiz.msm、VC_CRT.msm、VC_STL.msm
4)打開解決方案-->右鍵點選regwiz.msm的屬性,在“MergeMouduleProperties”裡的“License Key”填入:AAP5GKS0000GDE100DS(這個是你生成Crystal Report是用到的注冊号的密碼!)
5)生成解決方案(或直接按Ctrl+Shift+B)
水晶報表注冊碼
注冊号:6707437608
密碼:AAP5GKS0000GDE100DS
---------------------------------------------------------------------------------------------------------------------------
[推薦]部署水晶報表時的常見問題及解決方案
目錄:
1、載入報表時報錯
2、部署到 Windows 98 / ME 時,出錯:"Load Report Failed"
3、在Win98的用戶端運作提示"該字段名未知"
4、分發到客戶機時“查詢引擎出錯”
5、load crpe32.dll failed
6、在 ASP.NET 程式中加載報表時,出錯:"Load Report Failed"
7、部署 .NET 9.1 程式到 Windows 98 時,出錯:"Load Report Failed"
------------------------------------------------
1、載入報表時報錯
問題出在報表釋出上。
釋出使用水晶報表的項目需要包含三種元件:報表(*.rpt)、子產品(*.msm)、運作庫(*.msm),這些子產品檔案是在 C:/Program Files/Common Files/Merge Modules/ 目錄裡面。
(1)報表(*.rpt)
使用者程式設計時建立的水晶報表檔案。
(2)子產品(*.msm)
Managed.msm 該子產品包含了CR for VS .NET 的管理子產品,如 CrystalDecisions、CrystalReports.Engine.DLL、CrystalDecisions.Web.DLL, 和 CrystalDecisions.Windows.Forms.DLL……
Managed_chs.msm 是該子產品的中文版語言支援。
Database_Access.msm 該子產品包含了資料庫的驅動、與不同資料庫的聯結、報表導出為 RTF 和 HTML 格式的文檔和圖表元件。
Database_Access_chs.msm 是此子產品的中文版語言支援。
Regwiz.msm 注冊資訊子產品,非常重要,必需在這個子產品輸入水晶報表的注冊序列号,如果不填,編譯的時候就無法通過
(3)運作庫(*.msm)
如果報表檔案使用了 ADO.NET 的 dataset 資料集對象,那麼 VC_CRT.msm 和 VC_STL.msm 子產品也必須包含在安裝工程中。而且這兩個子產品的檔案安裝屬性的"Module Retargetable Folder"項必須修改成為系統目錄
在VS.NET安裝工程中,系統檢測出來的依賴項隻有 dotNETFXRedist_x86_chs.msm 和 Managed.msm這兩個子產品,其他的子產品我們需要手動加入。
(1)在解決方案資料總管裡,右鍵單擊安裝項目選擇"添加"-〉"合并子產品(M)"
(2)在"添加子產品"對話窗體,選擇 Managed_chs.msm 、Database_Access, Database_Access_chs, regwiz、VC_CRT.msm 和 VC_STL.msm 子產品
(3)重新生成安裝項目,沒問題,隻是生成的安裝程式一下子大了七、八兆。
-------------------------
2、部署到 Windows 98 / ME 時,出錯:"Load Report Failed"
是因為查詢引擎 DLL(CRQE.dll)在客戶計算機上沒有正确注冊。
要解決這個問題,可以在客戶計算機上手動注冊 CRQE.dll,使用下面的指令:
regsvr32 "C:/program files/common files/Crystal Decisions/1.0/bin/CRQE.dll"
如果 CRQE.dll 沒有成功注冊,并且問題繼續存在,在客戶計算機上檢查 ATL.dll 的版本。ATL.dll for Windows 98/ME 正确的版本是 3.0.8449。
通過使用下面三種方法中的任意一種方法,可以找到并注冊正确版本的 ATL.dll。
(1)在客戶計算機上裝 IE6.0。
(2)在客戶計算機上,手動複制和注冊 ATL.dll,然後運作用于 Crystal Reports 分發的安裝包。
(2)将 ATL.msm 合并子產品添加到安裝工程,ATL.msm 是 Visual Studio installer 1.1 的一部分,可以去微軟的網站http://msdn.microsoft.com/vstudio/downloads/tools/vsi11/download.aspx下載下傳, 添加辦法同上。
-------------------------
3、在Win98的用戶端運作提示"該字段名未知"
報表在Win2000的用戶端一切正常,在Win98的用戶端運作提示"該字段名未知"?
是因為報表使用到的 sql server 資料庫中的字段名為中文的緣故,将其字段名改名為英文字段名。
-------------------------
4、分發到客戶機時“查詢引擎出錯”
(1)“安裝項目”要包含下列合并子產品:
VC_CRT.msm
VC_STL.msm
(2)此外,確定 Msvcr70.dll 和 Msvcp70.dll 在客戶計算機的“系統目錄”裡。
-------------------------
5、load crpe32.dll failed
下面是cr9net_deployment.pdf說明中的部署Crystal Report 9的步驟:
打開 Windows 應用程式。
在解決方案資料總管中,右擊 Windows 應用程式解決方案,指向“添加”,然後單擊“建立項目”。
在“添加新項目”對話框中,選擇“項目類型”窗格中的“安裝和部署項目”,然後選擇“模闆”窗格中的“安裝項目”。單擊“确定”按鈕。
在解決方案資源管理中,右擊安裝項目,指向“添加”,然後單擊“項目輸出”。
在“添加項目輸出組”中,選擇“主輸出”,然後單擊“确定”。
将自動添加所有依賴項,如 dotnetfxredist_x86_enu.msm和dotnetcrystalreports.msm。
需要将dotnetcrystalreports.msm排除在項目之外,在解決方案資料總管中右擊這個子產品的右鍵,選擇“排除”。
在解決方案資料總管中,右擊安裝項目,指向“添加”,然後單擊“合并子產品”。
在“添加子產品”對話框中,選擇下列要添加到安裝項目的合并子產品,然後單擊“打開”:
reportengine.msm, crnetruntime.msm, license.msm
mapping.msm (可選,當在報表中使用了geographic maps時)
VC_CRT.msm、VC_STL.msm( 如果您部署的 Windows 應用程式使用 ADO.NET 資料集,則還需要包括 VC_CRT 和 VC_STL 合并子產品)
在解決方案資料總管中,右擊 license.msm 檔案,然後選擇“屬性”。
在“屬性”視窗中,展開 MergeModuleProperties,然後在“許可證密鑰”屬性框中輸入一個有效的許可證密鑰。
注意 每當部署 Crystal Reports 應用程式時,必須提供許可證密鑰。
從“生成”菜單中,選擇“生成解決方案”以生成應用程式。
-------------------------
6、在 ASP.NET 程式中加載報表時,出錯:"Load Report Failed"
確定 ASPNET 本地使用者對報表所在的檔案夾有“完全控制”的權限。
-------------------------
7、部署 .NET 9.1 程式到 Windows 98 時,出錯:"Load Report Failed"
是因為查詢引擎 DLL(CRQE.dll)在客戶計算機上沒有正确注冊。
要解決這個問題,從開發計算機複制 Dbghelp.dll 到客戶計算機的"C:Windows/system32" 檔案夾。
----------------------------------------------------------------------------------------------------------------------------
動态改變資料源的代碼
Dim dsdataSet As New DataSet()
Dim oRpt As New rptClient() ‘已建立的報表rptClient
請讀者自行填充資料集dsdataSet
‘使用“報表引擎”對象模型将填充的資料集,傳遞給報表
oRpt.SetDataSource(dsdataSet.Tables(0))
‘ 将帶有資料的報表對象綁定到 Windows 窗體檢視器,rptVew(CrystalReportViewer控件)
rptVew.ReportSource = oRpt
注意 FillDataSet 方法可連接配接到指定的資料庫,提取資料,然後斷開資料庫連接配接。如果您希望将資料庫中的多個表添加到報表中,請使用 SQL JOIN 語句将這些表聯接在一起;然後在 FillDataSet 方法中指定一個結果表
建立主從報表
在報表中,有許多報表是主從表結構,比如訂單與訂單商品明細,訂單是一個表中的一條記錄,而分錄是另一個表中的多條記錄,兩個表通過一個字段關聯起來,這種報表可利用其分組功能實作,
1. 建立一個工程
2. 往FORM1中添加一個CrystalReportViewer控件
3. 在服務噐資料總管中連接配接到SQL SERVER 2000上的Northwind資料庫
4. 添加一個資料集Dataset1,将伺服器資料總管中的Orders和 Order Details加入到資料集中。
5. 添加一個水晶報表,使用報表專家,在項目資料中選擇“ADO.NET資料集”,插入表Orders和 Order Details,“連結”中是關聯字段的連結,在“字段”中選擇要顯示的主表和明細表的字段,組中選擇分組依據為Orders表OrdersID字段,總計,圖表,選擇(可進行篩選),樣式(可設定報表标題),可自行設定。設定完後,點選完成。
6. 在報表設計器中調整需要顯示的字段的位置、寬度等。
7. 在視窗中添加代碼。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oRpt As New CrystalReport1()
Dim dsdataSet As New Dataset1()
Dim CN As New Data.SqlClient.SqlConnection("data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa")
CN.Open()
Dim daOrders As New Data.SqlClient.SqlDataAdapter("select * from orders", CN)
daOrders.Fill(dsdataSet, "orders")
Dim daDetails As New Data.SqlClient.SqlDataAdapter("select * from [Order Details]", CN)
daDetails.Fill(dsdataSet, "Order Details")
‘使用“報表引擎”對象模型将填充的資料集,傳遞給報表
oRpt.SetDataSource(dsdataSet)
CrystalReportViewer1.ReportSource = oRpt
End Sub
運作程式
用程式改變報表中text的文本
代碼如下:
Dim GetTextObject As TextObject
‘ 按名稱擷取 ReportObject,将其轉換為 TextObject,并傳回此對象。
GetTextObject = orpt.ReportDefinition.ReportObjects.Item("text13")
GetTextObject.Text = "XXXX系統"