使用 ReportDocument.FileName 屬性繫結至 Managed RAS 伺服器
附註 |
---|
本頁說明的是在 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 儲存機制中。
附註 |
---|
因為報表最終會從遠端伺服器中顯示,這個報表繫結案例也與非內嵌的報表 (如繫結至已載入「繫結至已載入 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)」。
附註 |
---|
FileName 屬性會參考來自 Managed RAS 伺服器中的報表。Managed RAS 伺服器上的報表始終都會顯示,即使這個報表是不同的版本,或是具有和內嵌報表不同的名稱。 |
基礎 ReportClientDocument 物件模型可以透過 ReportDocument.ReportClientDocument 屬性直接進行存取,並允許您在執行階段使用 ReportClientDocument 物件模型修改報表。
優點
- 便利的可攜性:維護所有會與 ReportDocument 物件模型報表互動的原始程式碼,而仍能透過 ReportDocument.ReportClientDocument 屬性提供基礎 ReportClientDocument 物件模型的完整存取。
附註 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 組件),並確認其正在運作。
附註 如果開發電腦上已經安裝了 Crystal Reports Server 或 BusinessObjects Enterprise,SDK 即包含在該安裝中。
這個程序只能與「專案設定」一節中建立的專案搭配使用。「專案設定」包含特定命名空間參考以及本程序所需的程式碼組態;您必須具備這個組態,否則將無法完成此程序。因此,在您開始本程序前,必須先遵循「專案設定」中的步驟進行。
- 尋找並抄下 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器名稱。這個範例所使用的伺服器名稱為「BOE01」。
1. 若要尋找伺服器名稱,以滑鼠右鍵按一下 \[我的電腦\] 圖示,然後選取 \[內容\]。
2. 在 \[系統內容\] 對話方塊上按一下 \[網路識別\] 索引標籤。
3. 電腦名稱會出現在 \[完整電腦名稱\] 欄位中。
- 使用發行精靈,將 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)。
- 您在「專案設定」中所建立的 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. CrystalDecisions.Enterprise.Framework
2. CrystalDecisions.Enterprise.InfoStore
- 在程式碼後置頁面頂端,加上 "Imports" (Visual Basic) 或 "using" (C#) 陳述式,匯入 CrystalDecisions.Enterprise 命名空間。
``` vb
Imports CrystalDecisions.Enterprise
```
``` csharp
using CrystalDecisions.Enterprise;
```
您現在即可開始加入程式碼,將內嵌報表重新導向至 Crystal Reports Server 或 BusinessObjects Enterprise。
- 在產生 hierarchicalGroupingReport 執行個體的程式行底下宣告 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)、密碼 (空白)、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);
```
您現在即可開始從 Crystal Reports Server 或 BusinessObjects Enterprise 擷取階層群組報表的 CUID。
- 輸入以下查詢字串,向 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'";
```
- 將查詢字串傳遞給 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\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 載入內嵌報表的重複複本。
- 透過 InfoObject 的 SI_CUID 屬性,將報表的 CUID 字串擷取到 reportCUID 字串變數中。
``` vb
Dim reportCUID As String = myInfoObject.CUID
```
``` csharp
string reportCUID = infoObject.CUID;
```
- 將內嵌報表的 EnterpriseSession 屬性設定為 EnterpriseSession 執行個體。
``` vb
hierarchicalGroupingReport.EnterpriseSession = myEnterpriseSession
```
``` csharp
hierarchicalGroupingReport.EnterpriseSession = enterpriseSession;
```
- 將內嵌報表的 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;
```
- 若要檢視報表,請建置並執行專案。
報表現在會從 Crystal Reports Server 或 BusinessObjects Enterprise 載入,再從 Managed RAS 伺服器中提供。
若要從 ReportDocument 物件模型內部存取 ReportClientDocument 物件模型,請參閱「使用 ReportDocument.Load() 方法繫結至 Unmanaged RAS 伺服器」中的<實作>一節。