使用 ReportDocument.Load() 方法繫結至 Managed RAS 伺服器

Note附註

本頁說明的是在 Crystal Reports for Visual Studio 中沒有提供,但在升級版本中提供的功能。如需關於 Crystal Reports for Visual Studio 的詳細資訊,請參閱「何謂 Crystal Reports for Visual Studio?」。如需關於升級版本的詳細資訊,請參閱「升級選項」

物件模型

這個報表繫結案例使用 ReportClientDocument (請參閱「與 ReportClientDocument 物件模型 (RAS) 繫結的報表」)。

報表位置

在幾個案例之一中,其報表可以加以複製,並存在於兩個位置:Web 專案的內嵌報表中,以及 Managed RAS 伺服器 所公開的 Crystal Reports Server 或 BusinessObjects Enterprise 儲存機制中 (請參閱「報表應用程式伺服器 (RAS)」)。

Note附註

因為報表最終會從遠端伺服器中顯示,這個報表繫結案例也與非內嵌的報表 (如繫結至已載入「繫結至已載入 ReportDocument 類別中的非內嵌報表」中所實作) 配合得相當成功。

說明

在 Crystal Reports for Visual Studio 中,原本以內嵌報表和 ReportDocument 物件模型所建立的 Web 專案,如今可以輕易移植到 Crystal Reports Server 或 BusinessObjects Enterprise 內的 Managed RAS 伺服器。

在這個案例中,您要藉由發行精靈將報表複本置入 Crystal Reports Server 或 BusinessObjects Enterprise,而在執行階段將內嵌報表繫結至 Managed RAS 伺服器。內嵌報表的現有程式碼仍會繼續工作,但您要執行下列作業,將該報表的來源重新導向至 Managed RAS 伺服器:

  • 將 Crystal Reports Server 或 BusinessObjects Enterprise 登入功能加入至專案,並擷取 EnterpriseSession 執行個體。
  • 從 Crystal Reports Server 或 BusinessObjects Enterprise 擷取複製的報表,成為 InfoObject 的執行個體。
  • 將 EnterpriseSession 執行個體及 InfoObject 執行個體傳遞給內嵌報表的 ReportDocument.Load() 方法。

您也可以將非內嵌報表繫結至 Managed RAS 伺服器。要達到這個目的,您可以刪除「繫結至已載入 ReportDocument 類別中的非內嵌報表」中所述的 ReportDocument.Load(String filename) 方法呼叫,再用上述步驟說明的程式碼取代。

這個案例示範的是:在 Crystal Reports Developer 中,您可以將使用 ReportDocument 物件模型的內嵌或非內嵌報表,直接繫結至使用 ReportClientDocument 物件模型的 RAS 伺服器。這是怎麼做到的?其實在 Crystal Reports 10 中,ReportDocument 物件模型已改寫成可以處理 ReportClientDocument 物件模型的 Proxy 層。如需詳細資訊,請參閱<架構>中的「ReportClientDocument 物件模型 (RAS)」

Note附註

InfoObject 執行個體參考了來自 Managed RAS 伺服器的報表。Managed RAS 伺服器上的報表始終都會顯示,即使這個報表是不同的版本,或是具有和內嵌報表不同的名稱。

您可以透過 ReportDocument.ReportClientDocument 屬性直接存取基礎 ReportClientDocument 物件模型,進而在執行階段使用 ReportClientDocument 物件模型修改報表。

優點

  • 便利的可攜性:保有任何與 ReportDocument 物件模型報表互動的原始程式碼,而仍能透過 ReportDocument.ReportClientDocument 屬性完整存取基礎 ReportClientDocument 物件模型。
    Note附註

    ReportClientDocument 物件模型允許您以程式設計方式建立、修改及儲存變更至報表定義檔案。如需詳細資訊,請參閱<架構>中的「ReportClientDocument 物件模型 (RAS)」

  • 最佳化效能:因報表應用程式伺服器 (RAS) 報表引擎的卓越效能而產生顯著的效能增益。如需詳細資訊,請參閱「比較所有 Business Objects 報表解決方案之間的架構」

缺點

  • 小幅增加程式碼的編寫:專案必須登入與擷取 EnterpriseSession 物件,並將其儲存在 ASP.NET 工作階段中。每次使用 ReportDocument 將報表繫結至 CrystalReportViewer 控制項時,您都必須擷取 InfoObject 並呼叫 Load() 方法。
  • 增加維護需求:將內嵌報表複製到 Crystal Reports Server 或 BusinessObjects Enterprise 會增加維護需求。如果報表需要修改或刪除,則必須將那些變更傳送至 Web 專案中的內嵌報表,以及 Crystal Reports Server 或 BusinessObjects Enterprise 中的報表複本。

使用 ReportDocument 的 Load 方法,以報表的 InfoObject 顯示存放在 Crystal Reports Server 或 BusinessObjects Enterprise 中的內嵌報表重複複本

  • 安裝 Crystal Reports Server 或 BusinessObjects Enterprise,並確認其正在運作。
  • 安裝 Crystal Reports Server 或 BusinessObjects Enterprise SDK (包括 .NET 組件),並確認其正在運作。
    Note附註

    如果開發電腦上已經安裝了 Crystal Reports Server 或 BusinessObjects Enterprise,SDK 即包含在該安裝中。

這個程序只能與「專案設定」一節中建立的專案搭配使用。「專案設定」包含特定命名空間參考以及本程序所需的程式碼組態;您必須具備這個組態,否則將無法完成此程序。因此,在您開始本程序前,必須先遵循「專案設定」中的步驟進行。

Note附註

RAS 伺服器只適用於 Web 專案。

  1. 尋找並抄下 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器名稱。這個範例所使用的伺服器名稱為「BOE01」。
1.   若要尋找伺服器名稱,以滑鼠右鍵按一下 \[我的電腦\] 圖示,然後選取 \[內容\]。
2.   在 \[系統內容\] 對話方塊上,按一下 \[網路識別\] 索引標籤。
3.   電腦名稱會出現在 \[完整電腦名稱\] 欄位中。
  1. 使用發行精靈,將 Hierarchical Grouping.rpt 發行至 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\36bhtx7w.alert_note(zh-tw,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>
  1. 您在「專案設定」中所建立的 ConfigureCrystalReports() 方法,內有下列報表繫結程式碼:
``` vb
Dim hierarchicalGroupingReport As Hierarchical_Grouping = New
Hierarchical_Grouping()
myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
```

``` csharp
Hierarchical_Grouping hierarchicalGroupingReport = new
Hierarchical_Grouping();
crystalReportViewer.ReportSource = hierarchicalGroupingReport;
```

在這兩行程式碼之間,您要加入幾行新的程式碼 (請參閱步驟 5 至 16);這些程式碼會在將報表繫結至 CrystalReportViewer 控制項之前,執行下列作業:

  - 登入網路上的 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器。
  - 擷取報表做為 InfoObject 執行個體。
  1. 將下列組件參考加入至專案:
1.  CrystalDecisions.Enterprise.Framework
2.  CrystalDecisions.Enterprise.InfoStore
  1. 在程式碼後置頁面頂端,加上 "Imports" (Visual Basic) 或 "using" (C#) 陳述式,匯入 CrystalDecisions.Enterprise 命名空間。
您現在即可開始加入程式碼,將內嵌報表重新導向至 Crystal Reports Server 或 BusinessObjects Enterprise。

``` vb
Imports CrystalDecisions.Enterprise
```

``` csharp
using CrystalDecisions.Enterprise;
```
  1. 在產生 hierarchicalGroupingReport 執行個體的程式行之後,接著宣告 serverName 字串,並且設定為 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器的名稱。
``` vb
Dim serverName As String = "BOE01"
```

``` csharp
string serverName = "BOE01";
```
  1. 宣告並產生 SessionMgr 類別的執行個體。

    Dim mySessionMgr As SessionMgr = New SessionMgr()
    
    SessionMgr sessionMgr = new SessionMgr();
    
  2. 將使用者名稱 (Administrator)、密碼 (空白)、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);
```

您現在即可開始從 Crystal Reports Server 或 BusinessObjects Enterprise 擷取階層群組報表。
  1. 輸入以下查詢字串,向 Crystal Reports Server 或 BusinessObjects Enterprise 查詢報表。
``` vb
Dim queryString As String = "Select SI_CUID From CI_INFOOBJECTS " _
& "Where SI_PROGID='CrystalEnterprise.Report' "
_
& "And SI_NAME Like 'Hierarchical Grouping'"
```

``` csharp
string queryString = "Select SI_CUID From CI_INFOOBJECTS "
+ "Where SI_PROGID='CrystalEnterprise.Report' "
+ "And SI_NAME Like 'Hierarchical Grouping'";
```
  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\36bhtx7w.alert_note(zh-tw,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];
```

您現在即可開始從 Crystal Reports Server 或 BusinessObjects Enterprise 載入內嵌報表的重複複本。
  1. 呼叫內嵌報表的 Load() 方法,然後將 InfoObject 及 EnterpriseSession 目前的執行個體傳遞給 Load() 方法。
``` vb
hierarchicalGroupingReport.Load(myInfoObject, myEnterpriseSession)
```

``` csharp
hierarchicalGroupingReport.Load(infoObject, enterpriseSession);
```
  1. 若要檢視報表,請建置並執行專案。

    報表會從 Crystal Reports Server 或 BusinessObjects Enterprise 載入,再從 Crystal Reports Server 或 BusinessObjects Enterprise 內的報表應用程式伺服器 (RAS) 提供。

若要從 ReportDocument 物件模型內部存取 ReportClientDocument 物件模型,請參閱「使用 ReportDocument.Load() 方法繫結至 Unmanaged RAS 伺服器」 中的<實作>一節。

請參閱