使用 ReportDocument.Load() 方法繫結至 Unmanaged RAS 伺服器
附註 |
---|
本頁說明的是在 Crystal Reports for Visual Studio 中沒有提供,但在升級版本中提供的功能。如需關於 Crystal Reports for Visual Studio 的詳細資訊,請參閱「何謂 Crystal Reports for Visual Studio?」。如需關於升級版本的詳細資訊,請參閱「升級選項」。 |
物件模型
這個報表繫結案例使用 ReportClientDocument (請參閱 「與 ReportClientDocument 物件模型 (RAS) 繫結的報表」)。
報表位置
報表內嵌於專案中。報表在執行階段會經由網路載入至指示的報表應用程式伺服器「報表應用程式伺服器 (RAS)」。
說明
原本在 Crystal Reports for Visual Studio 中使用內嵌報表和 ReportDocument 物件模型的 Visual Studio 專案,如今可以輕易移植到 Unmanaged RAS 伺服器。
在這個案例中,您透過網路載入內嵌的報表,然後載入至指示的 Unmanaged 報表應用程式伺服器 (RAS)。如需程式碼範例,請參閱以下<實作>一節,加入兩行會執行下列作業的程式碼:
- 將 RAS 伺服器名稱指派給 ReportDocument.ReportAppServer 屬性。
- 呼叫 ReportDocument.Load() 方法。
雖然內嵌的報表是針對 ReportDocument 物件模型所撰寫,還是可以在 Crystal Reports Developer 中直接將內嵌的報表繫結至使用 ReportClientDocument 物件模型的 RAS 伺服器。這是因為在 Crystal Reports Developer 中,已經將 ReportDocument 物件模型改寫成會處理 ReportClientDocument 物件模型的 Proxy 層。如需詳細資訊,請參閱「ReportClientDocument 物件模型 (RAS)」。
基礎 ReportClientDocument 物件模型可以透過 ReportDocument.ReportClientDocument 屬性直接進行存取。這樣就可以讓您在執行階段以 ReportClientDocument 物件模型修改報表。
優點
- 能夠維護所有可與使用 ReportDocument 物件模型報表互動的原始程式碼,而同時又能提供基礎 ReportClientDocument 物件模型的完整存取,只需透過 ReportDocument.ReportClientDocument 屬性執行。
附註 ReportClientDocument 物件模型允許您以程式碼方式建立或修改,並將變更儲存至報表定義檔案。如需詳細資訊,請參閱<架構>中的「ReportClientDocument 物件模型 (RAS)」。
- 因報表應用程式伺服器 (RAS) 報表引擎的卓越效能而產生顯著的效能增益。如需詳細資訊,請參閱「比較所有 Business Objects 報表解決方案之間的架構」。
缺點
- 需要小幅增加程式碼。每次將報表繫結至 CrystalReportViewer 控制項 (採用 ReportDocument 方式) 時,都必須加入兩行程式碼,請參閱下面<實作>一節。
- 升級至 RAS 伺服器即可大幅增加報表效能。
透過網路將內嵌的報表載入至指示的 Unmanaged RAS 伺服器
- 必須安裝「報表應用程式伺服器 (RAS)」 10,並確認其正在運作。
- 在網路上尋找並抄下 Unmanaged RAS 伺服器的名稱。這個範例中使用的伺服器名稱為「RAS01」。
這個程序只能與「專案設定」一節中建立的專案搭配使用。「專案設定」包含特定命名空間參考以及本程序所需的程式碼組態;您必須具備這個組態,否則將無法完成此程序。因此,在您開始本程序前,必須先遵循「專案設定」中的步驟進行。
在 ConfigureCrystalReports() 方法 (「專案設定」 中所建立) 內,會有下列報表繫結程式碼:
在這兩行程式碼中間,必須加入兩行新的程式碼,用以識別網路上的 Unmanaged RAS 伺服器,並將此內嵌報表載入到 RAS 伺服器,最後才將報表繫結至 CrystalReportViewer 控制項。
hierarchicalGroupingReport = New Hierarchical_Grouping() myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
hierarchicalGroupingReport = new Hierarchical_Grouping(); crystalReportViewer.ReportSource = hierarchicalGroupingReport;
在產生 hierarchicalGroupingReport 執行個體之後,將 RAS 伺服器名稱輸入 ReportAppServer 屬性 (hierarchicalGroupingReport 變數)。
hierarchicalGroupingReport.ReportAppServer = "RAS01"
hierarchicalGroupingReport.ReportAppServer = "RAS01";
呼叫 ReportDocument.Load()。
[「專案設定」](ms227453\(v=vs.90\).md)中的報表繫結程式碼現在要放在這行程式碼之後。
``` vb
hierarchicalGroupingReport.Load("rassdk://C:\report.rpt",
"RAS01")
```
``` csharp
hierarchicalGroupingReport.Load(@"rassdk://C:\report.rpt",
"RAS01");
```
- 編譯並偵錯專案。
報表現在則透過網路,從專案載入至 Unmanaged 報表應用程式伺服器 (RAS)。
從 ReportDocument 物件模型內部存取 ReportClientDocument 物件模型
從之前的程序退出偵錯模式。
加入下列組件做為專案的參考。
- CrystalDecisions.ReportAppServer.ClientDoc
- CrystalDecisions.ReportAppServer.Controllers
- CrystalDecisions.ReportAppServer.DataDefModel
在類別上方輸入三行 "Imports" [Visual Basic] 或 "using" [C#] 陳述式。
Imports CrystalDecisions.ReportAppServer.ClientDoc Imports CrystalDecisions.ReportAppServer.Controllers Imports CrystalDecisions.ReportAppServer.DataDefModel
using CrystalDecisions.ReportAppServer.ClientDoc; using CrystalDecisions.ReportAppServer.DataDefModel; using CrystalDecisions.ReportAppServer.Controllers;
在 ConfigureCrystalReports() 方法內,於呼叫 Load() 方法和將報表繫結至控制項的兩行程式碼之間,輸入呼叫名稱為 ModifyReport 的新私用 Helper 方法。
ModifyReport()
ModifyReport();
像下面範例一樣,建立 ModifyReport() 私用 Helper 方法。本程式碼的用途在示範如何存取 ReportClientDocument 物件模型 (在 ReportDocument 物件模型內)。本程式碼會從報表上顯示的欄位中移除第一個可用欄位。
附註 如果在報表結果欄位集合中找不到資料庫資料表欄位,應用程式便會擲回例外狀況。
Private Sub ModifyReport() Dim myReportClientDocument As ISCDReportClientDocument = _ hierarchicalGroupingReport.ReportClientDocument Dim myTables As Tables = _ myReportClientDocument.DatabaseController.Database.Tables Dim myTable As CrystalDecisions.ReportAppServer.DataDefModel.Table myTable = CType(myTables(0), CrystalDecisions.ReportAppServer.DataDefModel.Table) Dim myFields As Fields = myTable.DataFields Dim myField As ISCRField For Each myField In myFields Dim myResultFieldController As ResultFieldController = _ myReportClientDocument.DataDefController.ResultFieldController Try myResultFieldController.Remove(myField) Exit For Catch End Try Next End Sub
private void ModifyReport() { ISCDReportClientDocument reportClientDocument = hierarchicalGroupingReport.ReportClientDocument; Tables tables = reportClientDocument.DatabaseController.Database.Tables; CrystalDecisions.ReportAppServer.DataDefModel.Table table = (CrystalDecisions.ReportAppServer.DataDefModel.Table)tables[0]; Fields fields = table.DataFields; for (int i = 0; i < fields.Count; i++) { ISCRField field = fields[i]; ResultFieldController resultFieldController = reportClientDocument.DataDefController.ResultFieldController; try { resultFieldController.Remove(field); break; } catch { } } }
附註 對基礎物件模型 ReportClientDocument 從事程式設計時執行的各項作業,邏輯上都是發生在內層的 ReportDocument 執行個體 (實際繫結至 CrystalReportViewer 控制項的物件)。在此程式碼範例中,以上示範的欄位移除動作僅發生於執行階段。它並不會儲存回報表定義檔案。
若要檢視報表,請建置並執行專案。