共用方式為


使用 ReportDocument.FileName 屬性繫結至 Managed RAS 伺服器

Note附註

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

物件模型

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

報表位置

幾個案例的其中之一,其報表是從 Visual Studio 專案中的內嵌報表複製而來,現存於兩處位置:在 Crystal Reports Server 或 BusinessObjects Enterprise (BOE) 內,由報表應用程式伺服器 (RAS) 所公開的 Crystal Reports Server 或 BusinessObjects Enterprise 儲存機制中。

Note附註

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

說明

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

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

  • 將 Crystal Reports Server 或 BusinessObjects Enterprise 登入功能加入至專案,並擷取 EnterpriseSession 執行個體。
  • 從 Crystal Reports Server 或 BusinessObjects Enterprise 擷取重複報表的 CUID 屬性。
  • 將 ReportDocument 的 EnterpriseSession 屬性設定為 EnterpriseSession 執行個體。
  • 將 ReportDocument 的 FileName 屬性設定為內嵌報表的 CUID 字串。

如需程式碼範例,請參閱下面<實作>一節。

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

Note附註

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

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

優點

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

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

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

缺點

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

使用 ReportDocument 的 FileName 屬性,以報表的 CUID 顯示存放在 Crystal Reports Server 或 BusinessObjects Enterprise 中的內嵌報表重複複本

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

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

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

  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>

如需範例報表的詳細資訊,請參閱[「範例報表的目錄」](ms225622\(v=vs.90\).md)。
  1. 您在「專案設定」中所建立的 ConfigureCrystalReports() 方法,內有下列報表繫結程式碼。
``` vb
Dim hierarchicalGroupingReport As Hierarchical_Grouping = New
Hierarchical_Grouping()
myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
```

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

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

  - 登入網路上的 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器。
  - 擷取用來識別 Crystal Reports Server 或 BusinessObjects Enterprise 中所存放之報表的 CUID。
  - 根據 CUID 呼叫報表。
  1. 將下列組件參考加入至專案:
1.   CrystalDecisions.Enterprise.Framework
2.   CrystalDecisions.Enterprise.InfoStore
  1. 在程式碼後置頁面頂端,加上 "Imports" (Visual Basic) 或 "using" (C#) 陳述式,匯入 CrystalDecisions.Enterprise 命名空間。
``` vb
Imports CrystalDecisions.Enterprise
```

``` csharp
using CrystalDecisions.Enterprise;
```

您現在即可開始加入程式碼,將內嵌報表重新導向至 Crystal Reports Server 或 BusinessObjects Enterprise。
  1. 在產生 hierarchicalGroupingReport 執行個體的程式行底下宣告 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)、密碼 (空白)、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 擷取階層群組報表的 CUID。
  1. 輸入以下查詢字串,向 Crystal Reports Server 或 BusinessObjects Enterprise 查詢報表的 CUID。
``` 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. 透過 InfoObject 的 SI_CUID 屬性,將報表的 CUID 字串擷取到 reportCUID 字串變數中。
``` vb
Dim reportCUID As String = myInfoObject.CUID
```

``` csharp
string reportCUID = infoObject.CUID;
```
  1. 將內嵌報表的 EnterpriseSession 屬性設定為 EnterpriseSession 執行個體。
``` vb
hierarchicalGroupingReport.EnterpriseSession = myEnterpriseSession
```

``` csharp
hierarchicalGroupingReport.EnterpriseSession = enterpriseSession;
```
  1. 將內嵌報表的 FileName 屬性設定為 reportCUID 變數,而且加上 cecuid:/// 通訊協定做為前置詞。
<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>使用的是三條斜線,而非雙重斜線。這意味著主機名稱為 Null。</p></td>
</tr>
</tbody>
</table>

``` vb
hierarchicalGroupingReport.FileName = "cecuid:///" & reportCUID
```

``` csharp
hierarchicalGroupingReport.FileName = "cecuid:///" + reportCUID;
```
  1. 若要檢視報表,請建置並執行專案。
報表現在會從 Crystal Reports Server 或 BusinessObjects Enterprise 載入,再從 Managed RAS 伺服器中提供。

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

請參閱