SONDERDRUCK AUS COMPUTERWORLD NR. 3/2006 VOM 20. JANUAR DEVELOPERWORLD Serverbasierte Berichterstattung Mit den Reporting Services, der serverseitigen Reporting-Lösung des SQL Servers, lassen sich flexible Lösungen für das Berichtswesen im Unternehmen aufbauen. VON HARALD ALFERI* M it Crystal Reports bot Microsoft in Visual Studio bislang eine Lösung für Windows-basierte ReportingAnwendungen. Spätestens nach der Übernahme von Crystal durch Business Objects im Jahre 2003, der Ausrichtung von Microsoft in Richtung Business Intelligence und dem wachsenden Bedarf von Enterprise-Reporting-Lösungen schien für die Redmonder die Zeit reif zu sein für eine eigene, auf Unternehmensanforderungen ausgerichtete Reporting-Lösung. Im Januar 2004 lancierte der Softwaremulti mit Reporting Services als Add-on zum SQL Server 2000 dann prompt eine eigene Anwendung für die Abwicklung von Berichten. Mit dem Release von SQL Server 2005 im November letzten Jahres gibt es nun bereits die zweite Fassung der Reporting-Dienste, welche eine ganze Palette von interessanten Neuerungen bereithält. Server-basiertes Reporting Die grosse Stärke der Reporting Services (RS) ist der serverbasierte Ansatz: Reports werden serverseitig mit Daten versorgt, aufWEITERE INFORMATIONEN Neuerungen der SQL Server 2005 Reporting Services Entwickler – Expression Editor im Report Designer – Custom Report Items – Verbessertes Dundas-Chart-Control – Analysis Services Query Designer – .NET Report Viewer Controls (ASP.NET 2.0 und WinForms 2.0) – Integration mit SQL Server Management Studio – Report Builder Model Designer Anwender – Report Builder (Ad-hoc-Report-Designer für Endanwender) – Multivalued Parameters – Sortierung für Enduser – Direktes Client-Printing 50 WWW.COMPUTERWORLD.CH / 20. JANUAR 2006 bereitet und das Ergebnis im gewünschten Format (HTML, PDF, TIFF, Excel, XML, etc.) an den Anwender weitergereicht. Das sorgt einerseits für eine schnelle Reporterstellung und erspart andererseits das Deployment eines Client-Tools. Die zweite Stärke ist das offene Format in dem ein Report definiert wird. So lassen sich Berichte dank der XMLbasierenden Report Definition Language (RDL) [1] nicht nur mit dem mitgelieferten Report Designer, sondern auch mit Werkzeugen von Drittanbietern erstellen. Reports können nach dem Pull-Prinzip (On-Demand) abgerufen oder per Abonnement im Push-Verfahren per E-Mail oder File-Share ausgeliefert werden. Die Subscription-Reports basieren auf so genannten Snapshots der ihnen zugrunde liegenden Daten und sind somit nur noch eingeschränkt parametrisierbar. Dafür geeignet sind üblicherweise Informationen, die einem breiten Publikum regelmässig zugestellt werden. mindestens fünf Komponenten erforderlich: Datenquellen, Report-Designer, Report-Management-Tool, Report-Prozessor und Report-Betrachter (siehe auch Diagramm «Die Reporting Services Architektur»). Als Datenquellen können SQL-Server- und Oracle-Datenbanken, AnalysisServices-Würfel, OLE-DB-, ODBC- und XML-Datenquellen, sowie neuerdings das ReportServer-Modell verwendet werden. Als Designer-Tool gibt es den Reporting Services Designer für Visual Studio (Screen 1) mit diversen Wizards zur einfachen Reporterstellung. Da die Reports auf dem offenen XML-basierten RDL-Format beruhen, lassen sich diese auch mit Werkzeugen von Drittanbietern erstellen und über das WebService-Interface der Reporting Services auf den Server ausliefern. Für die Verwaltung und Ausführung der Berichte steht der Report Manager (Screen 2) zur Verfügung. Dabei handelt es sich um eine Web-Anwendung, die auf ASP.NET und den Management-Web-Services der Reporting Services Reporting Services basiert. Für die eigentliche Verarbeitung der Berichte ist der Report-Processor, das Serverseitiges Reporting unterstützt den eigentliche Herzstück des Report-Servers, Design-Ansatz «Separation of Concerns»: zuständig. Für On-Demand-Reports holt Jede Komponente konzentriert sich auf sich der Report-Prozessor die in der Reporihre Stärke mit klar abgegrenzten Aufgating-Service-Datenbank (SQL Server) abbenbereichen. Nach diesem Grundsatz sind gespeicherte RDL-Definition, führt die Anfrage gegen die Datenquelle durch und kombiniert das Resultat in ein Zwischenformat. Dieses kann, abhängig von der Art und Security des Reports, im Cache oder als Report-Snapshot abgelegt werden. Mit Hilfe von so genannten Rendering Extensions wird der Bericht im gewünschten Format gerendert und an den User Screen 1: Berichte lassen sich mit dem Report Designer direkt in Visual Studio 2005 kreieren. weitergereicht. Als Re- Reporting Services port-Betrachter kommen der Report Manager oder die Reporting-Services-Web-Parts für SharePoint in Frage. Ab der 2005er-Version steht je ein ReportViewer-Control für WinForms 2.0 und ASP.NET 2.0 zur Verfügung, welches die Integration von Berichten in eigene .NET-Anwendungen erleichtert. Da Report-Prozessor und -Betrachter nicht auf derselben Maschine laufen müssen, ist ein Interface notwendig, um die Berichte vom Server zum Client zu übertragen. Diese Aufgabe wird von den ReportServer Web Service Endpoints wahrgenommen (Screen 3). Erweiterungsmöglichkeiten Die Reporting Services bieten eine Reihe von Ansatzpunkten für individuelle Erweiterungen. So gibt es beispielsweise eine Delivery Extension, mit der sich Subscription-Reports direkt in einer SharePoint Document Library ablegen lassen. Oder es lassen sich eigene Front-Ends erstellen, die mit Hilfe der Web Service Endpoints, die Reporting-Funktionen des Servers nutzen. Das folgende Codebeispiel zeigt, wie sich mit Hilfe der RS Web Services ein Bericht («Product Line Sales» im Ordner «Sample») als PDF-Dokument rendern lässt. Zunächst wird der Web Service initialisiert und der Report mit Hilfe der Methode «Render» als PDF-Byte-Array von den Reporting Services zurückgeliefert. Zuletzt wird das Byte-Array als PDF-Datei gespeichert (Listing 1). Praxiserfahrungen Die grössten Problembereiche sind erfahrungsgemäss der Report-Designer und das Seitenumbruchverhalten beim PDF-Rendering. Man sollte daher peinlichst genau auf die Masse von Body und Seite achten. Oft hilft das Einfärben von Objekten zum Auffinden der eigentlichen Problemstellen. Im Report Designer sollte man insbesondere die folgenden Dinge beachten: Die Reporting Services sind case-sensitiv; dies gilt insbesondere für die Namen der Datenfelder. Den Query-Designer sollte man nicht überbeanspruchen. Stattdessen empfiehlt sich für komplexe Queries ein passendes Objekt in der Datenquelle zu implementieren (Stichwort: Kapselung). Die Code-Ansicht hilft an vielen Stellen weiter, beispielsweise zum Kopieren des Style-Tags als Ersatz für das Pinseltool. Filter sollte man nur gezielt und nicht an zu vielen Stellen einset- Screen 2: Berichte werden mit dem auf ASP.NET-basierenden Report Manager verwaltet. zen, sonst sind diese später nur schwer auffindbar. Fazit Serverseitiges Reporting bietet neben einer hohen Geschwindigkeit bei der Erstellung von Reports, zusätzliche Skalierungs- und Security-Möglichkeiten, die clientseitiges Reporting nicht bieten kann. Den Preis, den man dafür zahlen muss, ist die Bereitschaft sich in die scheinbar komplexen Komponenten von Reporting Services einzuarbeiten – doch der Aufwand lohnt sich. ■ * Harald Alferi ist Senior Consultant bei Trivadis mit Schwerpunkt Microsoft Server Technologien. WEITERE INFORMATIONEN Verweise und Links [1] Report Definition Language Specification http://www.microsoft.com/sql/technologies/reporting/rdlspec.mspx [2] Dundas Chart for Reporting Services http://www.dundasreporting.com/products/ chart/features/ [3] SQL Server 2005 Reporting Services http:// www.microsoft.com/technet/prodtechnol/ sql/2005/2005ssrs.mspx Screen 3: Die Reporting Services beruhen auf einer modularen Architektur. Die gelben Kästchen zeigen die Ansatzpunkte für eigene Erweiterungen. Listing1 // init web service proxy class ReportingService rs = new ReportingService(); rs.Url = “http://localhost/ReportServer/ReportService.asmx”; rs.Credentials = System.Net.CredentialCache.DefaultCredentials; // init render output parameters string encoding; // encoding returned string mimeType; // mime type returned ParameterValue[ ] parametersUsed; // parameters used for rendering Warning[ ] warnings; // warnings issued during processing string[ ] streamIDs; // id’s of child streams, e.g. images, css // render report with default parameters as PDF, 600 dpi resolution byte[ ] result = rs.Render(“/Sample/Product Line Sales”, “PDF”, null, “<DeviceInfo><DpiX>600</DpiX><DpiY>600</DpiY></DeviceInfo>”, null, null, null, out encoding, out mimeType, out parametersUsed, out warnings, out streamIDs); FileStream stream = File.OpenWrite(@”c:\ProductLineSales.pdf”); stream.Write(result, 0, result.Length); stream.Close(); WWW.COMPUTERWORLD.CH / 20. JANUAR 2006 51