使用 ReportDocument.Load() 方法繫結至 Managed RAS 伺服器
附註 |
---|
本頁說明的是在 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)」)。
附註 |
---|
因為報表最終會從遠端伺服器中顯示,這個報表繫結案例也與非內嵌的報表 (如繫結至已載入「繫結至已載入 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)」。
附註 |
---|
InfoObject 執行個體參考了來自 Managed RAS 伺服器的報表。Managed RAS 伺服器上的報表始終都會顯示,即使這個報表是不同的版本,或是具有和內嵌報表不同的名稱。 |
您可以透過 ReportDocument.ReportClientDocument 屬性直接存取基礎 ReportClientDocument 物件模型,進而在執行階段使用 ReportClientDocument 物件模型修改報表。
優點
- 便利的可攜性:保有任何與 ReportDocument 物件模型報表互動的原始程式碼,而仍能透過 ReportDocument.ReportClientDocument 屬性完整存取基礎 ReportClientDocument 物件模型。
附註 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 組件),並確認其正在運作。
附註 如果開發電腦上已經安裝了 Crystal Reports Server 或 BusinessObjects Enterprise,SDK 即包含在該安裝中。
這個程序只能與「專案設定」一節中建立的專案搭配使用。「專案設定」包含特定命名空間參考以及本程序所需的程式碼組態;您必須具備這個組態,否則將無法完成此程序。因此,在您開始本程序前,必須先遵循「專案設定」中的步驟進行。
附註 |
---|
RAS 伺服器只適用於 Web 專案。 |
- 尋找並抄下 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>
- 您在「專案設定」中所建立的 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. CrystalDecisions.Enterprise.Framework
2. CrystalDecisions.Enterprise.InfoStore
- 在程式碼後置頁面頂端,加上 "Imports" (Visual Basic) 或 "using" (C#) 陳述式,匯入 CrystalDecisions.Enterprise 命名空間。
您現在即可開始加入程式碼,將內嵌報表重新導向至 Crystal Reports Server 或 BusinessObjects Enterprise。
``` vb
Imports CrystalDecisions.Enterprise
```
``` csharp
using CrystalDecisions.Enterprise;
```
- 在產生 hierarchicalGroupingReport 執行個體的程式行之後,接著宣告 serverName 字串,並且設定為 Crystal Reports Server 或 BusinessObjects Enterprise 伺服器的名稱。
``` vb
Dim serverName As String = "BOE01"
```
``` csharp
string serverName = "BOE01";
```
宣告並產生 SessionMgr 類別的執行個體。
Dim mySessionMgr As SessionMgr = New SessionMgr()
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 擷取階層群組報表。
- 輸入以下查詢字串,向 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'";
```
- 將查詢字串傳遞給 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 載入內嵌報表的重複複本。
- 呼叫內嵌報表的 Load() 方法,然後將 InfoObject 及 EnterpriseSession 目前的執行個體傳遞給 Load() 方法。
``` vb
hierarchicalGroupingReport.Load(myInfoObject, myEnterpriseSession)
```
``` csharp
hierarchicalGroupingReport.Load(infoObject, enterpriseSession);
```
若要檢視報表,請建置並執行專案。
報表會從 Crystal Reports Server 或 BusinessObjects Enterprise 載入,再從 Crystal Reports Server 或 BusinessObjects Enterprise 內的報表應用程式伺服器 (RAS) 提供。
若要從 ReportDocument 物件模型內部存取 ReportClientDocument 物件模型,請參閱「使用 ReportDocument.Load() 方法繫結至 Unmanaged RAS 伺服器」 中的<實作>一節。