使用 ReportDocument.Load() 方法绑定到非托管 RAS
![]() |
---|
本页描述了在 Crystal Reports for Visual Studio 中未提供但在升级版本中提供的功能。若需更多有关 Crystal Reports for Visual Studio 的信息,请参见“什么是 Crystal Reports for Visual Studio?”有关升级版本的更多信息,请参见“升级选项”。 |
对象模型
此报表绑定方案使用 ReportClientDocument(请参见“通过 ReportClientDocument 对象模型进行报表绑定(RAS)”)。
报表的位置
报表嵌入在项目中。运行时,报表通过网络加载到指定的“报表应用程序服务器(RAS)” 中。
说明
现在,可以将在 Crystal Reports for Visual Studio 中使用嵌入式报表和 ReportDocument 对象模型的 Visual Studio 项目轻松地移植到非托管 RAS 服务器。
在此方案中,将通过网络加载报表,并将其加载到指示的非托管报表应用程序服务器(RAS)中。有关代码示例,请参见下面的“实现”一节,该示例添加两行代码执行以下操作:
- 将 RAS 服务器的名称赋给 ReportDocument.ReportAppServer 属性。
- 调用 ReportDocument.Load() 方法。
虽然嵌入式报表是为 ReportDocument 对象模型编写的,但可以在 Crystal Reports 开发人员版中将嵌入式报表直接绑定到 RAS 服务器上,该服务器使用 ReportClientDocument 对象模型。这是可以实现的,因为在 Crystal Reports 开发人员版中,ReportDocument 对象模型已被重写为处理 ReportClientDocument 对象模型的代理层。有关更多信息,请参见 “ReportClientDocument 对象模型(RAS)”。
可以通过 ReportDocument.ReportClientDocument 属性直接访问基础 ReportClientDocument 对象模型。这样将允许在运行时修改具有 ReportClientDocument 对象模型的报表。
优点
- 能够维护与使用 ReportDocument 对象模型的报表进行交互的所有原始代码,同时又可以通过 ReportDocument.ReportClientDocument 属性完全访问基础 ReportClientDocument 对象模型。
注意
ReportClientDocument 对象模型允许以编程的方式创建、修改报表定义文件并保存对报表定义文件的更改。有关更多信息,请参见“结构”中的 “ReportClientDocument 对象模型(RAS)”。
- 由于报表应用程序服务器(RAS)中报表引擎的优异性能使性能显著提高。有关更多信息,请参见“比较所有 Business Objects 报表解决方案的结构”。
缺点
- 需要添加少量代码。每次将报表绑定到具有 ReportDocument 的 CrystalReportViewer 控件时,都必须添加两行代码,请参见下面的“实现”一节。
- 升级到 RAS 服务器将显著提高报表的性能。
通过网络将嵌入式报表加载到指定的非托管 RAS 服务器
- 必须安装“报表应用程序服务器(RAS)” 10 ,并验证其可以正常运行。
- 找到网络上的非托管 RAS 服务器并记录下该服务器的名称。在此示例中,服务器名称是“RAS01”。
此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。
在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,有以下报表绑定代码:
在这两行代码之间,必须添加两行新代码,新代码用于确定网络上的非托管 RAS 服务器,然后在将报表绑定到 CrystalReportViewer 控件之前将此嵌入式报表加载到该 RAS 服务器上。
hierarchicalGroupingReport = New Hierarchical_Grouping() myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
hierarchicalGroupingReport = new Hierarchical_Grouping(); crystalReportViewer.ReportSource = hierarchicalGroupingReport;
在 hierarchicalGroupingReport 实例化之后,将 RAS 服务器的名称输入到 ReportAppServer 变量的 hierarchicalGroupingReport 属性中。
hierarchicalGroupingReport.ReportAppServer = "RAS01"
hierarchicalGroupingReport.ReportAppServer = "RAS01";
调用 ReportDocument.Load()。
[“项目设置”](ms227453\(v=vs.90\).md)中的报表绑定代码目前在此行代码之后。
``` vb
hierarchicalGroupingReport.Load("rassdk://C:\report.rpt",
"RAS01")
```
``` csharp
hierarchicalGroupingReport.Load(@"rassdk://C:\report.rpt",
"RAS01");
```
- 编译并调试您的项目。
报表现在通过网络从项目中加载到非托管报表应用程序服务器(RAS)。
从 ReportDocument 对象模型中访问 ReportClientDocument 对象模型
退出上一步骤的调试模式。
将以下程序集以引用的形式添加到项目中。
- CrystalDecisions.ReportAppServer.ClientDoc
- CrystalDecisions.ReportAppServer.Controllers
- CrystalDecisions.ReportAppServer.DataDefModel
在类的顶部输入三个 "Imports" [Visual Basic] 或 "using" [C#] 语句。
Imports CrystalDecisions.ReportAppServer.ClientDoc Imports CrystalDecisions.ReportAppServer.Controllers Imports CrystalDecisions.ReportAppServer.DataDefModel
using CrystalDecisions.ReportAppServer.ClientDoc; using CrystalDecisions.ReportAppServer.DataDefModel; using CrystalDecisions.ReportAppServer.Controllers;
在 ConfigureCrystalReports() 方法中,在调用 Load() 方法的代码行和将报表绑定到控件的代码行之间,输入对名为“ModifyReport”的新私有帮助器方法的调用。
ModifyReport()
ModifyReport();
按照下面的示例创建 ModifyReport() 私有帮助器方法。此代码旨在说明对 ReportDocument 对象模型中 ReportClientDocument 对象模型的访问。此代码从报表上显示的字段中删除第一个可用字段。
注意
如果在报表的结果字段集中未找到数据库表字段,应用程序将引发异常。
Private Sub ModifyReport() Dim myReportClientDocument As ISCDReportClientDocument = _ hierarchicalGroupingReport.ReportClientDocument Dim myTables As Tables = _ myReportClientDocument.DatabaseController.Database.Tables Dim myTable As CrystalDecisions.ReportAppServer.DataDefModel.Table myTable = CType(myTables(0), CrystalDecisions.ReportAppServer.DataDefModel.Table) Dim myFields As Fields = myTable.DataFields Dim myField As ISCRField For Each myField In myFields Dim myResultFieldController As ResultFieldController = _ myReportClientDocument.DataDefController.ResultFieldController Try myResultFieldController.Remove(myField) Exit For Catch End Try Next End Sub
private void ModifyReport() { ISCDReportClientDocument reportClientDocument = hierarchicalGroupingReport.ReportClientDocument; Tables tables = reportClientDocument.DatabaseController.Database.Tables; CrystalDecisions.ReportAppServer.DataDefModel.Table table = (CrystalDecisions.ReportAppServer.DataDefModel.Table)tables[0]; Fields fields = table.DataFields; for (int i = 0; i < fields.Count; i++) { ISCRField field = fields[i]; ResultFieldController resultFieldController = reportClientDocument.DataDefController.ResultFieldController; try { resultFieldController.Remove(field); break; } catch { } } }
注意
从逻辑上而言,依据基础 ReportClientDocument 对象模型编程的所有内容都会出现在封闭的 ReportDocument 实例中,该实例绑定到 CrystalReportViewer 控件。在此代码示例中,此处演示的字段删除操作只会在运行时发生。不会将其保存回报表定义文件。
若要查看该报表,请生成并运行您的项目。