Binden an unverwalteten RAS mit der ReportDocument.Load()-Methode

NoteAnmerkung

Auf dieser Seite werden Funktionen beschrieben, die nicht in Crystal Reports für Visual Studio, jedoch in einer der aktualisierten Versionen verfügbar sind. Weitere Informationen zu Crystal Reports für Visual Studio finden Sie unter Was ist Crystal Reports für Visual Studio? Weitere Informationen zu aktualisierten Versionen finden Sie unter Aktualisierungsoptionen.

Objektmodell

In diesem Berichtbindungsszenario wird ReportClientDocument verwendet (siehe Berichtbindung mit ReportClientDocument-Objektmodell (RAS)).

Ort des Berichts

Berichte wurden in das Projekt eingebettet. Zur Laufzeit wird der Bericht über das Netzwerk in einen angegebenen Report Application Server (RAS) geladen.

Beschreibung

Visual Studio-Projekte, die eingebettete Berichte und das ReportDocument-Objektmodell in Crystal Reports für Visual Studio verwenden, können jetzt problemlos auf einen unverwalteten RAS-Server portiert werden.

In diesem Szenario laden Sie einen eingebetteten Bericht über das Netzwerk in einen angegebenen unverwalteten Report Application Server (RAS). Ein Codebeispiel finden Sie im folgenden Abschnitt "Implementierung", in dem zwei Codezeilen für folgende Zwecke hinzugefügt werden:

  • Weisen Sie der ReportDocument.ReportAppServer-Eigenschaft den Namen des RAS-Servers zu.
  • Rufen Sie die ReportDocument.Load()-Methode auf.

Obwohl eingebettete Berichte für das ReportDocument-Objektmodell geschrieben werden, können Sie sie in Crystal Reports Developer direkt an den RAS-Server binden, der das ReportClientDocument-Objektmodell verwendet. Dies wird dadurch ermöglicht, dass das ReportDocument-Objektmodell in Crystal Reports Developer als Proxyschicht für das ReportClientDocument-Objektmodell umgeschrieben wurde. Weitere Informationen finden Sie unter ReportClientDocument-Objektmodell (RAS).

Auf das zugrundeliegende ReportClientDocument-Objektmodell kann direkt über die ReportDocument.ReportClientDocument-Eigenschaft zugegriffen werden. Dies ermöglicht Ihnen zur Laufzeit das Ändern des Berichts mit Hilfe des ReportClientDocument-Objektmodells.

Pro

  • Sämtlicher ursprünglicher Code zur Interaktion mit Berichten, die das ReportDocument-Objektmodell verwenden, wird beibehalten. Gleichzeitig kann über die ReportDocument.ReportClientDocument-Eigenschaft uneingeschränkt auf das zugrunde liegende ReportClientDocument-Objektmodell zugegriffen werden.
    NoteAnmerkung

    Das ReportClientDocument-Objektmodell ermöglicht es Ihnen, die Berichtdefinitionsdatei programmgesteuert zu erstellen, zu bearbeiten und daran vorgenommene Änderungen zu speichern. Weitere Informationen hierzu finden Sie unter ReportClientDocumentReportClientDocument-Objektmodell (RAS) in "Architektur".

  • Signifikanter Leistungsgewinn aufgrund der überlegenen Leistung der Report Engine im Report Application Server (RAS). Weitere Informationen finden Sie unter Vergleichen von Architekturen zwischen Business Objects-Berichterstellungslösungen.

Contra

  • Geringfügige Codeergänzungen. Jedes Mal, wenn ein Bericht mit Hilfe von ReportDocument an das CrystalReportViewer-Steuerelement gebunden wird, müssen zwei Codezeilen hinzugefügt werden. Siehe dazu den Abschnitt "Implementierung" unten.
  • Durch die Aktualisierung auf einen RAS-Server wird die Berichtleistung deutlich gesteigert.

So laden Sie einen eingebetteten Bericht über das Netzwerk auf einen bestimmten unverwalteten RAS-Server

  • Der Report Application Server (RAS) 10 muss installiert und funktionsbereit sein.
  • Suchen und notieren Sie den Namen eines unverwalteten RAS-Servers im Netzwerk. In diesem Beispiel lautet der Servername "RAS01".

Diese Prozedur funktioniert nur bei Projekten, die in Projekt-Setup erstellt wurden. Projekt-Setup enthält spezifische Namespaceverweise und Codekonfigurationen, die für diese Prozedur erforderlich sind. Die Prozedur kann ohne diese Konfiguration nicht ausgeführt werden. Führen Sie deshalb vor Beginn dieser Arbeitsschritte die Schritte unter Projekt-Setup aus.

  1. Die (im ConfigureCrystalReports() erstellte) Projekt-Setup-Methode enthält folgenden Berichtbindungscode:

    Zwischen diesen beiden Codezeilen müssen zwei neue Codezeilen hinzugefügt werden, durch die ein unverwalteter RAS-Server im Netzwerk zunächst lokalisiert und der eingebettete Bericht dann auf diesen RAS-Server geladen wird. Diese Schritte finden vor dem Binden des Berichts an das CrystalReportViewer-Steuerelement statt.

    hierarchicalGroupingReport = New Hierarchical_Grouping()
    myCrystalReportViewer.ReportSource = hierarchicalGroupingReport
    
    hierarchicalGroupingReport = new Hierarchical_Grouping();
    crystalReportViewer.ReportSource = hierarchicalGroupingReport;
    
  2. Nach der Instantiierung von hierarchicalGroupingReport geben Sie den Namen des RAS-Servers in die ReportAppServer-Eigenschaft der hierarchicalGroupingReport-Variablen ein.

    hierarchicalGroupingReport.ReportAppServer = "RAS01"
    
    hierarchicalGroupingReport.ReportAppServer = "RAS01";
    
  3. Rufen Sie ReportDocument.Load() auf.

Der Berichtbindungscode im [Projekt-Setup](https://msdn.microsoft.com/de-de/library/vs%7ccrystlmn%7c%7e%5chtml%5ctopic168.htm\(v=VS.90\)) führt jetzt diese Codezeile aus.

``` vb
hierarchicalGroupingReport.Load("rassdk://C:\report.rpt",
"RAS01")
```

``` csharp
hierarchicalGroupingReport.Load(@"rassdk://C:\report.rpt",
"RAS01");
```
  1. Kompilieren und debuggen Sie das Projekt.
Der Bericht wird jetzt über das Netzwerk aus dem Projekt auf den unverwalteten Report Application Server (RAS) geladen.

So greifen Sie vom ReportDocument-Objektmodell auf das ReportClientDocument-Objektmodell zu

  1. Beenden Sie den Debugmodus der vorherigen Prozedur.

  2. Fügen Sie dem Projekt folgende Assemblys als Verweise hinzu:

    • CrystalDecisions.ReportAppServer.ClientDoc
    • CrystalDecisions.ReportAppServer.Controllers
    • CrystalDecisions.ReportAppServer.DataDefModel
  3. Geben Sie am Anfang der Klasse drei Anweisungen "Imports" [Visual Basic] oder "using" [C#] ein.

    Imports CrystalDecisions.ReportAppServer.ClientDoc
    Imports CrystalDecisions.ReportAppServer.Controllers
    Imports CrystalDecisions.ReportAppServer.DataDefModel
    
    using CrystalDecisions.ReportAppServer.ClientDoc;
    using CrystalDecisions.ReportAppServer.DataDefModel;
    using CrystalDecisions.ReportAppServer.Controllers;
    
  4. Geben Sie innerhalb der ConfigureCrystalReports()-Methode zwischen der Codezeile zum Aufrufen der Load()-Methode und der Codezeile zum Binden des Berichts an das Steuerelement einen Aufruf einer neuen privaten Hilfsmethode mit dem Namen ModifyReport ein.

    ModifyReport()
    
    ModifyReport();
    
  5. Erstellen Sie wie im folgenden Beispiel die private ModifyReport()-Hilfsmethode. Der Zweck dieses Codes besteht darin, den Zugriff auf das ReportClientDocument-Objektmodell innerhalb des ReportDocument-Objektmodells zu veranschaulichen. Durch diesen Code wird das erste verfügbare Feld aus den im Bericht angezeigten Feldern entfernt.

    NoteAnmerkung

    Wenn das Datenbank-Tabellenfeld in der Ergebnisfeldauflistung des Berichts nicht gefunden wird, löst die Anwendung eine Ausnahme aus.

    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
    {
    }
    }
    }
    
    NoteAnmerkung

    Alles, was für das zugrunde liegende ReportClientDocument-Objektmodell programmiert wurde, findet logisch in der einschließenden ReportDocument-Instanz statt, die an das CrystalReportViewer-Steuerelement gebunden ist. In diesem Codebeispiel findet das Entfernen von Feldern nur zur Laufzeit statt. Es wird nicht in die Berichtdefinitionsdatei zurückgespeichert.

  6. Um den Bericht anzeigen zu lassen, erstellen Sie Ihr Projekt und führen es aus.

Siehe auch