使用 ReportDocument.Load() 方法绑定到非托管 RAS

Note注意

本页描述了在 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 对象模型。
    Note注意

    ReportClientDocument 对象模型允许以编程的方式创建、修改报表定义文件并保存对报表定义文件的更改。有关更多信息,请参见“结构”中的 “ReportClientDocument 对象模型(RAS)”

  • 由于报表应用程序服务器(RAS)中报表引擎的优异性能使性能显著提高。有关更多信息,请参见“比较所有 Business Objects 报表解决方案的结构”

缺点

  • 需要添加少量代码。每次将报表绑定到具有 ReportDocument 的 CrystalReportViewer 控件时,都必须添加两行代码,请参见下面的“实现”一节。
  • 升级到 RAS 服务器将显著提高报表的性能。

通过网络将嵌入式报表加载到指定的非托管 RAS 服务器

  • 必须安装“报表应用程序服务器(RAS)” 10 ,并验证其可以正常运行。
  • 找到网络上的非托管 RAS 服务器并记录下该服务器的名称。在此示例中,服务器名称是“RAS01”。

此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。

  1. 在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,有以下报表绑定代码:

    在这两行代码之间,必须添加两行新代码,新代码用于确定网络上的非托管 RAS 服务器,然后在将报表绑定到 CrystalReportViewer 控件之前将此嵌入式报表加载到该 RAS 服务器上。

    hierarchicalGroupingReport = New Hierarchical_Grouping()
    myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
    
    hierarchicalGroupingReport = new Hierarchical_Grouping();
    crystalReportViewer.ReportSource = hierarchicalGroupingReport;
    
  2. 在 hierarchicalGroupingReport 实例化之后,将 RAS 服务器的名称输入到 ReportAppServer 变量的 hierarchicalGroupingReport 属性中。

    hierarchicalGroupingReport.ReportAppServer = "RAS01"
    
    hierarchicalGroupingReport.ReportAppServer = "RAS01";
    
  3. 调用 ReportDocument.Load()。

[“项目设置”](ms227453\(v=vs.90\).md)中的报表绑定代码目前在此行代码之后。

``` vb
hierarchicalGroupingReport.Load("rassdk://C:\report.rpt",
"RAS01")
```

``` csharp
hierarchicalGroupingReport.Load(@"rassdk://C:\report.rpt",
"RAS01");
```
  1. 编译并调试您的项目。
报表现在通过网络从项目中加载到非托管报表应用程序服务器(RAS)。

从 ReportDocument 对象模型中访问 ReportClientDocument 对象模型

  1. 退出上一步骤的调试模式。

  2. 将以下程序集以引用的形式添加到项目中。

    • CrystalDecisions.ReportAppServer.ClientDoc
    • CrystalDecisions.ReportAppServer.Controllers
    • CrystalDecisions.ReportAppServer.DataDefModel
  3. 在类的顶部输入三个 "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;
    
  4. 在 ConfigureCrystalReports() 方法中,在调用 Load() 方法的代码行和将报表绑定到控件的代码行之间,输入对名为“ModifyReport”的新私有帮助器方法的调用。

    ModifyReport()
    
    ModifyReport();
    
  5. 按照下面的示例创建 ModifyReport() 私有帮助器方法。此代码旨在说明对 ReportDocument 对象模型中 ReportClientDocument 对象模型的访问。此代码从报表上显示的字段中删除第一个可用字段。

    Note注意

    如果在报表的结果字段集中未找到数据库表字段,应用程序将引发异常。

    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
    {
    }
    }
    }
    
    Note注意

    从逻辑上而言,依据基础 ReportClientDocument 对象模型编程的所有内容都会出现在封闭的 ReportDocument 实例中,该实例绑定到 CrystalReportViewer 控件。在此代码示例中,此处演示的字段删除操作只会在运行时发生。不会将其保存回报表定义文件。

  6. 若要查看该报表,请生成并运行您的项目。

请参见