Reporting mit Jasper Aktuelle Geschäftszahlen, Umsatzinformationen, dynamische Auswertungen in Form übersichtlicher und leicht leserlicher Reports stehen als Hilfsmittel strategischer Unternehmensführung hoch im Kurs. Gerade in der IT selber wächst der Umfang des Reporting, weil hier aus ITIL-Perspektive selbst die kleinste Anwendergruppe ein Servicenutzer ist, der Daten zu Verfügbarkeit, Performance und Ressourcennutzung für seine Abrechnung benötigt. Bernd Erk 1 www.linuxtechnicalreview.de Projekte Berichte in Handarbeit zurechtzubasteln gehört in vielen Unternehmen am Monatsanfang zum Tagesgeschäft. Die damit einhergehenden Schwierigkeiten liegen aber auf der Hand: Die manuelle Aufbereitung von Zahlen ist teuer, fehleranfällig und oft schwer nachvollziehbar. Außerdem lassen sich die Daten in vielen Fällen nur schwer in anderen Medien weiterverwenden oder in anderen Formaten ausgeben. Freie Lösungen fürs Reporting Neben den bekannten kommerziellen Lösungen wie Crystal [1] oder Oracle Reports [2] oder auch Microsoft Access [3], deren Berichtsfunktionen häufig zum Einsatz kommen, haben sich in den letzten Jahren funktionsreiche OpenSource-Lösungen etabliert. Neben Pentaho [4] oder dem Eclipse BIRT-Projekt [5] bietet hier JasperSoft [6] mit JasperReports und iReport Listing 1: Ausschnitt aus einem JRXML-File 01 <?xml version=“1.0“ encoding=“UTF-8“?> 02 <jasperReport xmlns=“http://jasperreports.sourceforge.net/jasperreports“ 03 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“ 04 xsi:schemaLocation=“http://jasperreports.sourceforge.net/jasperreports 05 http://jasperreports.sourceforge.net/xsd/jasperreport.xsd“ name=“AllVisits“ 06 language=“groovy“ pageWidth=“595“ pageHeight=“842“ columnWidth=“504“ 07 leftMargin=“70“ rightMargin=“21“ topMargin=“28“ bottomMargin=“42“> 08 09 <queryString> <![CDATA[ 10 SELECT logdate, COUNT(DISTINCT hostip) 11 FROM 12 loglines 13 WHERE 14 logdate BETWEEN CONCAT(YEAR(NOW()),‘-‘,MONTH(NOW()),‘-01‘) AND NOW() 15 16 AND [...] ]]> 17 </queryString> 18 <field name=“logdate“ class=“java.sql.Date“> 19 <fieldDescription><![CDATA[]]></fieldDescription> 20 </field> 21 <field name=“COUNT(DISTINCT hostip)“ class=“java.lang.Long“> 22 <fieldDescription><![CDATA[]]></fieldDescription> 23 </field> 24 <title> 25 <band height=“79“ splitType=“Stretch“> 26 <image> 27 <reportElement x=“201“ y=“0“ width=“302“ height=“31“/> 28 <imageExpression class=“java.lang.String“> 29 <![CDATA[„LTR_path.png“]]></imageExpression> 30 31 </image> </band> 32 </title> 33 [...] 34 <pageFooter> 35 <band height=“54“ splitType=“Stretch“/> 36 </pageFooter> 37 <summary> 38 39 <band height=“42“ splitType=“Stretch“/> </summary> 40 </jasperReport> www.linuxtechnicalreview.de 2 Projekte als Teil seiner Open Source Business Intelligence Suite ein umfassendes Framework an. Während Eclipse BIRT eher auf Entwickler zugeschnittenen ist, hat Pentaho mit seinen Lösungen eine im Vergleich mit JasperSoft ähnliche Produktpalette im Bereich Reporting. (Nebst der zugehörigen ETL- (Extract, Transform, Load) und OLAP-Werkzeuge (Online Analytical Processing)). JasperReport ermöglicht seinen Reporting-Tools allerdings die einfache Integration in andere Applikationen. iReport, bei jasperSoft als Reportdesigner verantwortlich für die Erstellung von Berichten, sowie der JasperServer für deren spätere Generierung und Verteilung basieren auf der gleichen Java-Bibliothek JasperReport. Als zentrale Library unterstützt JasperReport eine Vielzahl von Datenquellen und Formaten und ist im Bereich der Reportvisualisierung im Vergleich zu Pentaho und BIRT die ausgereifteste Lösung. Ihre besondere Stärke ist die einfache Integration in bestehende Anwendungen. Die durch iReport erzeugten JRXML-Dateien (Listing 1), bilden die Schnittstelle zwischen iReport und JasperServer und die gemeinsame Grundlage für Berichte. Als Java-Applikationen sind beide Werkzeuge für alle gängigen Betriebssystemplattformen von Windows über Linux, Unix und Mac verfügbar und kompatibel. Daten Bevor der Anwender einen Bericht erstellen kann, muss er unabhängig vom späteren Ausgabeformat definieren, welche Daten er aus welchen Quellen verwenden will. Die Auswahl der Daten sollte immer dem Grundsatz der Klarheit und Wahrheit verpflichtet sein und die Manipulation von Ergebnissen zur „Optimierung“ des Resultate ausschließen. Es ist vorteilhaft, komplexe Abfragen mit Hilfe einer externen Datenbank vorzubereiten. Dann lassen sich leichter Parameter ergänzen und Daten gruppieren. Abbildung 1: Die Mitte des Bildschirm nimmt der WYSIWYG-Bereich des Reportgenerators ein. Ihn umranden eine Standardpalette, ein Objekt-Inspektor und ein Property-Editor. 3 www.linuxtechnicalreview.de Projekte JasperReports unterstützt eine Vielzahl von Datenquellen, darunter XML, POJO, EJB, CSV und natürlich JDBC als universelle Schnittstelle für nahezu alle Datenbanken. Auch der Zugriff auf OLAP-Quellen mit MDX-Abfragen, dem Defacto-Standard für multidimensionale Abfragen, ist möglich. Ein beliebtes Beispiel für eine OLAP-Anwendung ist die Betrachtung der Verkaufsergebnisse eines Unternehmens aus Sicht der Niederlassungen, der Verkaufszeiträume oder diverser Produktgruppen. Die Definition der Daten und die Erstellung so genannter Cubes ist mit Hilfe von JasperAnalysis möglich. Schwerpunkt dieses Artikels sind Berichte auf Basis von JDBC-Datenquellen, wahrscheinlich das verbreitetste Szenario. Überblick über iReport Die Berichte erstellt der Anwender mit iReport, dass in der Community-Editon frei verfügbar [7] ist. Ergänzend zur Standalone-Version ist iReport auch als Plugin für NetBeans und Eclipse zu haben. Zwar könnte man die resultierenden JRXML-Dateien (JasperReport-XML) – das entsprechende Know-how vorausgesetzt – auch manuell schreiben, aber das ist nur Experten zu empfehlen. Dank des offenen Standards lassen sich diese Reportdefinition stattdessen sehr einfach automatisch erzeugen und auch manipulieren. Inhaltlich bietet die Java-Oberfläche, was man von anderen Reportingwerkzeugen auch kennt. Die GUI unterteilt sich grob in vier Bereiche, die der Benutzer individuell konfigurieren und erweitern kann. Einen zentralen WYSIWYGBereich umranden eine Standardpalette, ein Property-Editor zur Parametrisierung von Objekteigenschaften und der Report-Inspector. Letzterer liefert ein strukturiertes Abbild der Designinhalte und ist darüber hinaus für die Definition von Reportgruppen und so genannten Bändern verantwortlich. (Abbildung 1) Sobald der Anwender eine Datenbankverbindung hergestellt hat, kann er bereits bestehende SQL-Abfragen ausführen oder neue Abfragen mit Hilfe eines grafischen Query-Builders erzeugen. Komplexere SQL-Queries sollte man allerdings besser außerhalb von iReport mit Hilfe eines entsprechenden Datenbankwerkzeugs entwickeln (siehe Kasten „SQL-Developer einrichten“). Entwirft der Entwickler die Queries mit einem externen Tool, kann er die Fehler einfacher be- seitigen und mit einem realen Mengengerüst arbeiten, während die Preview des Reportgenerators nur die Plausibilität der Abfrage prüft. Nützliche Reports entstehen, wenn man sich nicht zuerst danach richtet, welche Daten erreichbar sind, sondern danach, was sie aussagen. Eine endlose Abfolge an Listen ohne konkrete Bedeutung, bei denen der Anwender womöglich noch Teilergebnisse manuell nachrechnen muss, kann den Empfänger überfordern und lässt sein Interesse schwinden. Die Resultate der SQL-Abfragen lassen sich zusätzlich mit Hilfe von Java-Expressions oder Groovy aufbereiten. Groovy ist eine Skriptsprache für Java und erleichtert Aggregations- oder Vergleichsoperationen erheblich. Laufzeitvariable für die Anzahl der verarbeiteten Sätze und Elemente wie Seitenzähler sind bereits in jeden Report integriert. Anwender können sie über den Report-Inspector einfügen. Sobald eine Abfrage erfolgreich definiert ist, lassen sich die zurückgelieferten Feldinformationen in den so genannten Reportbändern platzieren. Das sind Bereiche, die den Bericht in logische Abschnitte unterteilen. Jedes Reportband stellt die Software entweder nur einmal dar, wie Title- und Summary-Page, oder mehrfach, etwa datensatzweise wie im Detailbereich des Reports. Außerdem lassen sich die Daten mit ei- SQL-Developer einrichten SQLDeveloper [8] von Oracle ist ein hervorragendes und zudem kostenloses Tool für SQL-Abfragen. Allerdings beherrscht es von Haus aus nur den Verbindungsaufbau mit Oracle-Datenbanken. Um es auch für MySQL nutzbar zu machen, geht man folgendermaßen vor: 1. Herunterladen eines passenden JDBC-Treibers für MySQL, etwa von [9]. Das Archiv entpackt man an einem Ort der Wahl, beispielsweise in »/usr/lib«. 2. Danach ist »sqldeveloper.sh« zu starten. Beim ersten Mal fragt die Software nach dem Pfad zu einem Java-JDK (ein JRE reicht nicht!), den sie sich für nachfolgende Aufrufe in »~/.sqldeveloper/jdk« merkt. 3. Läuft der SQL Developer, muss der Anwender das Menü »Extras | Voreinstellungen | Datenbank | JDBC-Treiber eines anderen Herstellers« aufrufen und dort den Pfad zum MySQL-JDBC-Treiber eintragen, also beispielsweise »/usr/lib/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar«. 4. Ruft man jetzt den Dialog »Neue Datenbankverbindung« auf, enthält er zusätzlich eine Registerkarte für Verbindungen zu MySQL-Datenbanken. www.linuxtechnicalreview.de 4 Projekte nigen grafischenElementen anreichern und die Standardschriften passend zur Corporate Identity wählen. Einfache Berichte sind so bereits in wenigen Minuten ohne großen Aufwand zusammengezimmert. Das Ergebnis lässt sich als Preview in iReport betrachten. In der Praxis leben Berichte natürlich von der Dynamik der Daten, die Parameter bei der Ausführung steuern. Neben einer Reihe von Defaultparametern, die unter anderem die Auswahl von Sprache oder Zeitzone ermöglichen, kann der Anwender über das Kontext-Menü des Report-Inspektors eigene Parameter hinzufügen. iReport kümmert sich nach der Definition von Datentyp und Beschreibung dann automatisch um die Aufforderung zur Parametereingabe. Wichtig dabei ist, einen Defaultparameter vorzusehen, der auch dann einen sinnvollen Wert liefert, wenn der Anwender die Eingabeaufforderung ignoriert. Andernfalls könnten die SQL-Abfragen leere Seiten produzieren. Die benutzerdefinierten Parameter fragt auch der Jasper-Server ab, wenn er den Bericht ausführt. Besonders hilfreich sind dynamische Parameterlisten, bei denen der Benutzer dann aus einer Drop-Down-Liste wählen kann, die ihrerseits durch eine SQL-Abfrage befüllt wurde. Das ist zum einen bequem und garantiert zum anderen gültige Eingabewerte. Bilder wie Firmenlogo oder Kopf- und Fußzeilenelemente lassen sich entweder aus dem lokalen Berichtspfad oder von einer beliebigen HTTPQuelle via URL einbinden. Einfache Berichte mit grafischen Elementen sind so in Minutenschnelle erstellt. Diagramme Oft veranschaulichen Diagrammen gerade Entwicklungen über lange Zeiträume besser als Tabellen. Über die iReport-Palette »Report Elements« stehen alle gängigen Diagrammtypen zur Verfügung. Hat man einen Diagrammtyp ausgewählt, lässt sich via Kontextmenü der Dateninhalt bestehend aus einer Key-, Label- und Value-Expression einstellen. Mit Hilfe der Diagrammattribute ist es möglich, ergänzend zu Farben noch die Transparenz der verschiedenen Diagramm- 5 bereiche zu beeinflussen, was das Diagramm optisch aufwertet. Das Ergebnis lässt sich im Preview-Fenster sofort begutachten, so dass sich interaktiv Änderungen am Layout durchführen lassen. Besonders hilfreich ist es in der Praxis, die verschiedenen Datenbereiche des Diagramms mit einer URL zu versehen. So kann man entweder auf eine externe Detailquelle oder einen anderen Subreport verweisen. Dies vereinfacht die Navigation und erleichtert dem Benutzer den Zugriff auf die zugrunde liegenden Daten. Erweiterte Abfragen Wer komplexe Sachverhalte darstellen will, braucht oft auch aufwendigere Abfragestrategien. iReport bietet hier zwei leistungsfähige Alternativen. Eine Möglichkeit selektierte Werte in der Ausgabe feiner zu unterteilen, ist die Anlage von Reportgruppen. Eine solche Gruppe ermöglicht zusätzliche Bänder für Kopf- und Fußzeilen und Zusatzangaben beim Gruppenwechsel. Damit ließe sich etwa eine Serverliste nach Betriebssystem gruppieren. Daneben gibt es Subreports. Sie lassen sich beliebig schachteln, wobei es auch möglich ist, ? Noch Fragen? Unsere Autoren beantworten Ihre Fragen gern in unseren Foren. Reportparameter oder komplexe Hashmaps an eingebettete Berichte zu übergeben. Zum einen muss der Benutzer so das entsprechende Reportgerüst aus Deck- und Summenblatt nicht mehrmals erstellen, zum anderen – und noch viel entscheidender – lassen sich die einzelnen Detailberichte auf diese Weise zentral parametrisieren. Zudem ist die Datenquelle für alle Subreports an einer zentralen Stelle änderbar. Auch ist es möglich, Berechtigungen zu verwenden, die auf dem umschließenden Bericht basieren. Der Jasper-Server Gerade für das Erstellen von Berichten in einem iterativen Prozess bietet iReport eine leistungsstarke Umgebung. Ist der Bericht fertig, muss er zu seinen Nutzern gelangen. Weil er oft nicht an jedermann adressiert ist, spielen hier auch zentrale Authentifizierungs- und Autorisierungsverfahren eine Rolle. Diese Aufgabe übernimmt in Japsers BI-Suite der Jasper-Server. In der www.linuxtechnicalreview.de Projekte kleinsten Installationsvariante ist der Jasper-Server eine Web-Applikation in einem bestehenden Applicationserver, vorzugsweise Tomcat, die auf eine MySQL-Datenbank zugreift. Wer noch nichts von alledem installiert hat oder eine isolierte Reportingumgebung verwenden möchte, dem steht für Linux ein Installationsbinary [10] zur Verfügung, das die geführte Installation in Minuten ermöglicht. Auch dabei hat der Benutzer die Möglichkeit, einen vorhandenen Tomcat-Server und/oder eine eigene MySQLDatenbank anstelle der mitgelieferten Binaries zu verwenden. Erfahrungsgemäß macht eine eigene MySQLDatenbank wenig Probleme, auch wenn sie inklusive Datensicherung und Updates etwas schwieriger zu handhaben ist als der Applikationsserver. Da die Reports in der Datenbank landen, lässt sich der Jasper-Server auch einfach in Multimaster-Umgebungen implementieren. Verteilte Server können so auf lokale Quellen zurückgreifen und die Berichte sind für alle beteiligten Instanzen sofort sichtbar. Nach Abschluss der Installation ist der JasperServer sofort unter [http://localhost:8080/ jasperserver] zu erreichen und es ist eine Anmeldung mit dem Adminbenutzer (»jasperadmin«) möglich . Die Oberfläche ist übersichtlich und auf das Wesentliche beschränkt. In den nächsten Monaten kommen vermutlich einige Features der Professional-Edition, wie das AdHoc-Reporting und Dashletfunktionen hinzu. Eine zentrale Komponente ist der RepositoryViewer (Abbildung 2). Wurden die Beispielreports installiert, kann der Anwender gleich eines der gelisteten Elemente starten. Alternativ lassen sich per Kontext-Menü neue Ordner anlegen und freigegeben. In die Ordner platziert der Anwender dann die mit iReport erstellten JRXMLDateien. Zu einer so genannte Report Unit können außerdem noch die Datenbankverbindung, Bilder, Dialoge für Input-Parameter oder Subreports gehören. Der Anwender entscheidet, ob er globale Ressourcen des Servers verwenden oder lokale Ressourcen zum Report hinzufügen will. Die globalen Ressourcen-Definition haben den Vorteil, das durch sie mehrere Berichte von einer zentralen Stelle aus zu ändern sind. Hilfe einer SOAP-Schnittstelle in iReport. Neue Berichte gelangen so auf den Server und bestehende Berichte lassen sich von dort aus löschen oder modifizieren und in der Weboberfläche ausführen. Die Weboberfläche ist auch der Ort für alle Einstellungen für den automatischen Berichte-Versand und fein abgestufte Berechtigungen mit zentraler Authentifizierung und Autorisierung. Eine zentrale Funktion des Jasper-Servers ist es, Reports automatisch zu erstellen und anhand frei konfigurierbarer Zeitpläne zu versenden. Die Zeitsteuerung baut auf QUARTS, ein JavaSchedulingframework [11], das sehr flexibel ist und eine einfache Steuerung für komplexe Zeitpläne bietet. Alle automatisch versandten Reports sollte der Admin zusätzlich speichern. Da die Berichte größtenteils auf volatilen Daten beruhen, lassen sie sich in gleicher Form zu einem späteren Zeitpunkt meist nicht mehr reproduzieren. Alternative Anbindungen Obwohl es meist darum geht, formatierte Dokumente zu erzeugen, enthält der Jasper-Server darüber hinaus auch leistungsfähige Schnittstellen, um die Berichtsdaten in anderen Applikationen weiterzuverarbeiten und die Berichte in alternative Umgebungen zu integrieren. So bietet der JasperSerer weitere Zugriffsmöglichkeiten via HTTP-GET-Request und besitzt darüber hinaus noch eine vollwertige SOAP-Schnittstelle. Während der Reportaufruf mittels HTTP-GET- Berichte bereitstellen Am schnellsten geht das Deployment mit Hilfe des in iReport integrierten Repository-Viewers. Er bietet sämtliche Deploymentfunktionen mit Abbildung 2: Der Repository-Viewer präsentiert die startbaren Reports. www.linuxtechnicalreview.de 6 Projekte Request eine schnelle Integration in Portale und eigene Applikationen erlaubt, ist die SOAP-Schnittstelle auf eine Integration durch Entwickler ausgelegt, denen sie dafür Zugriff auf sämtliche Repository-Inhalte sowie den internen Scheduler bietet. Über die SOAP-Schnittstelle lassen sich schließlich auch alle Berichte löschen, verschieben, berechnen oder in einem gewünschten Format weiterverarbeiten. Der Zugriff darauf ist durch eine zentrale Authentifizierung und Autorisierung abgesichert. Auf diese Weise ist es möglich, jeden Benutzer mit fein abgestuften Berichtigungen auszustatten. Sicherheit Neben der integrierten Benutzer- und Rollenverwaltung unterstützt der Jasper Server auch eine Vielzahl von Optionen auf Basis des Acegi Security Frameworks [12], das in Zukunft zu einem Teil des bekannten Spring Frameworks entwickeln wird. Neben LDAP auf Basis von Microsoft Active Directory oder Novell eDirectory unterstützt er so auch diverse javabasierte Lösungen wie JAAS (Java Authentication and Autorisation Service) und CAS (Central Authentification Service) sowie etliche Verschlüsselungsverfahren auf Basis von HTTPS und X.509 als Standard für verbreitete Public-KeyInfrastrukturen. Fazit JasperReports ist als Teil einer großen Business Intelligence Suite, dem Flaggschiff von JasperSoft, und bietet dem Anwender sämtliche Features zur Aufbereitung von Datenquellen, Definition von Abfragen und dem Verfertigen von Berichten auf einem Server oder dem Client. Die Software ist plattformunabhängig und garantiert homogene Ergebnisse. Die vielfältigen HTTPund SOAP-Schnittstellen sowie die zentrale Authentifizierung und Autorisierung erleichtern die Integration. Gerade diese Vielseitigkeit hebt JasperReports deutlich von anderen Produkten am Markt ab. Die Lösung schiebt sich damit zwischen Pentaho und BIRT und deckt trotz der noch ausstehenden Möglichkeit, webbasiert Reports zu generieren, bereits in der Communityversion alle Anforderungen ab. Die anfängliche Mühen der Einarbeitung belohnt Jasper schnell und steigert sowohl Nachhaltigkeit als auch Qualität des Berichtswesen (Abbildung 3). ■ ■ ■ Infos [1] Chrystal Reports: [http://www.sap.com/germany/solutions/ sapbusinessobjects/sme/reporting/index.epx] [2] Oracle Reports: [http://www.oracle.com/ technology/products/reports/index.html] [3] Microsoft Access: [http://office.microsoft.com/ de-de/access/FX100487571031.aspx] [4] Pentaho: [http://www.pentaho.com] [5] Eclipse BIRT: [http://eclipse.org/birt/phoenix] [6] Jasper Soft: [http://www.jaspersoft.com] [7] iReport Download: [http://jasperforge.org/projects/ireport] [8] SQLDeveloper: [http://www.oracle.com/ technology/products/database/sql_developer] [9] MySQL Connector-J: [http://dev.mysql.com/ downloads/connector/j/5.0.html] [10] Jasper Server Binary: [(http://sourceforge.net/ projects/jasperserver/files/JasperServer/)] [11] QUARTS: [http://www.quartz-scheduler.org] [12] Acegi Security Framework: [http://www.acegisecurity.org] Der Autor Abbildung 3: Attrkativ formatierte Reports mit der Corporate Identity der Firma und das auch noch auf Knopfdruck – das ist das Versprechen von Jasper Report. 8 Bernd Erk ist Technischer Leiter der Nürnberger Netways GmbH, die seit mehr als zehn Jahren im Open Source- und Linux-Umfeld tätig ist. www.linuxtechnicalreview.de