Aus Linux-Magazin 05/2015

Berichte mit Jasper Reports erstellen

© Sergey Nivens, 123RF

Verfügbarkeiten, Laufzeiten, Performancewerte, Ausfälle, Auslastungsgrade – alles Mögliche wird in der IT reportiert. Soll das möglichst unaufwendig und dabei doch ansprechend und im Corporate Design vonstatten gehen, braucht man ein gutes Tool. Etwa den Open-Source-Reportgenerator Jasper Reports.

“Pochierte Wasserflöhe an Grünalgen” sind der Renner im Angebot der erfundenen Tiergourmet AG. Fische machen eben keine großen Worte, sind aber treue Kunden. “Mäuseschinken aus dem Wacholderrauch” läuft auch gut. Doch bevor eine Katze den kauft, schleicht sie dreimal um den heißen Brei und nascht höchstens. Wenn Pferde ins Gras beißen, gehen ganz andere Mengen über den Ladentisch: Deshalb findet sich das Fuder Aromaheu “Sommerglück” auf dem dritten Platz der Verkaufshitliste.

Indes: All diese Fakten gelten nichts, solange sie dem Tiergourmet-CEO nicht schwarz auf weiß als Report vorliegen, und zwar ordentlich formatiert nach den Regeln der Corporate Identity, verziert mit Logo, Tabellen und Grafiken – und wöchentlich auf Knopfdruck mit frischen Zahlen aktualisierbar. Genau darum soll sich Max, der Tiergourmet-Admin, jetzt kümmern.

Die Zahlen selbst, auf denen der Report fußt, liegen zum Glück bereits digital vor: In der Datenbank der Warenwirtschaft (Listing 1). Max hat sich auch schon nach einem Werkzeug umgesehen, mit dem er sie möglichst einfach in eine hübsche Form bringen könnte.

Listing 1

Warenwirtschaftstabelle

01 mysql> SELECT * FROM sales_fig ORDER BY productID DESC LIMIT 10;
02 +------------------------------------------+-----------+--------+
03 | product                                  | productID | sales  |
04 +------------------------------------------+-----------+--------+
05 | Gazellentofu (vegan, mit Vit. A)         |      9987 |  532.7 |
06 | Pochierte Wasserfloehe an Gruenalgen    |      6547 | 1298.5 |
07 | Spicy Spinnenbein (ohne Fett)            |      5211 |  432.6 |
08 | Antipasti vom Aas                        |      4321 |    300 |
09 | Maeuseschinken aus dem Wacholderrauch    |      3321 |  889.5 |
10 | Aromaheu "Sommerglueck"                  |      3003 |  776.1 |
11 | Schmetterlingskraftfutter "Power Pollen" |      2017 |  399.6 |
12 | Grashuepferhaxe, trad. bayr.             |      1001 |  646.8 |
13 | Silage-Sorbet                            |       113 |  411.3 |
14 | Junge Regenwuermer (Meterware)           |        18 |  461.4 |
15 +------------------------------------------+-----------+--------+
16 10 rows in set (0,00 sec)

So ist er auf Jasper Reports http://1 gestoßen, einen Open-Source-Reportgenerator, geschrieben in Java, der eine breite Palette an Datenquellen integrieren kann und die Ergebnisse auf dem Bildschirm oder als File in Formaten wie PDF, HTML, RTF, ODT oder als einfache CSV-Datei ausgibt.

Die Installation

Jasper Reports besteht aus mehreren Komponenten, deren gemeinsame Grundlage die Bibliothek Jasper Reports Library ist. In einer Ebene darüber finden sich die Designwerkzeuge I-Report und Jaspersoft Studio sowie der Jaspersoft Server. Der Server wird gebraucht, wenn später aktualisierte Reports auf Knopfdruck zu generieren sind.

Vorher sind diese Reports zu entwerfen und dazu dienen entweder I-Report oder das Jaspersoft Studio. I-Report unterstützt der Hersteller allerdings nur noch bis Jahresende 2015, wer heute neu einsteigt, versucht es besser gleich mit Jaspersoft Studio, das auf der Open-Source-IDE Eclipse aufsetzt.

Die Installation des Designtools beschränkt sich im Wesentlichen auf das Entpacken der Komponenten, die auf der Downloadseite der Community-Version bereitstehen [1]. Einen Pferdefuß gibt es dabei zu beachten: Jaspersoft Studio braucht auf einem 64-Bit-System von einigen Bibliotheken wie beispielsweise »libgtk-x11-2.0.so« 32-Bit-Versionen, die extra zu installieren sind, sonst kann die Applikation nicht funktionieren.

Welche Libraries eine Applikation oder Bibliothek erwartet, verrät übrigens »ldd Applikation/Bibliothek« . Tauchen in der Ausgabe Angaben auf wie

libgtk-x11-2.0.so.0 => not found
libgthread-2.0.so.0 => not found
libXtst.so.6 => not found

muss der Admin diese Komponenten nachinstallieren. Sind die Files vorhanden und per Suchpfad auffindbar, provozieren dann aber die Fehlermeldung »falsche ELF-Klasse: ELFCLASS64« , dann fehlt die 32-Bit-Version.

Ein erster Report

Für die erste Seite seines Reports will Max eine Top-Ten-Liste der bestverkauften Produkte generieren. Dazu startet er die Studio-Applikation:

cd /home/Max/Apps/Jasper/TIBCOJaspersoftStudioPro-6.0.1.final
./Jaspersoft\ Studio\ Professional &

Unter »File | New | Jasper Report« ruft er den New Report Wizard zum Anlegen eines neuen Reports auf, der ihm zu Anfang eine ganze Reihe hoch- und querformatiger Templates anbietet (Abbildung 1). Die meisten enthalten bereits beispielhaft Logos und auch Charts neben einer Tabellendarstellung. Doch Max findet auf Anhieb nichts, was ihm passend erscheint, und so wählt er das Template »Blank A4« .

Abbildung 1: Beim Erstellen eines Reports kann der Designer aus zahlreichen vorformatierten Templates wählen.

Abbildung 1: Beim Erstellen eines Reports kann der Designer aus zahlreichen vorformatierten Templates wählen.

Danach muss er einen Speicherort für den neuen Bericht vorgegeben. Im nächsten Schritt verlangt der Wizard, dass ihm eine Datenquelle zugewiesen wird. Max stellt »Sample DB – Database JDBC Connection« ein und klickt auf die Schaltfläche »New« . Es startet der Data Adapter Wizard. Max wählt »JDBC-Connection« und trägt die Eckdaten der Verbindung zu seinem lokalen MySQL-Server der Warenwirtschaft in das erscheinende Formular ein (siehe Abbildung 2). Unter Umständen muss er unter dem Reiter »Driver Classpath« noch den Pfad zur Java-Klasse mit dem Treiber hinterlegen.

Abbildung 2: Die Einstellungen für eine Datenbankanbindung, die als Datenquelle für den Report fungiert.

Abbildung 2: Die Einstellungen für eine Datenbankanbindung, die als Datenquelle für den Report fungiert.

Nun lässt sich die Verbindung testen und, wenn das Resultat »Successful« war, bestätigen. Danach wird im letzten Schritt des Datenquellen-Wizard eine SQL-Abfrage eingegeben, deren Daten den Report füllen sollen. Für die Top-10-Liste ist das:

SELECT product, sales  FROM sales_fig ORDER BY sales DESC  LIMIT 10;

Es erscheint die Designansicht mit einem leeren Blatt, in dem mehrere horizontale Bereiche markiert sind (Abbildung 3). Diese Bereiche heißen im Jargon von Jasper Report Bänder und dienen der Gliederung des Reports. Es gibt Bänder für Überschriften oder Tabellenköpfe auf verschiedenen Ebenen und korrespondierende Footer. Eines der Bänder verhält sich anders als der Rest: das Detail-Band. Was in ihm platziert wird, wiederholt der Report für jeden Datensatz, den die Datenquelle liefert. Damit kann es von ganz allein eine Tabelle oder Liste konstruieren.

Abbildung 3: Ein leeres Blatt mit einem vollen Satz so genannter Bänder, also horizontaler Abschnitte, die den Report gliedern.

Abbildung 3: Ein leeres Blatt mit einem vollen Satz so genannter Bänder, also horizontaler Abschnitte, die den Report gliedern.

Alles was innerhalb der Bänder positionierbar ist, holt der Designer aus einem Unterfenster rechts neben der Entwurfsansicht. Über die Reiter »Palette« und »Properties« lässt sich zum einen eine Sammlung platzierbarer Elemente einblenden – Textzeilen, Farbflächen, Linien, Bilder, aber auch komplexe Elemente wie Charts oder Subreports –, zum anderen zaubert dort ein zweiter Reiter einen Properties-Dialog hervor, der die Eigenschaften jedes platzierten Elements genau bestimmt.

Die Elemente gelangen einfach per Drag&Drop aus der Palette in die Entwurfsansicht, Bilder lassen sich auch von der Desktop-Oberfläche auf den Entwurf ziehen und werden dabei automatisch in ein Image-Element verpackt. Nicht immer braucht der Designer alle Bänder. Jene, für die er in einem bestimmten Projekt keine Verwendung hat, kann er nach einem Linksklick in das Band in der Designansicht bedenkenlos löschen. Max behält für eine erste Top-10-Liste der meistverkauften Produkte nur die Bänder Title, Column Header und Detail 1.

In das Title-Band platziert er ein ausfüllendes Rechteck aus der Palette, das er über seine Properties (»Forecolor« , »Backcolor« ) orange einfärbt. Auf diesem Hintergrund drapiert er links das Firmenlogo (ein »Image« -Element) und rechts eine Überschrift. Font, Schriftgröße und Schriftfarbe der Überschrift legen wiederum die Properties des zugehörigen Elements »Static Text« fest. In dem Band »Column Header« unter dem Title-Band ordnet Max zwei weitere Static-Text-Elemente an (»Produkt« , »Umsatz« ), die eine Art Tabellenkopf für die folgende Auflistung bilden.

Das nächste Band ist das spezielle Detail-Band. Sein Inhalt wird mit jedem Datensatz verknüpft, den eine SQL-Abfrage liefert, die der Admin zusammen mit der Datenquelle definiert hat. Die Elemente, die jeweils den Inhalt eines Zeilenwerts einer bestimmten Spalte aus der SQL-Abfrage aufnehmen, heißen in der Palette »TextElement« .

Damit die Verknüpfung mit dem Resultat-Set der Datenbankabfrage funktioniert, empfiehlt es sich, zuerst auf das kleine Icon links neben der Plus-Lupe zu klicken. Das ist der “Data Set and Query Editor Dialog”. Er sollte auf die Abfragesprache SQL eingestellt sein und für die Top-10-Liste die Query

SELECT product, sales FROM sales_fig ORDER BY sales DESC LIMIT 10;

enthalten. Rechts oben in diesem Dialog gibt es die Schaltfläche »Read Fields« . Klickt man auf sie, erscheinen die Namen der Spalten, für die nach Werten gefragt wird, in der unteren Fensterhälfte als »Field Name« nebst einem passenden Java-Datentyp.

Hat Max ein »TextElement« im Detail-Band platziert und klickt es doppelt an, öffnet sich ein neuer Dialog, der »Expression Editor« heißt. Er erlaubt es, jedes »TextElement« mit einem der eben gefundenen »Fields« zu verknüpfen, hinter denen sich wiederum die Spalten der Datenbankabfrage aus der Datenquelle verbergen. Auf diese Weise verbindet Max das linke Textelement mit dem Field »product« und das rechte mit dem Field »sales« .

Unter den beiden Textfeldern ordnet Max noch eine Linie aus der Palette an. Da auch sie im Detail-Band für jeden Datensatz wiederholt wird, ergibt sich damit ein linierter Bericht. Die fertige Entwurfsansicht sieht aus wie in Abbildung 4. Nun ist es bis zum ersten fertigen Bericht nur noch ein Katzensprung, den der Entwerfer mit einem Klick auf »Preview« unterhalb der Designansicht absolviert. Es erscheint eine Vorschau des Berichts. Wählt man in dem Dropdownmenü oberhalb der Vorschau statt »Java« »PDF« aus, lässt sich das so generierte PDF-Dokument speichern.

Abbildung 4: Die fertige Entwurfsansicht der Top-10-Liste.

Abbildung 4: Die fertige Entwurfsansicht der Top-10-Liste.

Mehr Daten

Bis hierher repräsentiert der Inhalt des Berichts das Ergebnis genau einer SQL-Abfrage. Das kann in manchen Fällen ausreichen, manchmal ist aber eine Datengrundlage vorzuziehen, die sich nicht mit einer einzelnen Abfrage abbilden lässt. Dafür gibt es verschiedene Möglichkeiten.

Diejenige, die hier zuerst demonstriert werden soll, beruht doch wieder auf einer einzelnen Abfrage, deren Resultate aber am Ende auf verschiedene Berichts-elemente verteilt werden. Dafür konsultiert Max eine Tabelle oder View in seiner Warenwirtschaftsdatenbank, deren Spalten für die einzelnen Produkte stehen, wogegen die Zeilen tägliche Absatzmengen enthalten (Listing 2).

Listing 2

Absatztabelle

01 mysql> select * from absatz;
02 +------------+----------+----------+----------+
03 | rdate      | product1 | product2 | product3 |
04 +------------+----------+----------+----------+
05 | 2015-03-02 |      577 |     284  |      156 |
06 | 2015-03-03 |      566 |     291  |      116 |
07 ...

Max beginnt wieder mit einem leeren A4-Template. In diesem Report möchte er für zwei Produkte Grafiken mit den täglichen Absatzzahlen erzeugen. Weil dafür der Datensatz nicht zeilenweise gelistet werden muss, ist auch kein Detail-Band nötig. Max lässt nur die Bänder Title, Page Header, Column Header, Column Footer und Page Footer übrig.

Zuvor hat er bei der Definition der Datenquelle die Abfrage

SELECT DATE_FORMAT(rdate, "%d.%m.%Y") AS date, product1, product2, product3 FROM absatz;

eingesetzt. Danach klickt er im New Report Wizard nicht gleich auf »Finish« , sondern auf »Next« und landet auf einer Seite, auf der er alle oder einzelne »Dataset Fields« (im Beispiel: »date« , »product1« , »product2« und »product3« ) in Fields überführen kann, die dann für die Gestaltung der Charts verfügbar sind. Max übernimmt alle Felder. Im nächsten Schritt könnte er Felder auswählen, nach denen gruppiert werden soll. Das ist hier nicht nötig. Damit ist die vom Wizard geleitete Prozedur abgeschlossen.

Max gestaltet den Titel mit Logo und Überschrift ganz ähnlich wie im letzten Report. Dann zieht er das Chart-Element aus der Palette in das »Column Header« -Band. Es öffnet sich ein Auswahlfenster, das die verschiedensten Chart-Typen anbietet – Bar Chart, Pie Chart, Gantt Chart und so weiter.

Max wählt »Line Chart« und landet auf einer Seite, wo er definieren kann, woher die Werte für beide Achsen kommen sollen – zur Auswahl stehen die »Fields« , die er oben aus den »Dataset Fields« übernommen hatte. Für das Diagramm sind nun aber nicht alle Felder nötig, sondern nur eine Untermenge: Max wählt »$F{product1}« für die y-Achse und »$F{date}« für die x-Achse.

Nachdem er das Diagramm auf die Größe des Bandes skaliert und im darüberliegenden »Page Header« -Band noch ein statisches Textfeld mit einer Überschrift platziert hat, wagt Max einen ersten Blick auf die Preview-Seite. Im Prinzip funktioniert schon alles, nur die x-Achsenbeschriftung (also das Datum) ist nicht lesbar, weil sich die Einträge überlappen, und eine Legende bräuchte es bei einer Kurve im Diagramm auch nicht.

Beides ist leicht über die Properties des Diagramms einstellbar, mit denen sich alle Einzelheiten der Darstellung justieren lassen. Über »Properties | Chart Plot | Category Axis Tick Label Font | Category Axis Tick Label Rotation« lässt sich die x-Achsen-Beschriftung um etwa 30 Grad neigen, sodass sich die Datumsmarken nicht mehr überlappen. Und via »Properties | Chart | Show Legend« , das auf »False« steht, verschwindet die Legende (Abbildung 5).

Abbildung 5: Das fertige erste Diagramm im Report, unter ihm lässt sich nach demselben Muster ein zweites erzeugen.

Abbildung 5: Das fertige erste Diagramm im Report, unter ihm lässt sich nach demselben Muster ein zweites erzeugen.

Nach haargenau demselben Muster kann Max nun in den zwei noch freien Bändern eine neue Überschrift und ein weiteres Chart für die Absatzzahlen eines zweiten Produkts arrangieren, indem er bei der Konfiguration des Chart einfach »product2« für die y-Achsenwerte auswählt. Auf diese Weise kann er so viele verschiedenen Charts in einem Report erhalten, wie er Produktspalten in seiner Datenbankabfrage angegeben hat und wie er noch freie Bänder für Charts hat.

Keine Grenzen

Die nächste Technik überwindet beide Beschränkungen: sowohl hinsichtlich der Anzahl Datenspalten aus einer Abfrage als auch hinsichtlich der freien Bänder. Dafür zieht Max einfach das Element »Subreport« aus der Palette in ein freies Band. Das legt einen Report innerhalb eines Reports an und beginnt ganz von vorn: Es lässt sich ein neues Template wählen, das wiederum über alle Bänder eines frischen Reports verfügt, und Max kann eine neue Datenquelle definieren, die sich auf eine ganz andere Abfrage einer ganz anderen Tabelle beziehen mag als der Toplevel-Report.

Dabei kann Max nicht nur in jedes freie Band (außer dem »Detail« -Band) eines Top-Level-Reports auch Subreports platzieren, sondern darf die außerdem verschachteln, das heißt, zum Beispiel Sub-Subreports kreieren. Damit gibt es fast keine Beschränkung der Gestaltungsfreiheit mehr.

Jasper Reports hält noch eine ganze Reihe weiterer Möglichkeiten bereit, die Max bislang noch gar nicht genutzt hat: Weitere Chart-Typen, Karten, Kreuztabellen und vieles mehr. Jeden einmal generierten Report kann der Server auf Knopfdruck verarbeiten und dabei auch Parameter entgegennehmen, etwa ein Zeitintervall, für das er den Report berechnen soll.

So entstehen mit Hilfe von Jasper Reports und mit überschaubarem Aufwand stets aktualisierbare, optisch ansprechende Berichte in einem einheitlichen Design. Sie dürfen sich auf alles beziehen, was sich irgendwie in Zahlen, Diagrammen und Tabellen ausdrücken lässt.

Infos

  1. Downloadseite der Community-Version: https://community.jaspersoft.com/download
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben