Unsere Stand-Alone Server Reporting-Lösung combit Report Server (in der List & Label Enterprise Edition enthalten) bietet bereits seit einigen Jahren eine einfache Möglichkeit zur Integration in Ihre eigenen Anwendungen über die REST API. Die neue Assembly combit.ReportServer.ClientApi, die mit der Version 23 ausgeliefert wird, ermöglicht es Ihnen, viele (neue) Funktionen der Report Server API mit nur wenigen einfachen Zeilen C#/VB.NET Code zu nutzen. Die gesamte HTTP-Kommunikation wird intern verwaltet, so dass die Verwendung der REST-API so einfach wie mit jeder regulären. NET-Bibliothek wurde. Die Funktionen umfassen den Export von Berichten, das Hochladen neuer Berichtsprojekte, das Anlegen neuer Datenquellen, die Verwaltung des Servers und vieles mehr.
Die Beschreibung aller Funktionen der neuen Assembly würde weit über den Umfang dieses einleitenden Blogposts hinausgehen, also konzentrieren wir uns auf ein winziges Code-Beispiel, um Ihnen zu zeigen, wie einfach es jetzt ist, einen Bericht vom Server zu erhalten. Beachten Sie, dass fast alle Funktionen in dem umfangreichen Beispielprojekt, das mit der neuen Assembly mitgeliefert wird, demonstriert werden. Stellen Sie sich eine App vor, die Sie vielleicht schon mit List & Label entwickelt haben: Wir wollen dem Anwender eine Liste aller verfügbaren Berichte präsentieren und den ausgewählten Bericht als PDF-Datei speichern. Mit dem combit Report Server werden die Projektdateien und Datenquellen auf dem zentralen Server verwaltet, so dass zunächst eine Liste der verfügbaren Projekte geladen werden muss:
Bevor wir das tun können, müssen wir uns natürlich authentifizieren und mit dem Report Server verbinden:
var options = new ClientOptions() { Authentication = new ApiTokenAuthentication("ApiClient123", "XXXXXXXX") }; var serverUrl = "http://localhost/combitReportServer"; var reportServer = await ReportServer.ConnectAsync(serverUrl, options);
Nachdem wir die Verbindung zum Server hergestellt haben, können wir den Server nach einer Liste aller verfügbaren Berichtsvorlagen fragen, um die ListBox zu füllen:
var reportTemplates = await reportServer.ReportTemplates.GetAllAsync(); foreach (ReportTemplate report in reportTemplates) { listBox.Items.Add(report); }
Sobald der Benutzer auf den Button klickt, können wir den Export vorbereiten (z. B. einige Berichtsparameter definieren) und die PDF-Datei vom Server exportieren lassen.
var selectedReport = (ReportTemplate)listBox.SelectedItem; // Prepare the export on the client var preparedExport = reportServer.Exporter.PrepareExport(selectedReport.Id); preparedExport.ReportParameters.Add("Year", 2017); // Send the export job to the server var exportResult = await preparedExport.ExportAsync();
Die einzige verbleibende Aufgabe besteht darin, die erzeugte PDF-Datei auf den Client herunterzuladen.
await exportResult.DownloadFilesAsync(@"C:\Reports");
Das war einfach:
Jetzt noch das Sahnehäubchen: Die combit.ReportServer.ClientApi Assembly ist
- plattformunabhängig,
- kompatibel mit .NET Classic und .NET Core (gebuildet gegen .NET Standard 1.3),
- unterstützt die Verwendung von async/await und
- kommt mit einem umfangreichen C#-Beispielprojekt und einer umfangreichen Dokumentation.
Wenn Sie bestehende List & Label Projekte Ihrer eigenen Anwendung samt deren Datenquellen automatisch auf den Report Server migrieren möchten, damit die Berichte von allen gängigen Betriebssystemen, Browsern und Geräten aus zugänglich sind, haben wir eine zweite neue Assembly für Sie:
combit.ListLabel.ReportServerIntegration.
Diese Bibliothek bietet Hilfsmethoden für das Hochladen von List & Label Projekten und deren Abhängigkeiten (z. B. Bilder, Drilldown-Projekte) und das Erstellen von Datenquellen auf dem Server mit den Ihnen bekannten Datenprovidern aus List & Label. Auch das erwähnte Beispielprojekt demonstriert diese Features.
Dazu habe ich ein Frage. Die Vorlagen liegen ja auf dem Server. Ich wähle ein Vorlage aus und über den Server wird mir ein Report erzeugt. Diese kann ich auf dem Client abspeichern z.B. als PDF. Soweit so gut. Wie sieht es aus, wenn ich eine Serverseitige Vorlage ändern oder eine neue Vorlage vom Client aus über den Server erstellen oder ändern will? Ist dies überhaupt möglich, wenn ja wie geht man da vor?
Die Vorlage würde in diesem Fall (z.B. im Desginer oder per Objektmodell) auf dem Client erzeugt und dann über die Hilfsklasse RepositoryImportUtil auf den Server geladen. Das Prinzip habe ich letztens auf Stackoverflow beschrieben: https://stackoverflow.com/questions/49299748/repositoryitem-from-listlabel-lst-file/49300709#49300709.
Beispiele für das Ändern und Importieren finden Sie auch im ClientApiSample (unter den .NET-Beispielen im ReportServer-Unterverzeichnis).