使用 ReportAppFactory.OpenDocument() 方法绑定到托管 RAS 服务器

Note注意

本页描述了在 Crystal Reports for Visual Studio 中未提供但在升级版本中提供的功能。若需更多有关 Crystal Reports for Visual Studio 的信息,请参见“什么是 Crystal Reports for Visual Studio?”有关升级版本的更多信息,请参见“升级选项”

对象模型

此报表绑定方案使用 ReportClientDocument(请参见“通过 ReportClientDocument 对象模型进行报表绑定(RAS)”)。

报表的位置

存储在 Crystal Reports Server 或 BusinessObjects Enterprise 中的某个服务器上。

说明

此报表绑定方案直接访问 ReportClientDocument 对象模型。它获取 EnterpriseSession、ReportAppFactory 和 InfoObject。随后,它将 InfoObject 的 ID 属性和整数 0(在 Visual Basic 中为可选参数)传递给 ReportAppFactory 的 OpenDocument() 方法,该方法将从 Crystal Reports Server 或 BusinessObjects Enterprise 返回一个 ReportClientDocument 实例。有关代码示例,请参见下面的“实现”一节。

优点

  • 使用 CE 9 和更高版本中的 RAS 与 ReportClientDocument 对象模型中的报表进行交互的可行方法。
  • 由于 Crystal Reports Server 或 BusinessObjects Enterprise 内托管 RAS 服务器中的报表引擎具有非常优异的性能,所以性能得到显著提高。有关更多信息,请参见“比较所有 Business Objects 报表解决方案的结构”
  • 维护与使用 ReportDocument 对象模型的报表进行交互的所有原始代码,同时仍可以通过 ReportDocument.ReportClientDocument 属性完全访问基础 ReportClientDocument 对象模型。
    Note注意

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

  • 直接访问 ReportClientDocument 对象模型。

缺点

使用 ReportAppFactory 的 OpenDocument 方法将报表从 Crystal Reports Server 或 BusinessObjects Enterprise 加载到 RAS 服务器

  • 必须安装 Crystal Reports Server 或 BusinessObjects Enterprise,并且经验证可以正常工作。
  • 必须在开发计算机上安装 Crystal Reports Server 或 BusinessObjects Enterprise SDK(包括 .NET 程序集)。
    Note注意

    若已在开发计算机上安装 Crystal Reports Server 或 BusinessObjects Enterprise,则在此安装中已包含 SDK。

  • 找到并记录 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。对于此示例,服务器名称为“BOE01”。

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

  1. 使用发布向导将 Chart.rpt 发布到 Crystal Reports Server 或 BusinessObjects Enterprise 服务器。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>若需了解如何使用发布向导,请参见 Crystal Reports Server 或 BusinessObjects Enterprise 用户文档。</p></td>
</tr>
</tbody>
</table>

有关示例报表的信息,请参见[“示例报表目录”](ms225622\(v=vs.90\).md)。
  1. 将以下程序集引用添加到项目中:
1.  CrystalDecisions.Enterprise.Framework
2.  CrystalDecisions.Enterprise.InfoStore
3.  CrystalDecisions.ReportAppServer.ClientDoc
  1. 在代码隐藏页的顶部,为 CrystalDecisions.Enterprise 命名空间和 CrystalDecisions.ReportAppServer.ClientDoc 命名空间添加一条 "Imports" [Visual Basic] 或 "using" [C#] 语句。
``` vb
Imports CrystalDecisions.Enterprise
Imports CrystalDecisions.ReportAppServer.ClientDoc
```

``` csharp
using CrystalDecisions.Enterprise;
using CrystalDecisions.ReportAppServer.ClientDoc;
```

现在已准备就绪,可以添加用于在 Crystal Reports Server 或 BusinessObjects Enterprise 内的 RAS 服务器中打开报表的代码。
  1. 在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,声明 serverName 字符串,并将其设置为 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。
``` vb
Dim serverName As String = "BOE01"
```

``` csharp
string serverName = "BOE01";
```
  1. 声明并实例化 SessionMgr 类。
``` vb
Dim mySessionMgr As SessionMgr = New SessionMgr()
```

``` csharp
SessionMgr sessionMgr = new SessionMgr();
```
  1. 将用户名(Administrator)、密码(blank)、serverName 变量和登录类型(secEnterprise)传递给该 SessionMgr 实例的 Logon 方法,从而获得 EnterpriseSession 的实例。
``` vb
Dim myEnterpriseSession As EnterpriseSession = mySessionMgr.Logon(
_
"Administrator", "", serverName, "secEnterprise")
```

``` csharp
EnterpriseSession enterpriseSession = sessionMgr.Logon(
"Administrator", "", serverName, "secEnterprise");
```
  1. 从 EnterpriseSession 的 GetService 方法中获取 InfoStore 服务(作为 EnterpriseService)。
``` vb
Dim myEnterpriseService As EnterpriseService = _
myEnterpriseSession.GetService("InfoStore")
```

``` csharp
EnterpriseService enterpriseService =
enterpriseSession.GetService("InfoStore");
```
  1. 用获得的 InfoStore 服务声明并实例化 InfoStore。
``` vb
Dim myInfoStore As InfoStore = New InfoStore(myEnterpriseService)
```

``` csharp
InfoStore infoStore = new InfoStore(enterpriseService);
```
  1. 通过将“RASReportFactory”字符串传递到 EnterpriseSession 的 GetService() 方法,重新对 EnterpriseService 实例进行赋值。
``` vb
myEnterpriseService =
myEnterpriseSession.GetService("RASReportFactory")
```

``` csharp
enterpriseService =
enterpriseSession.GetService("RASReportFactory");
```
  1. 将该 EnterpriseService 的 Interface 属性作为一个对象变量返回。
``` vb
Dim rrfObject As Object = myEnterpriseService.Interface
```

``` csharp
Object rrfObject = enterpriseService.Interface;
```
  1. 将对象变量强制转换为 ReportAppFactory 实例。
``` vb
Dim myReportAppFactory As ReportAppFactory = CType(rrfObject,
ReportAppFactory)
```

``` csharp
ReportAppFactory reportAppFactory = (ReportAppFactory)rrfObject;
```
  1. 输入下列查询字符串以向 Crystal Reports Server 或 BusinessObjects Enterprise 查询报表。
``` vb
Dim queryString As String = "Select SI_ID, SI_NAME, SI_PARENTID
From CI_INFOOBJECTS " _
& "Where SI_PROGID='CrystalEnterprise.Report' "
_
& "And SI_NAME Like 'Chart'"
```

``` csharp
string queryString = "Select SI_ID, SI_NAME, SI_PARENTID From
CI_INFOOBJECTS "
+ "Where SI_PROGID='CrystalEnterprise.Report' "
+ "And SI_NAME Like 'Chart'";
```
  1. 通过将查询字符串传递到 InfoStore 的 Query 方法获取包含查询结果的 InfoObjects 索引类。
``` vb
Dim myInfoObjects As InfoObjects = myInfoStore.Query(queryString)
```

``` csharp
InfoObjects infoObjects = infoStore.Query(queryString);
```
  1. 从该 InfoObjects 索引类的第一列中获取 InfoObject。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>InfoObjects 索引类的索引从 1 开始,而不是从 0 开始。</p></td>
</tr>
</tbody>
</table>

``` vb
Dim myInfoObject As InfoObject = myInfoObjects(1)
```

``` csharp
InfoObject infoObject = infoObjects[1];
```
  1. 声明并实例化 ReportClientDocument。
``` vb
Dim myReportClientDocument As ReportClientDocument = New
ReportClientDocumentClass()
```

``` csharp
ReportClientDocument reportClientDocument = new
ReportClientDocumentClass();
```
  1. 将 InfoObject 的 ID 属性和整数 0(在 Visual Basic 中为可选参数)传递到 ReportAppFactory 实例的 OpenDocument 方法。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/8yfdxzdx.alert_note(zh-cn,VS.90).gif" alt="Note" class="note" />注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>这会在 Crystal Reports Server 或 BusinessObjects Enterprise 内的报表应用程序服务器(RAS)中将报表以 ReportClientDocument 实例的形式打开。</p></td>
</tr>
</tbody>
</table>

``` vb
myReportClientDocument =
myReportAppFactory.OpenDocument(myInfoObject.ID, 0)
```

``` csharp
reportClientDocument = reportAppFactory.OpenDocument(infoObject.ID,
0);
```
  1. 将 ReportClientDocument 实例绑定到 CrystalReportViewer 控件。
``` vb
myCrystalReportViewer.ReportSource = myReportClientDocument
```

``` csharp
crystalReportViewer.ReportSource = reportClientDocument;
```
  1. 若要查看该报表,请生成并运行您的项目。

请参见