JasperReports #

Jasper ist ein Reportgenerator in Java. Ein Reportgenerator nimmt Daten aus einer Datenquelle (z.B. einer SQL-Datenbank) und gibt diese z.B. als eine Liste aus. Diese Liste kann weitgehend gestaltet werden, Daten können dabei aggregiert werden und sogar Charts (also graphische Auswertungen der Daten in Form von Digrammen) können eingebunden werden. Nach eigenen Angaben ist JasperReports die meistgenutzte Opensource Report Engine in Java.

Vergleich mit EclipsePlugin.BIRT #

Im Gegensatz zu EclipsePlugin.BIRT arbeitet JasperReports mit festen Größen der Anzeigefelder und nicht mit dynamischen, HTML-ähnlichen Feldern. Das mag zwar nicht so modern sein, führt aber meistens zu Ergebnissen, die viel näher an dem liegen, was man wirklich gemeint hat. Die festen Größen erschweren es andererseits sicherlich, Reports automatisch zu generieren, aber das werde ich vielleicht später mal ausprobieren.

Auf den ersten Blick scheint JasperReports auch wesenlich schlanker zu sein. Das zeigt sich erstens an der Größe der benötigten Bibliotheken aber zweitens vor allem auch an der Geschwindigkeit: Mein erster Beispiel-Report benötigte auf meinem Laptop mit BIRT ca. 15 Sekunden, mit Jasper 4 Sekunden und vorkompiliert nur 1,5 Sekunden.

JasperReports ist weit stärker mit dem Desktop-Benutzer bzw. der Erzeugung von Ausdrucken im Hinterkopf entwickelt worden, während BIRT seine Stärke eher im Erzeugen von HTML-Reports hat. Hier hat BIRT auch Eigenschaften wie Reports, die beim Anklicken aufklappen oder mit anklickbaren Inhaltsverzeichnissen, die in Jasper nicht zu finden sind.

Erste Schritte #

Erstellung eines Report mit iReport #

Als erstes sollte man die JasperReports-Webseite links liegen lassen, und sich iReport herunterladen und starten. Auf der iReport-Seite gibt es nun ein kleines "Getting Started"-Tutorial. Dieses enthält eigentlich auch nicht viel, weil sich der erste Report fast von ganz alleine erstellt. :-) Man kann den Report aus iReport heraus dann auch anzeigen bzw. in vielen verschiedenen Formaten (z.B. PDF) ausgeben und abspeichern.

Weitere Änderungen und Anpassungen gehen recht intuitiv mittels Drag & Drop sowie recht übersichtlichen Properties-Dialogen. Mein anfängliches Problem, daß die von mir per Hand positionierten Felder nie genau neben- oder untereinander standen, erledigte sich nach einem Blick in die Toolbar, wo man Felder auf alle Arten aneinander ausrichten kann. Alles in allem hatte ich ohne einen Blick in die Anleitung nach zwei Stunden einen recht komplexen Bericht mit Formatierungen, Variablen und geschachtelten Formeln (allerdings ohne Charts). Letzlich ist die Berichterstellung nicht schwieriger als mit BIRT, nur etwas anders. Man sollte sich von Anfang an überlegen, was man will, weil z.B. das nachträgliche Einfügen einer Spalte mehr Arbeit macht als in BIRT.

Ausgabe des Reports im Programm #

Auch das ist im Tutorial recht anschaulich erklärt. Im Grunde geht es aber so einfach, daß ich hier direkt ein Beispiel angebe, weil das mehr sagt als tausend Worte:

	public static void executeReportJrxml(String name) throws JRException,
			ClassNotFoundException, SQLException {
		// Datenbank
		Class.forName("org.hsqldb.jdbcDriver");
		Connection conn = DriverManager.getConnection(
				"jdbc:hsqldb:file:/home/tbayen/.Applikation/datenbank", "sa", "");
		// compilierten Report erzeugen
		InputStream strm = ReportDepotUebersicht.class.getClassLoader()
				.getResourceAsStream(name + ".jrxml");
		JasperReport report = JasperCompileManager.compileReport(strm);
		// Parameter festlegen und den Report ausfüllen
		JasperPrint printout = JasperFillManager.fillReport(report, null, conn);
		// und ausgeben
		JasperViewer.viewReport(printout);
	}

Tips und Tricks #

Zwei Besonderheiten sind mir aufgefallen. Zum einen bedarf es eines besonderen Tricks, um einen Text der Art "Seite 3 von 5" auf einen Report zu schreiben. Zum anderen störte mich am Anfang, daß man in Ausdrücken Werte in Java-Grundtypen immer in Java-Objekte wandeln musste. Beide Probleme sind in der FAQ auf der Webseite beschrieben. Auch das spricht für die Qualität der Dokumentation.

Integration in die EclipseIDE #

Obwohl in unten genanntem Link steht, daß es eine Eclipse-Integration für iReport geben sollte, konnte ich diese nicht finden. Es gobt jedoch entsprechende Plugins von anderen Anbietern. Da iReport mir sehr gut gefallen hat und von den JasperReport-Machern offiziell mitgepflegt wird, habe ich mir die Alternativen jedoch nicht angeschaut.

Man kann in Eclipse in den Preferences unter General -> Editors -> File Associations auch externe Programme einer Dateiendung zuordnen, so daß ich auch aus Eclipse heraus iReport starten kann. Dazu habe ich iReport in seinen Einstellungen so konfiguriert, daß es keine Cache-Dateien mehr in dem Verzeichnis erstellt, in dem die Report-Beschreibung liegt, sondern das alles in /tmp macht. Damit kann ich gut leben.

Zusammenarbeit mit HSQLDB #

Ich hatte einige Probleme beim Zugriff auf HSQLDB-Datenbanken. Zuerst dachte ich, daß läge daran, daß ich die mitgelieferte HSQLDB-Version 7.1 gegen die von mir benutzte, neuere Version 1.8 ausgetauscht hatte. Schliesslich bin ich aber dahintergekommen, daß es wohl an meinen Tabellennamen und Spaltennamen liegt, die nämlich Groß- und Kleinschreibung benutzen. Dadurch funktioniert der Query-Assistent leider gar nicht mehr. Dennoch kann man seinen Query-String von Hand eingeben, wenn man alle Namen in Anführungszeichen setzt. Tabellennamen kann man ohne Anführungszeichen benutzen, wenn man in der FROM-Clause den Namen nochmals als "AS"-Wert angibt. Hier mal am besten ein Beispiel aus meinem Demo-Projekt:

  SELECT "ISIN","name","kursdatum","schlusskurs","datum","anzahl","kurs", "anzahl"*"kurs" AS "preis"
  FROM "Wertpapier" Wertpapier, "Transaktion" Transaktion
  WHERE Wertpapier."id" = Transaktion."wertpapier"
  ORDER BY "ISIN", "datum"


Kategorien
KategorieJava, KategorieEclipse