关于水晶报表打包的一些注意的地方!

.net打包真的很麻烦,特别是碰到要用水晶报表,那打包就更加复杂了。

如果你想在“干净”的机器上成功安装和使用水晶报表,请按照下列步骤:

1)新建“安装和部署项目”-->“安装向导”
(2)选择项目类型(这里选“创建用于windows应用程序的安装程序”)-->下一步
(3)选择要包含的文件:要部署使用 Crystal Reports for Visual Studio .NET 2003 的程序,需要添加合并模块(在解决方案资源管理器中tree的顶端节点右键-->添加).
Crystal_Database_Access2003.msm
Crystal_Database_Access2003_enu.msm
Crystal_Managed2003.msm
Crystal_regwiz2003.msm
VC_User_CRT71_RTL_X86_---.msm
VC_User_STL71_RTL_X86_---.msm
你可以 'C:\Program Files\Common Files\Merge Modules' 文件夹下找到替换的合并模块。
(4)打开解决方案-->右键点击Crystal_regwiz2003.msm 的属性,在“MergeMouduleProperties”里的“License Key”填入:***************************(这个是你生成Crystal Report是用到的注册号的密码!)
(5)生成解决方案

如果没有第四步,会产生在执行打印报表时提示keycodev2.dll或者无效密码的错误。

以上的步骤,如果你的“干净”的机器上装有水晶报表,那么到这里完全就可以了。

如果你不希望在“干净”的机器上装水晶报表,继续以下的步骤:

  1. 在 “ 添加项目输出组 ” 中,选择 “ 主输出 ” ,然后单击 “ 确定 ” 。

将自动添加所有依赖项,如 dotnetfxredist_x86_enu.msm 和 dotnetcrystalreports.msm 。

2.需要将 dotnetcrystalreports.msm 排除在项目之外,在 解决方案资源管理器中右击这个模块的右键,选择 “ 排除 ” 。

3.在解决方案资源管理器中,右击安装项目,指向 “ 添加 ” ,然后单击 “ 合并模块 ” 。

4.在 “ 添加模块 ” 对话框中,选择下列要添加到安装项目的合并模块,然后单击 “ 打开 ” :

  • reportengine.msm,

  • crnetruntime.msm

  • license.msm

  • mapping.msm (可选,当在报表中使用了 geographic maps 时)

5. 在解决方案资源管理器中,右击 license.msm 文件,然后选择 “ 属性 ” 。

6.在 “ 属性 ” 窗口中,展开 ** MergeModuleProperties ** ,然后在 “ 许可证密钥 ” 属性框中输入一个有效的许可证密钥。

** 注意 ** : 每当部署 Crystal Reports 应用程序时,必须提供许可证密钥。

7.从 “ 生成 ” 菜单中,选择 “ 生成解决方案 ” 以生成应用程序

如果以上步骤没有的化,会提示“load crpe32.dll failed”的错误。

用到的模块下载地址: http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9netmergemodules_chs.zip.asp

http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9netredist_chs.zip.asp

http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9rdcmergemodules_chs.zip.asp

如果你的机器上装的是windows 98,不继续以下的步骤会产生 "Load Report Failed" (CRQE.dll)的错误。
报表在部分Win98的客户端可以载入,在部分Win98的客户端载入报表时却提示"Load Report Failed"是因为水晶报表运行时所需的 CRQE.dll 在客户端的系统注册不正确,而原因又是ATL.dll 的版本不对(Windows 98/ME下的正确版本号应为3.0.8449)。
解决办法有两条:
1.在客户端安装 IE6.0,难怪有的客户端运行正常。
2.将 ATL.msm 模块添加到安装工程,ATL.msm 是 Visual Studio installer 1.1 的一部分,可以去微软的网站 http://msdn.microsoft.com/vstudio/downloads/tools/vsi11/download.aspx 下载, 添加办法同上。

至此,可以说打包基本完成。不过还要注意:

如果你用的是水晶报表的推模式,一般不用设置登陆信息,但是要这样写:obj.SetDataSource(this.ds.Tables["tablename"]);如果你写成了obj.SetDataSource(this.ds)就会有登陆框的。

如果你用的是水晶报表的拉模式,你就一定要写上登陆信息:

crReportDocument = new OracleReport();

//Set the crConnectionInfo with the current values stored in the report
crConnectionInfo = crReportDocument.Database.Tables[0].LogOnInfo.ConnectionInfo;

/* Populate the ConnectionInfo Objects Properties with the appropriate values for
the ServerName, User ID, Password and DatabaseName. However, since Oracle
works on Schemas, Crystal Reports does not recognize or store a DatabaseName.
Therefore, the DatabaseName property must be set to a BLANK string. */
crConnectionInfo.DatabaseName = "";
crConnectionInfo.ServerName = "Your Server Name";
crConnectionInfo.UserID = "Your User ID";
crConnectionInfo.Password = "Your Password";

//Set the CrDatabase Object to the Report's Database
crDatabase = crReportDocument.Database;

//Set the CrTables object to the Tables collection of the Report's dDtabase
crTables = crDatabase.Tables;

//Loop through each Table object in the Tables collection and apply the logon info
//specified ealier. Note this sample only has one table so the loop will only execute once
foreach (Table crTable in crTables)
{
crTableLogOnInfo = crTable.LogOnInfo;
crTableLogOnInfo.ConnectionInfo = crConnectionInfo;
crTable.ApplyLogOnInfo (crTableLogOnInfo);

// if you wish to change the schema name as well, you will need to set Location property as follows:
// crTable.Location = "

  1<new name="" schema="">." + crTable.Name;   
  2} 
  3
  4//Set the ReportSource of the CrystalReportViewer to the strongly typed Report included in the project   
  5crystalReportViewer1.ReportSource = crReportDocument; 
  6
  7还有一点要注意:   
  8如果你用到了子报表,一定要处理: 
  9
 10//Go through each sections in the main report and identify the subreport by name   
 11crSections = crReportDocument.ReportDefinition.Sections; 
 12
 13foreach(Section crSection in crSections)   
 14{   
 15crReportObjects = crSection.ReportObjects;   
 16//loop through all the report objects to find all the subreports   
 17foreach(ReportObject crReportObject in crReportObjects)   
 18{   
 19if (crReportObject.Kind == ReportObjectKind.SubreportObject)   
 20{   
 21//you will need to typecast the reportobject to a subreport   
 22//object once you find it   
 23crSubreportObject = (SubreportObject)crReportObject; 
 24
 25//open the subreport object   
 26crSubReportDoc = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName);   
 27//Once the correct subreport has been located pass it the   
 28//appropriate dataset   
 29if(crSubReportDoc.Name == "FirstSub")   
 30{   
 31//crSubReportDoc.Database.Tables[0].SetDataSource(ds);   
 32crSubReportDoc.SetDataSource(ds);   
 33}   
 34}   
 35}   
 36}   
 37crystalReportViewer1.ReportSource = crReportDocument; 
 38
 39同样crSubReportDoc.SetDataSource(ds);改为:crSubReportDoc.SetDataSource(ds.Tables["tablename"]); 
 40
 416.在  “  属性  ”  窗口中,展开  ** MergeModuleProperties  ** ,然后在  “  许可证密钥  ”  属性框中输入一个有效的许可证密钥。 
 42
 43** 注意  ** :  每当部署  Crystal Reports  应用程序时,必须提供许可证密钥。 
 44
 457.从  “  生成  ”  菜单中,选择  “  生成解决方案  ”  以生成应用程序 
 46
 47如果以上步骤没有的化,会提示“load crpe32.dll failed”的错误。 
 48
 49用到的模块下载地址:  http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9netmergemodules_chs.zip.asp 
 50
 51http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9netredist_chs.zip.asp 
 52
 53http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9rdcmergemodules_chs.zip.asp 
 54
 55如果你的机器上装的是windows 98,不继续以下的步骤会产生  "Load Report Failed" (CRQE.dll)的错误。   
 56报表在部分Win98的客户端可以载入,在部分Win98的客户端载入报表时却提示"Load Report Failed"是因为水晶报表运行时所需的 CRQE.dll 在客户端的系统注册不正确,而原因又是ATL.dll 的版本不对(Windows 98/ME下的正确版本号应为3.0.8449)。   
 57解决办法有两条:   
 581.在客户端安装 IE6.0,难怪有的客户端运行正常。   
 592.将 ATL.msm 模块添加到安装工程,ATL.msm 是 Visual Studio installer 1.1 的一部分,可以去微软的网站 http://msdn.microsoft.com/vstudio/downloads/tools/vsi11/download.aspx 下载, 添加办法同上。 
 60
 61至此,可以说打包基本完成。不过还要注意: 
 62
 63如果你用的是水晶报表的推模式,一般不用设置登陆信息,但是要这样写:obj.SetDataSource(this.ds.Tables["tablename"]);如果你写成了obj.SetDataSource(this.ds)就会有登陆框的。 
 64
 65如果你用的是水晶报表的拉模式,你就一定要写上登陆信息: 
 66
 67crReportDocument = new OracleReport(); 
 68
 69//Set the crConnectionInfo with the current values stored in the report   
 70crConnectionInfo = crReportDocument.Database.Tables[0].LogOnInfo.ConnectionInfo; 
 71
 72/* Populate the ConnectionInfo Objects Properties with the appropriate values for   
 73the ServerName, User ID, Password and DatabaseName. However, since Oracle   
 74works on Schemas, Crystal Reports does not recognize or store a DatabaseName.   
 75Therefore, the DatabaseName property must be set to a BLANK string. */   
 76crConnectionInfo.DatabaseName = "";   
 77crConnectionInfo.ServerName = "Your Server Name";   
 78crConnectionInfo.UserID = "Your User ID";   
 79crConnectionInfo.Password = "Your Password"; 
 80
 81//Set the CrDatabase Object to the Report's Database   
 82crDatabase = crReportDocument.Database; 
 83
 84//Set the CrTables object to the Tables collection of the Report's dDtabase   
 85crTables = crDatabase.Tables; 
 86
 87//Loop through each Table object in the Tables collection and apply the logon info   
 88//specified ealier. Note this sample only has one table so the loop will only execute once   
 89foreach (Table crTable in crTables)   
 90{   
 91crTableLogOnInfo = crTable.LogOnInfo;   
 92crTableLogOnInfo.ConnectionInfo = crConnectionInfo;   
 93crTable.ApplyLogOnInfo (crTableLogOnInfo); 
 94
 95// if you wish to change the schema name as well, you will need to set Location property as follows:   
 96// crTable.Location = "<new name="" schema="">." + crTable.Name;   
 97} 
 98
 99//Set the ReportSource of the CrystalReportViewer to the strongly typed Report included in the project   
100crystalReportViewer1.ReportSource = crReportDocument; 
101
102还有一点要注意:   
103如果你用到了子报表,一定要处理: 
104
105//Go through each sections in the main report and identify the subreport by name   
106crSections = crReportDocument.ReportDefinition.Sections; 
107
108foreach(Section crSection in crSections)   
109{   
110crReportObjects = crSection.ReportObjects;   
111//loop through all the report objects to find all the subreports   
112foreach(ReportObject crReportObject in crReportObjects)   
113{   
114if (crReportObject.Kind == ReportObjectKind.SubreportObject)   
115{   
116//you will need to typecast the reportobject to a subreport   
117//object once you find it   
118crSubreportObject = (SubreportObject)crReportObject; 
119
120//open the subreport object   
121crSubReportDoc = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName);   
122//Once the correct subreport has been located pass it the   
123//appropriate dataset   
124if(crSubReportDoc.Name == "FirstSub")   
125{   
126//crSubReportDoc.Database.Tables[0].SetDataSource(ds);   
127crSubReportDoc.SetDataSource(ds);   
128}   
129}   
130}   
131}   
132crystalReportViewer1.ReportSource = crReportDocument; 
133
134同样crSubReportDoc.SetDataSource(ds);改为:crSubReportDoc.SetDataSource(ds.Tables["tablename"]); 
135
1366.在  “  属性  ”  窗口中,展开  ** MergeModuleProperties  ** ,然后在  “  许可证密钥  ”  属性框中输入一个有效的许可证密钥。 
137
138** 注意  ** :  每当部署  Crystal Reports  &lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Arial; mso</new></new>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus