使用 ReportAppFactory.OpenDocument() 方法绑定到托管 RAS 服务器
注意 |
---|
本页描述了在 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 对象模型。
注意 ReportClientDocument 对象模型允许以编程的方式创建、修改报表定义文件并保存对报表定义文件的更改。有关更多信息,请参见“结构”中的 “ReportClientDocument 对象模型(RAS)”。
- 直接访问 ReportClientDocument 对象模型。
缺点
- 如果代码以前是使用 ReportDocument 对象模型为 Crystal Reports 开发的,则此方案需要重新编写报表绑定的全部代码。请考虑改用以下这些可用于 ReportDocument 的替代方案之一。
使用 ReportAppFactory 的 OpenDocument 方法将报表从 Crystal Reports Server 或 BusinessObjects Enterprise 加载到 RAS 服务器
- 必须安装 Crystal Reports Server 或 BusinessObjects Enterprise,并且经验证可以正常工作。
- 必须在开发计算机上安装 Crystal Reports Server 或 BusinessObjects Enterprise SDK(包括 .NET 程序集)。
注意 若已在开发计算机上安装 Crystal Reports Server 或 BusinessObjects Enterprise,则在此安装中已包含 SDK。
- 找到并记录 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。对于此示例,服务器名称为“BOE01”。
此过程仅适用于已通过“项目设置”创建的项目。“项目设置”包含此过程需要的特定命名空间引用和代码配置。如果没有该配置,将无法完成此过程。因此,在开始此过程之前,必须首先执行“项目设置”中的步骤。
- 使用发布向导将 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. CrystalDecisions.Enterprise.Framework
2. CrystalDecisions.Enterprise.InfoStore
3. CrystalDecisions.ReportAppServer.ClientDoc
- 在代码隐藏页的顶部,为 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 服务器中打开报表的代码。
- 在 ConfigureCrystalReports() 方法(在“项目设置”中创建)中,声明 serverName 字符串,并将其设置为 Crystal Reports Server 或 BusinessObjects Enterprise 服务器的名称。
``` vb
Dim serverName As String = "BOE01"
```
``` csharp
string serverName = "BOE01";
```
- 声明并实例化 SessionMgr 类。
``` vb
Dim mySessionMgr As SessionMgr = New SessionMgr()
```
``` csharp
SessionMgr sessionMgr = new SessionMgr();
```
- 将用户名(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");
```
- 从 EnterpriseSession 的 GetService 方法中获取 InfoStore 服务(作为 EnterpriseService)。
``` vb
Dim myEnterpriseService As EnterpriseService = _
myEnterpriseSession.GetService("InfoStore")
```
``` csharp
EnterpriseService enterpriseService =
enterpriseSession.GetService("InfoStore");
```
- 用获得的 InfoStore 服务声明并实例化 InfoStore。
``` vb
Dim myInfoStore As InfoStore = New InfoStore(myEnterpriseService)
```
``` csharp
InfoStore infoStore = new InfoStore(enterpriseService);
```
- 通过将“RASReportFactory”字符串传递到 EnterpriseSession 的 GetService() 方法,重新对 EnterpriseService 实例进行赋值。
``` vb
myEnterpriseService =
myEnterpriseSession.GetService("RASReportFactory")
```
``` csharp
enterpriseService =
enterpriseSession.GetService("RASReportFactory");
```
- 将该 EnterpriseService 的 Interface 属性作为一个对象变量返回。
``` vb
Dim rrfObject As Object = myEnterpriseService.Interface
```
``` csharp
Object rrfObject = enterpriseService.Interface;
```
- 将对象变量强制转换为 ReportAppFactory 实例。
``` vb
Dim myReportAppFactory As ReportAppFactory = CType(rrfObject,
ReportAppFactory)
```
``` csharp
ReportAppFactory reportAppFactory = (ReportAppFactory)rrfObject;
```
- 输入下列查询字符串以向 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'";
```
- 通过将查询字符串传递到 InfoStore 的 Query 方法获取包含查询结果的 InfoObjects 索引类。
``` vb
Dim myInfoObjects As InfoObjects = myInfoStore.Query(queryString)
```
``` csharp
InfoObjects infoObjects = infoStore.Query(queryString);
```
- 从该 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];
```
- 声明并实例化 ReportClientDocument。
``` vb
Dim myReportClientDocument As ReportClientDocument = New
ReportClientDocumentClass()
```
``` csharp
ReportClientDocument reportClientDocument = new
ReportClientDocumentClass();
```
- 将 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);
```
- 将 ReportClientDocument 实例绑定到 CrystalReportViewer 控件。
``` vb
myCrystalReportViewer.ReportSource = myReportClientDocument
```
``` csharp
crystalReportViewer.ReportSource = reportClientDocument;
```
- 若要查看该报表,请生成并运行您的项目。