Bearbeitung von Reportlayouts mithilfe von JasperReports
Allgemeines zu JasperReports
Jasper entstand 2001 als Zusatzmodul einer anderen Anwendung und wurde dann als Open-Source-Software veröffentlicht. Die wachsende Popularität das Produkts führte 2005 zur Gründung der Firma JasperSoft. Inzwischen bietet JasperSoft eine ausgewachsene Business-Intelligence-Suite an und vertreibt neben kostenloser Software auch kommerzielle Varianten sowie Dienstleistungen. Das englische Wort „Jasper“ bezeichnet den Halbedelstein Jaspis.
JasperReports ist eine Open-Source-Java-Berichtsbibliothek, die in jedes Java-Projekt eingebunden werden kann (daher besonders gut für die Integration in CURSOR-CRM geeignet). Mit ihr ist es möglich, Berichte als HTML, PDF, Flash (SWF), Excel (XLS), CSV, Word (RTF), TXT und XML zu exportieren und auf dem Bildschirm anzuzeigen oder zu drucken. Für eine Vorschaufunktion steht der 'Jasperviewer' zur Verfügung.
JasperReports wurde für Entwickler und Poweruser konzipiert. Die API ermöglicht die Erstellung, Manipulation und Ausführung der Report-Designs. Die Report Engine ist auf dem Applikationsserver integriert, wodurch der Zugriff auf die Reportdaten vereinfacht und beschleunigt wird.
Nachfolgend die Vorteile von JasperReports im Überblick:
Sehr gute Performance
Kostenlos (bis auf Handbücher)
Design-Vorlagen in weit verbreitetem XML-Standard
Beinhaltet zusätzlich vollständige Java-API
Unterstützt auch Internationalisierung
Verwendung geschachtelter Subreports ist prinzipiell möglich
Das Design-Programm iReport ermöglicht es, Berichtsentwürfe mit einer pixelgenauen Positionierung aller Berichtselemente, sowie komplexen Berichten mit mehreren Komponenten unter Verwendung von Unterberichten zu erstellen.
In dieser Dokumentation wird der Designer 'iReport' meist vereinfachend ebenfalls als "JasperReports" oder "Jasper" bezeichnet.
Berichtsentwurf und Bericht
Ein Berichtsentwurf ist eine Vorlage, die beschreibt, in welcher Form Daten auf Papier zu drucken sind, selbst aber keine Daten enthält. Er enthält Platzhalter, Formatierungen und andere Elemente.
Zusätzlich zum Entwurf braucht man immer eine Abfrage, die Daten aus einer Datenbank abruft. In CURSOR-CRM/EVI ist dies der Suchbehälter.
Der fertige Bericht ergibt sich dann aus dem Entwurf und den Daten. Die folgende Abbildung veranschaulicht das Zusammenspiel zwischen den Komponenten:
Ein Jasper-Berichtentwurf ist eine XML-Datei und kann daher auch von anderen Programmen erzeugt und bearbeitet werden. Genau das geschieht in CURSOR-CRM, wenn Sie einen neuen Berichtentwurf anfangen (siehe Kapitel: Neuen Bericht anfangen)
Dies ist der kleinste gültige Berichtsentwurf:
<?xml version="1.0"?>
<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD JasperReport//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="a ">
</jasperReport>
In 'iReport' wird er so dargestellt:
Die Benutzeroberfläche von iReport
Der Designer iReport zeigt einen Berichtsentwurf umgeben von Fenstern, welche Werkzeuge oder einfügbare Elemente enthalten.
Die Fenster, die Sie am häufigsten benutzen werden sind:
Document Inspector (links): hier erreichen Sie alle Felder, Abschnitte, Variablen, Bereiche und sonstigen Bestandteile des Reports, sowie den Report selbst. Sobald Sie ein Element markieren, können Sie beispielsweise rechts im Eigenschaftenfenster alle Eigenschaften sehen. Für Felder gilt: sobald Sie im Entwurf ein Feld markieren, ist es auch im Document Inspector markiert und umgekehrt.
Eigenschaften (rechts): hier finden Sie etwa die Größe und Schriftart eines Feldes, aber auch reportweite Eigenschaften wie Hoch/Querformat.
Palette (zuschaltbar über das Menü „Fenster“): hier finden Sie Objekte, die Sie in den Bericht einsetzen können: Textfelder, Grafiken usw.
Formatting Tools (zuschaltbar über das Menü „Fenster“): hier finden Sie zahlreiche Schalter, mit denen Sie etwa mehrere Felder bündig zueinander anordnen oder auf gleiche Größe bringen können.
Weitere Fenster sind bei Bedarf zuschaltbar.
Der Berichtsentwurf besteht aus waagerechten Abschnitten, auch sections genannt.
Diese werden bei der Ausführung des Berichts unterschiedlich oft und an unterschiedlichen Positionen ausgegeben. Zum Beispiel wird „pageFooter“ am Fuß jeder Seite ausgegeben, „detail“ wird für jeden Datensatz ausgedruckt.
Die Darstellung im Entwurf deutet daher die Funktion der Abschnitte nur näherungsweise an. So ist beispielweise im Entwurf „summary“ unterhalb von „pageFooter“ dargestellt.
Vergleich mit Crystal Reports
Wenn Sie schon mit dem Programm Crystal Reports gearbeitet haben, dann werden Sie sich auch in Jasper schnell zurechtfinden. Die folgende Tabelle soll vor allem als Wegweiser dienen, um den Umstieg zu erleichtern.
Eigenschaft | Crystal | Jasper |
---|---|---|
Daten | {TABELLE.Feld} | $F{Feldname} |
Parameter | {?Name} | $P{Name} |
Ausdrücke | Benannt, wieder verwendbar | Anonym |
Feldobjekt | Repräsentiert ein Daten- oder Formelfeld | Enthält anonymen Ausdruck |
Sortierung | Nach beliebigen Ausdrücken | Nach Datenfeldern |
Gruppierung | Beliebig auch nach Ausdruck | Ebenso, aber Vorsortierung erforderlich |
Filterung nach Ausdruck | Ja, Datensatzauswahlformel | Ja, Filterausdruck |
Benutzereingabe | Parameterfeld | Ebenfalls vorhanden, aber in CURSOR-CRM statt dessen über CURSOR-CRM-Suche |
Summe, Durchschnitt, ... | Variable | |
Laufende Summe | Laufende Summe | Variable |
Formatierung | Nur feldweise | Feldweise und über Stile |
Summen von Summen | Nicht möglich | Möglich |
iReport ohne CURSOR-CRM
CURSOR Software AG leistet keinen Support für die Verwendung von Jasper außerhalb von CURSOR-CRM/EVI.
Man kann den Reportdesigner 'iReport' als Berichtswerkzeug für beliebige Datenbanken ohne jeden Bezug zu CURSOR-CRM nutzen. Um eine Datenbank auszuwerten, muss man eine passende Datenquelle in iReport anlegen. Das geschieht im Menüpunkt Daten / Verbindungen/Datenquellen. Oft ist eine Datenbank bereits über ODBC zugänglich. Hier ist ein Beispiel für eine iReport-Datenquelle, welche auf eine ODBC-Datenquelle aufsetzt. Der Name der ODBC-Datenquelle sei XYZ. Es ist empfehlenswert, die iReport-Datenquelle ebenso zu nennen. Sie ist also wie folgt einzustellen:
Name: XYZ; Treibername: sun.jdbc.odbc.JdbcOdbcDriver; URL: jdbc:odbc:XYZ
Der erste Schritt bei der Erstellung eines neuen Berichts besteht dann in der Formulierung der Abfrage in SQL (Menüpunkt Daten / Report-Anfrage). Die Abfrage darf beliebig viele Tabellen und Unterabfragen umfassen; eben alles, was man in SQL mit SELECT tun kann. Die Antworttabelle wird dann mit Jasper-Mitteln ausgewertet.
Ausgabe von Feldinhalten und Feldbezeichnungen
Der Menüpunkt Ansicht / Reporfelder öffnet die Liste der verfügbaren Felder. Von dort können Sie das Feld in den Berichtsentwurf ziehen. Stellen Sie danach noch den passenden Stil ein. Oft ist es einfacher, ein schon vorhandenes Textfeld zu kopieren und seinen Ausdruck so abzuändern, dass er das gewünschte Datenfeld benennt.
Besonderheiten bei der Übergabe bestimmter Felder an Jasper
Bei einigen Feldern wird Ihnen folgendes auffallen: Sie nehmen in die Suche ein einziges Feld auf, aber in Jasper kommen gleich mehrere Felder an.
Dies ist beabsichtigt und dient der Vereinfachung beim Zugriff auf zusätzliche Informationen.
Bei Schlüsselfeldern (Beispiel: Anlass einer Aktivität) erhalten Sie Jasper-seitig immer drei Felder und drei Bezeichner. Man verwendet davon üblicherweise:
$F{Feldname_KeyName} = SCHLÜSSEL
$F{Feldname_KeyDesc} = Langtext
$R{Feldname_Pk} = Feldbezeichnung (siehe das Kapitel über Bezeichnungstexte)
Bei einigen anderen Feldern übergibt CURSOR-CRM noch zusätzliche verwandte Felder. So werden etwa zusätzlich zu einem Mitarbeiterkürzel auch Nachname, Vorname, Telefon und noch einige weitere Felder an den Bericht übergeben.
Welche zusätzlichen Felder dies sind, ist in CURSOR-CRM fest hinterlegt und kann nicht beeinflusst werden.
Auch hier ergibt $R{Feldname_Pk} die Feldbezeichnung.
Probleme mit Rich-Text-Feldern
Es kam vor, dass ein Report zwar startete, doch die Ausführung nicht zum Ende kam und der Speicher des Designers oder Applikationsservers zulief. Zu beobachten war dies beim Report 'Wochenbericht'. Dieser lieferte für etwa 1100 Aktivitäten in einer Woche rund 1300 Seiten.
Folgende Einstellungen mussten im Report geändert werden, um die Ausführung fehlerfrei zu ermöglichen:
Abschnittseigenschaften
Wird z.B. das Text-Feld der Aktivität im Detail-Bereich der Auswertung ausgeben, so muss die Option Teilbar immer aktiv sein.Überlauf
Ist der Aktivitätentext zu lang für die Seite, kann dieser umbrechen. Ist er aber zu lang für 2 Seiten, dann greift eine weitere Option namens Drucke wenn Details überlaufen. Diese Option ist zwingend zu deaktivieren.Markup
Neu mit JasperReport 3.0 ist die Option Markup. Diese ersetzt die Option Formatierter Text. Es ist zu beachten, dass zurzeit weder HTML noch RTF unterstützt werden.
Rechnen
Mitunter müssen Sie aus den CURSOR-CRM/EVI-Rohdaten weitere Werte erzeugen. In Berichten gibt es zwei typische Berechnungsformen:
Datensatzbezogen: beispielsweise je Datensatz A-B, wenn A und B Felder aus CURSOR-CRM/EVI sind.
Datensatzübergreifend: hier denkt man an eine Spaltensumme am Ende einer Tabelle.
Die folgende Tabelle stellt die beiden grundlegenden Berechnungsformen beispielhaft dar:
KundenNr | A | B | A-B |
---|---|---|---|
KD01 | 30 | 20 | 10 |
KD02 | 60 | 25 | 35 |
Gesamt | 90 | 55 | 45 |
Beide Berechnungsformen finden in Jasper statt, also nicht in CURSOR-CRM und nicht in der Suche.
Jasper verwendet Java-Ausdrücke für beide Berechnungsarten.
Das vorliegende Kapitel behandelt datensatzbezogene Berechnungen, das darauffolgende behandelt Summen.
Formelsyntax
Ähnliche wie in Excel schreibt man auch in Jasper Formeln in die rechteckigen Felder. Die Formelsyntax ist die Programmiersprache Groovy. Sie ähnelt Java, ist aber sowohl einfacher als auch mächtiger. Die alternativ einschaltbare Formelsprache JavaScript ist innerhalb des CRM nicht vorgesehen und CURSOR leistet keinen Support dafür.
Ihnen stehen alle Möglichkeiten von Java-Klassen zur Verfügung. Bei Fragen zur Formelsyntax können Sie daher auf allgemeine Quellen zu Java bzw. Groovy zurückgreifen. Oft liefert eine Suchmaschinenanfrage wie etwa java datumsdifferenz schon die Lösung. Noch ergiebiger sind englischsprachige Anfragen, im Beispiel also java date difference.
Groovy ermöglicht es, Java-Klassen zu erweitern und liefert solche Erweiterungen bereits mit. So ist es bspw. möglich, Zeitspannen zwischen Date-Objekten zu berechnen. Mehr dazu siehen unten.
Elementare Bausteine für Ihre Formeln sind:
$F{Feldname}: die Datenfelder aus der CURSOR-CRM-Suche; die verfügbaren Felder überblicken Sie mit dem Menüpunkt Daten/Reportabfrage.
$R{Feldname}: die zugehörigen Labels; einige weitere nützliche Texte (zum Beispiel "Summe"), auch frei definierbare, stehen ebenfalls als $R-Werte zur Verfügung
$V{Name}: spezielle reportinterne Werte, zum Beispiel Summen oder die Seitennummer
$P{Name}: Parameter aus CURSOR-CRM
Meist besteht eine Formel ausschließlich aus einem solchen $-Wert.
Die häufigsten vorkommenden Datentypen sind Integer, Double, Boolean, Timestamp, String
Falls Sie einen Report bearbeiten, der mit einer früheren Version von iReport oder CRM erstellt worden ist, dann ist noch Java als Formelsyntax eingestellt. Dies können Sie ganz einfach auf Groovy umschalten. In den Eigenschaften des Reports finden Sie die Eigenschaft 'Language' - das ist die Formelsyntax. Formeln in Java-Syntax funktionieren auch unter Groovy.
Einsetzen eines berechneten Ausdrucks in den Berichtsentwurf
Zunächst benötigen Sie ein sogenanntes Textfeld. Sie finden unter Fenster/Palette ein Hilfsfenster, das unter anderem ein Textfeld-Icon enthält. Klicken Sie auf dieses und klicken Sie dann in den Report.
Mit der rechten Maustaste öffnen Sie dann den Ausdrucks-Editor (edit expression).
Der Ausdrucks-Editor
An allen Stellen, an denen Sie einen Ausdruck sehen, finden Sie auch einen Schalter, der den Ausdrucks-Editor öffnet, der Ihnen beim Schreiben hilft. Eine weitere Mögichkeit zum Öffnen des Editors ist der Punkt 'Edit expression' im Kontextmenü jedes Feldobjektes.
Ein Doppelklick auf einen Feldnamen fügt $F{Name} in den Ausdruck ein.
Ein Doppelklick auf einen Methodennamen fügt $F{Name}.Methode() in den Ausdruck ein.
Feldbezeichnungen ($R{Name}) müssen Sie "von Hand" eingeben.
Sie können Zeilenumbrüche und Leerzeichen einstreuen, um die Lesbarkeit zu verbessern.
Über den Schalter Apply wird der Ausdruck gespeichert.
Beispiele für Ausdrücke
Freizahl1 + Freizahl2
Der Ausdruck lautet $F{Freenumber1} + $F{Freenumber2}
Dieses Beispiel zeigt bereits die wesentlichen Einstellungen eines berechneten Feldes.
Eigenschaft | Wert |
---|---|
Style | Decimal |
Text field expression | $F{Freenumber1} + $F{Freenumber2} |
Expression Class | java.lang.Double |
Erster Tag des Monats, in dem ein Datum liegt
new Date( $F{Salesdate}.getYear(), $F{Salesdate}.getMonth(), 1 )
Ausdrucksklasse: java.util.Date
Muster: dd.MM.yyyy
WENN-Formel
Die aus Tabellenkalkulationen bekannte Formel
WENN(a, b, c)
lautet in Java so:
(a?b:c)
Abfangen von Leerwerten
Das Beispiel "erster Tag des Monats" verursacht Fehlermeldungen, wenn das Feld 'Salesdate' (Kaufdatum) in CURSOR-CRM/EVI bei einem Datensatz leer ist. Im folgenden Beispiel ist derselbe Ausdruck in eine geeignete WENN-Formel verpackt:
(($F{Salesdate} == null)
? new Date(0,0,0)
:new Date( $F{Salesdate}.getYear();$F{Salesdate}.getMonth(),1))
Der eigentliche Ausdruck in der dritten Zeile wird jetzt immer mit korrekten Daten gefüttert.
Name und Kürzel des Mitarbeiters
Dieses Beispiel ergibt den Projektleiter in der Form Nachname, Vorname [Kürzel]. CURSOR-CRM/EVI erlaubt auch einen sogenannten Leerschlüssel (meist ein Fragezeichen), was hier abgefangen wird:
("#EMPTY-KEY#".equals($F{PjManager_Pk}))
? $F{PjManager_ShortCut}
:$F{PjManager_LastName} + ","+$F{PjManager_FirstName}+
"("+$F{PjManager_ShortCut} + ")"
Umwandlung eines Datums in einen String
(new java.text.SimpleDateFormat("MMMM yyyy")).format($F{Salesdate})
Beachten Sie, dass hier ein mit new erzeugtes Objekt in Klammern steht und die Methode format dieses Objektes genutzt wird: (new …).format(…). Das Ergebnis ist bereits vom Typ 'String', was ein erlaubter Ausdruckswert ist, so dass das Ganze nicht mit new String(…) umgeben werden muss.
Das angegebene Format MMMM yyyy ergibt zum Beispiel Juni 2007.
Erfolgssausicht und Erwartungswert einer Anfrage
In CURSOR-CRM wird die Erfolgsaussicht einer Anfrage als Ganzzahl zwischen 0 und 100 gespeichert. Der folgende Ausdruck ergibt den damit gemeinten Wahrscheinlichkeitswert als reelle Zahl zwischen 0 und 1, was für Berechnungen besser geeignet ist:
$F{ChanceSuccessKey_KeyName} / 100.0
Es ist wichtig, dass dort 100.0 steht und nicht einfach 100 – es käme sonst rein ganzzahlige Arithmetik zum Einsatz, und das Ergebnis wäre stets 0.
Anfrageauswertungen verarbeiten oft den Erwartungswert, also Wert mal Wahrscheinlichkeit. Der Jasper-Ausdruck dafür lautet
$F{Projectvalue} * $F{ChanceSuccessKey_KeyName} / 100.0
Feldbezeichnung: $R{Expectation}
Tag, Monat, Jahr
Ausdruck | Ergebnis |
---|---|
$F{StartDate}.getYear() + 1900 | Jahr |
$F{StartDate}.getMonth() + 1 | Monat (1 bis 12) |
$F{StartDate}.getDate() | Tag (1 bis 31) |
Beachten Sie umgekehrt, dass zum Erzeugen eines Date-Objekts die Jahres- und Monatszahlen in der unkorrigierten Form anzugeben sind. Den 24.12.2050 erhalten Sie also wie folgt:
new Date( 150, 11, 24 )
Zeitspanne in Tagen
Der folgende Ausdruck berechnet die Zeitdauer einer Aktivität in ganzen Tagen, wobei sowohl der erste als auch der letzte Tag mitgezählt werden:
$F{EndDate} - $F{StartDate} + 1
Zeitspanne in Monaten
Der folgende Ausdruck berechnet die Zeitdauer einer Aktivität in ganzen Monaten, wobei sowohl der erste als auch der letzte Monat mitgezählt werden:
($F{EndDate}.getYear()*12 + $F{EndDate}.getMonth())
-
($F{StartDate}.getYear()*12 + $F{StartDate}.getMonth())
+
1
Zeitspanne in Jahren
Der folgende Ausdruck berechnet die Zeitdauer einer Aktivität in ganzen Jahren, wobei sowohl das erste als auch das letzte Jahr mitgezählt werden:
$F{EndDate}.getYear() - $F{StartDate}.getYear() + 1
"Heute"
Der folgende Ausdruck liefert das aktuelle Datum:
new Date()
Datumsvergleich
Der folgende Ausdruck ergibt einen Wert, welcher besagt, ob das Datum A vor dem Datum B liegt:
$F{A}.before( $F{B} )
Anwendungsbeispiel: das Enddatum eines Vertrages kann leer sein, dann ist der Vertrag unbefristet. Es kann aber auch ausgefüllt sein, wobei der Vertrag noch läuft oder schon abgelaufen ist. Es gibt also genau drei Fälle. Der folgende Ausdruck ergibt eine Zeichenfolge, welche den jeweiligen Fall bezeichnet.
( $F{ContEndDate} == null ? "unbefristet" :
( $F{ContEndDate}.before(new Date()) ? "abgelaufen" :
"laufend"
))
Nach diesem Ausdruck können Sie auch gruppieren, sofern Sie die Daten nach ContEndDate sortiert haben.
Substrings
Die Methode substring funktioniert in Java wie folgt:
s.substring(a,b) = Teil von Position a einschließlich bis b ausschließlich, wobei 0≤a<b
Summen
Hiermit sind vor allem Summen, Durchschnittswerte und ähnliches über eine variable Anzahl von Datensätzen gemeint. Fortgeschrittene Verwendungen beinhalten das Herausziehen von Werten aus einzelnen speziellen Datensätzen.
Man bildet sie in Jasper mit Hilfe von sogenannten Variablen. Variablen werden über den Menüpunkt Ansicht / Reportvariablen verwaltet.
Anlegen einer Variable
Beispiel: das Feld 'ProjectValue' soll für eine Gruppe aufsummiert werden.
Hierzu legt man eine Variable an mit folgenden Eigenschaften:
Variablenname: ProjectValue_Total
Variablenklasse: java.lang.Double
Kalkulationsart: Summe
Typ zurücksetzen (gemeint ist: unter welchen Umständen nimmt die Variable erneut den Initialwert an): Gruppe
Gruppe zurücksetzen: Hier trägt man den Namen der Gruppe ein.
Ausdruck: $F{Projectvalue}; allgemein ein datensatzbezogener Ausdruck, den man aufsummiert haben möchte.
Initial Value Expression: kann man offenbar leer lassen.
Eine solcherart definierte Summe steht erst am Ende einer Gruppe bzw. eines Berichts zur Verfügung, kann also nicht schon eingangs im Sinne einer Übersicht genutzt werden. Insbesondere kann man nicht Einzelwerte in Prozent der Summe ausdrücken.
Vordefinierte Variablen
Folgende Variablen sind in Jasper schon vordefiniert und können auch nicht geändert werden:
REPORT_COUNT ist die Nummer des aktuellen Datensatzes, beginnend mit 1; am Ende des Reports, etwa im Bereich Summary, ist dies somit die Anzahl der Datensätze insgesamt.
Gruppenname_COUNT ist analog dazu die Nummer des aktuellen Datensatzes innerhalb der aktuellen Gruppe,
Ausgabe einer Variablen im Bericht
Man kann eine Variable wie ein einfaches Feld in den Berichtentwurf ziehen.
In Ausdrücken hat sie den Namen $V{Name}. Man findet Sie auch im Ausdruckseditor.
Summen von Summen
Jasper erlaubt es, bereits gebildete Summen weiter aufzusummieren (man kann natürlich auch Mittelwerte von Summen bilden, also eine andere Berechnungsart anschließen).
Dabei ist jedoch zu beachten, dass man der übergeordneten Summe mitteilt, dass ihre Eingangdaten aus einer Gruppe stammen. Nur so kann Jasper die Ergebnisse korrekt aufsummieren.
Stellen Sie deswegen bei der Summen-Summierungs-Variablen folgendes ein:
Zählertyp: Gruppe
Zählgruppe: Name der untergeordneten Gruppe, deren Ergebnis Sie weiterverwenden wollen.
Bezeichnungstexte
Außer Daten muss ein Bericht auch feststehende Texte ausgeben. Dies sind meist Bezeichnungen zu den danebenstehenden Datenfeldern, aber auch längere erläuternde Texte sind möglich.
Als Stil des Designobjekts sollte Label eingestellt werden.
Die Bezeichnungen von Feldern und Entitäten sowie einige weitere oft gebrauchte Wörter wie 'Summe' und 'Seite' stehen Ihnen in Ausdrücken als sogenannte Ressourcen in der Syntax $R{Ressourcenname} zur Verfügung. Der Datentyp ist immer String.
Der Ausdruckseditor zeigt nicht die verfügbaren Ressourcen an. Man kann sie aber während der Reportbearbeitung der Datei Reportname.properties entnehmen, wenn Reportname.jrxml die Datei ist, die man soeben bearbeitet. Die Namen der wichtigsten Ressourcen werden in den nachfolgenden Abschnitten genannt.
Bezeichnung eines Feldes
Die Bezeichnung eines einzelnen Feldes erhalten Sie mit $R{Feldname}.
Beispiel: $R{Matchcode} ist die Bezeichnung des Feldes Matchcode (Kurzname).
Der Bezeichnungstext ist immer aktuell, sogar wenn später über die Feldeigenschaften die Bezeichnung geändert wird.
Bezeichnung einer Entität
Die Bezeichnung einer Gesamtentität erhalten Sie mit $R{Entitätsname}.
Beispiel: $R{Customer} steht für die Bezeichnung der Gesamtentität Geschäftspartner.
Selbstdefinierte Ressourcenstrings
Im Knoten 'JasperReports' finden Sie einen Schalter namens Bezeichnungen. Er öffnet eine Tabelle, in der Sie weitere Ressourcen mehrsprachig hinterlegen können. Diese Bezeichner sind nicht reportspezifisch. Sie haben in allen Reports denselben Inhalt.
Die Namen selbstdefinierter Ressourcen beginnen stets mit C2_. Alle selbstdefinierten Ressourcen stehen in allen Reports zur Verfügung. Die Übertragung in ein anderes System, etwa von Test nach Produktiv, erfolgt durch manuelles Neuanlegen.
Dieses Verfahren ist sinnvoll, wenn ein solcher Bezeichner in mehreren Reports erscheinen sollen. Man kann ihn dann an einer Stelle zentral abändern.
Sprachcode des Anwenderclients
Um einen Bezeichnungstext, der nur in einem Report vorkommt, mehrsprachig zu machen, brauchen Sie keinen Ressourcenstring anzulegen, sondern machen im Report selbst eine Fallunterscheidung nach der Sprache.
Die momentane Sprache des Anwenderclients erhalten Sie mit dem Ausdruck
$R{LanguageCode}
Er kann die Werte de, en, it, si (Teilmenge von ISO 639-1) annehmen.
Beispiel
Für Englisch und Italienisch wird ausdrücklich ein bestimmter Text angegeben, in allen anderen Fällen erscheint der deutsche Text:
($R{LanguageCode}.equals("en") ? "English" :
($R{LanguageCode}.equals("it") ? "Italiano" :
"Deutsch"))
Die Bezeichner von Feldern und Entitäten haben bereits automatisch die richtige Sprache.
Berechneter Zugriff auf Ressourcenstrings
Hintergrundwissen: Folgende Formeln sind gleichwertig:
$R{C2_PlzBereich6} /* Ressourcenname ohne Anführungszeichen (entspricht einem Variablennamen) */
str( "C2_PlzBereich6" ) /* Ressourcenname als String */
Anwendung: Folgende Formel greift je nach erster Stelle der Postleitzahl auf die Ressourcenstrings C2_PlzBereich0, C2_PlzBereich1 usw. zu:
str( "C2_PlzBereich" + $F{ZipCode}.substr(0,1) )
Sortieren
Die Sortierreihenfolge stellen Sie über den Schalter Sortieroptionen in der Reportabfrage ein. Diese erreichen Sie über das Kontextmenü des Gesamtreports aus dem Reportinspektor, oder alternativ über den kleinen Button neben dem Prview-Button.
Die Sortieroptionen selbst sind eine einfache Auflistung der Felder, nach denen zu sortieren ist
Man kann nur nach Feldern sortieren, nicht nach Ausdrücken. Seit Jasper 4 kann man zwar auch nach Variaben sortieren, es ist aber nicht klar, was das bewirkt, da der Werteverlauf einer Variablen ja selbst wieder von der Sortierreihenfolge abhängt.
TOP-N-Sortierung
Typisches Ziel: Es sollen die 5 größten Kunden selektiert werden, gemessen am Feld 'Umsatz'.
Dies muss an zwei separaten Stellen eingestellt werden:
Dass es um das Feld 'Umsatz' geht, stellen Sie im Report ein, indem Sie diesen wie oben beschrieben nach dem Feld 'Umsatz'. absteigend sortieren.
Dass diese sortierte Liste auf 5 Elemente einzuschränken ist, stellen Sie bei der Suche ein, indem Sie die Eigenschaften 'Anzahl der Ergebnisse' ändern. Siehe dazu nachfolgende Abbildung:
Gruppieren
Die Grundaufgabe der Gruppierung ist die Gliederung des Reports. Darüber hinaus bilden spezielle Gruppierungstechniken mächtiges Werkzeug zur Steuerung des Reports.
Auch bei einer Textverarbeitung wie Word gibt es eine Gliederung in Form von Kapiteln, Abschnitten, Unterabschnitten und so weiter. Der Unterschied: In Word tippen Sie alle Überschriften einzeln ein. Bei einem Report definieren Sie stattdessen eine Regel, die anhand von Datenfeldern beschreibt, an welchen Stellen im Report ein neues Kapitel beginnen soll. Dann definieren Sie eine weitere Regel, die besagt, an welchen Stellen innerhalb eines Kapitels ein neuer Abschnitt beginnen soll. Eine dritte Regel beschreibt Unterabschnitte und so weiter. Gewöhnlich stehen dann Datensätze, die ein Merkmal gemeinsam haben, auch optisch beieinander. Daher kommt die Bezeichnung "Gruppe".
In einem Bericht beginnt eine Gruppe mit einem speziellen Bereich, dem Gruppenkopf. Dort haben Sie bereits Zugriff auf den ersten Datensatz der Gruppe. Sie können daher ein Feld in den Gruppenkopf setzen, um es als dynamisches Überschriftsfeld zu benutzen.
Auf den Gruppenkopf folgen die einzelnen Datensätze (und ggf. natürlich innere Gruppen), und am Ende kommt der Gruppenfuß, wo man etwa eine Zwischensumme ausgeben kann. Im Gruppenfuß haben Sie außerdem noch Zugriff auf den letzten Datensatz der Gruppe.
Die Gruppen verwaltet und bearbeitet man mit dem Report Inspector.
Gruppe hinzufügen
Das Kontextmenü (rechte Maustaste) auf das Wurzelelement im Report Inspector enthält den Punkt Add Report Group. Dieser startet einen kleinen Assistenten, auf dem sie wählen, wie die Gruppe heißt und wonach sortiert wird.
Beispiel 1
Kunden sollen nach dem Feld Ort ($F{City}) gegliedert werden
Als Gruppenname bietet sich "Ort" an. Das Feld City kann über dein Drop-Down ausgewählt werden.
Im Berichtentwurf sehen Sie jetzt zwei neue Bereiche: „Ort Group Header 1“ und „Ort Group Footer 1“.
Setzen Sie in den Gruppenkopf ein Feld mit dem Ausdruck $F{City} in großer Schrift. Das wird die Überschrift des jeweiligen „Kapitels“
Sie besitzen jetzt übrigens auch eine neue Variable: $V{Ort_COUNT}. Das ist die laufende Nummer des Datensatzes innerhalb der Gruppe. Im Gruppenfuß ist es die Anzahl der Datensätze in der Gruppe. Setzen Sie folgende zwei Textobjekte in den Gruppenfuß, um dies auszunutzen:
Bezeichner
Style: Label
Ausdruck: "Anzahl Kunden in " + $F{City}
Anzahlfeld
Style: Integer
Ausdruck: $V{Ort_COUNT}
Im Hintergrund läuft in Jasper ein einfacher Mechanismus ab: Immer dann, wenn ein Kunde in einem anderen Ort ist als der vorige Kunde, gibt Jasper ohne nachzudenken einen Gruppenfuß (für den vorigen Ort) und einen Gruppenkopf aus und setzt die entsprechend eingestellten Variablen zurück
Beispiel 2
Aktivitäten sollen nach dem Jahr gruppiert werden
Man kann durchaus nach einem frei definierten Ausdruck gruppieren. Wichtig ist jedoch, dass Sie auch eine passende Sortierung herstellen können.
Dies funktioniert genauso wie bei der einfachen Gruppierung. Einziger Unterschied: Der Gruppenausdruck ist nicht einfach $F{StartDate}, sondern
$F{StartDate).getYear() + 1900
(Zur Erinnerung: getYear()
liefert die Zahlen 97, 98, 99, 100, 101, ... )
Ein anderer nützlicher Fall betrifft die Gruppierung nach dem Kunden. Sie sortieren die Daten nach dem Kundenkurznamen, gruppieren dann aber sicherheitshalber nach dem $F{Pk} des Kunden. In den Gruppenkopf schreiben Sie trotzdem den Kurznamen. So werden die Gruppen in der Reihenfolge der Kurznamen ausgegeben.
Gruppe entfernen
Der Befehl Delete Group findet sichim Kontextmenü sowohl des Gruppenkopfes wie auch des Gruppenfußes.
Pseudogruppen
Den Gruppenmechanismus können Sie zweckentfremden, um mehr Bereiche zu haben oder die Berechnung von Variablen zu steuern. Eine solche Gruppe, die eigentlich keine Daten gruppiert, nennt man Pseudogruppe.
Eine Pseudogruppe ist einfach eine normale Gruppe mit einem geschickt gewählten Gruppenausdruck.
Häufig eingesetzte Pseudogruppen:
Auf Reportebene: der Gruppenausdruck ist eine Konstante, zum Beispiel null. Die Gruppe hat nur einmal, eingangs des gesamten Berichtes, einen Gruppenkopf, umfasst alle Datensätze, und hat am Ende des Berichtes einen Gruppenfuß. Diese können die Bereiche „title“ und „summary“ ersetzen oder ergänzen. Durch Verschachteln mehrerer solche Gruppen erhalten Sie sogar mehrere Pseudo-Berichttitel und Pseudo-Summaries.
Auf Gruppenebene: Sie legen innerhalb Ihrer Gruppe eine weitere Gruppe mit demselben Ausdruck an. So haben Sie gleich zwei Gruppenköpfe statt nur einem.
Auf Detailebene: Der Gruppenausdruck ist $V{REPORT_COUNT}. Gruppenkopf und Gruppenfuß erscheinen bei jedem Datensatz. Sie sind zusätzliche oder alternative Detailbereiche. Wenn Sie zum Beispiel so viele Felder haben, dass Sie für den Detailbereich mehr als eine Seite brauchen, dann kommen Sie mit dieser Technik weiter.
Im Zusammenspiel mit der Bereichseigenschaft „Ausgeben wenn“ ermöglicht diese Technik Ihnen auch, je nach Bedingung eine Variante eines Bereichs auszugeben.
Unterberichte
Ein Unterbericht (Synonyme: Subreport, Unterreport) ist ein kleiner Report innerhalb des Hauptberichts. Er gibt eine eigene Datenmenge wieder, und man kann innerhalb des Unterberichtes (fast) alle Reporttechniken (Felder, Gruppen, Summen, Sortierung, Diagramme...) verwenden.
Verwendungsbeispiele
Ein Unterbericht kann eine Datenliste zum Detaildatensatz enthalten. Dafür braucht man eine Tabellensuche (siehe unten). Beispiele für solche Unterberichte finden Sie im Geschäftspartnerportrait. Diese Unterberichte drucken Listen von Gesprächspartnern, Anfragen, Verträgen und so weiter. Mit einer einzigen großen Hauptsuche und Gruppierungen wäre das nicht machbar – die Suche ergäbe eine Liste aller Kombinationen der Gesprächspartner/Anfragen/Verträge untereinander, und der Bericht könnte diese nicht mehr entwirren.
Statt einer Datenliste zum Einzeldatensatz kann ein Unterbericht die Hauptsuche enthalten. Dies ist beispielweise nützlich, um diese Daten noch einmal anders, meist verdichtet und/oder als Diagramm, darzustellen. Auch um im die Datensatzanzahl oder eine Gesamtsumme handhaben zu können, kann ein solcher Unterbericht erforderlich sein (siehe Daten aus Unterbericht empfangen).
Vom Layout her kann ein Unterbericht stark reduziert werden und im Extremfall lediglich eine Summe oder ein kleines Diagramm ausgeben.
Tabellensuche hinzufügen
Eine Tabellensuche brauchen Sie nur für den 1:n zugeordnete Daten zum Einzeldatensatz, also den Fall "Datenlisten"
Im ersten Schritt fügen Sie der komplexen Suche eine erweiterte Suche hinzu. Als Typ stellen Sie eine Tabellensuche, so wird diese Suche auch in diesem Abschnitt bezeichnet.
Als Name der Suche sollten Sie den Namen der komplexen Suche verwenden, gefolgt von einem Bezeichnungszusatz (also JR_Berichtname_Ansprechpartner).
Die Tabellensuche muss von derselben Entität ausgehen wie die Hauptsuche. Sie brauchen nur das Feld Primärschlüssel und hängen dann die Entität, um die es im Unterbericht eigentlich gehen soll, als Besitzt-Zweig darunter. Hier ist ein Beispiel für eine Tabellensuche, die zu den Geschäftspartnern (welche aus der Hauptsuche kommen) die Ansprechpartner liefert:
Diese Tabellensuche muss mit der Hauptsuche verknüpft werden. Dies geschieht wie folgt:
In der Hauptsuche übergeben Sie den Primärschlüssel an einen Exportparameter (Doppelklick auf das Feld Exportparameter). Geben Sie dem Parameter eine Namen und merken Sie sich ihn.
In der Tabellensuche stellen Sie beim Primärschlüssel des Geschäftspartners folgendes ein:
Template Platzhalter (wird zur Laufzeit gesetzt). Übernehmen Sie dann durch Klick auf Template übernehmen dieses Template in die darunter stehende Liste. Siehe hierzu die Bildschirmfotos unten. Setzen Sie auch das Häkchen Aufnahme in die Selektionsergebnismenge.
Verbinden Sie außerdem in der Tabellensuche den Parameter als Eingabeparameter mit dem Primärschlüssel.
Achten Sie auf den Aliasnamen der Tabellensuche (siehe Abschnitt Namenskonventionen).
So wird ist einer von – Platzhalter (wird zur Laufzeit gesetzt) eingetragen:
Falls der Report so arbeiten soll, dass der Anwender die Anzahl Datensätze im Unterbericht begrenzen kann (Beispiel Geschäftspartnerportrait), dann muss statt ist einer von vielmehr die Funktion Erste N Datensätze für Tabellensuchen verwendet werden, und zwar ebenfalls zusammen mit dem Template Platzhalter (wird zur Laufzeit gesetzt). Diese Funktion arbeitet anders und auch etwas langsamer, denn sie sucht zu jedem Datensatz der Hauptsuche maximal N Datensätze der Tabellensuche.
Unterbericht hinzufügen
Um dem Hauptbericht einen Unterbericht hinzuzufügen, betätigen Sie in der Adminkonsole (Maske JasperReports) den Schalter Unterreport hinzufügen. CURSOR-CRM erzeugt dann einen Unterbericht, der bereits korrekt in den Hauptbericht integriert ist.
Unterbericht bearbeiten
Hierzu öffnen Sie den Hauptbericht zum Bearbeiten und klicken mit der rechten Maustaste auf den Unterbericht-Platzhalter.
Das Kontextmenü enthält dann die Möglichkeit, den Entwurf des Unterberichts zu öffnen.
Die Eigenschaften des Unterbericht-Platzhalters (ebenfalls im Kontextmenü) ermöglichen es auch, Daten mit dem Unterbericht austauschen.
Tipp
Initial belegt der Unterbericht-Platzhalter die gesamte Seitenbreite (595 bzw. 751 Punkt). Sie können den Platzhalter natürlich kleiner machen. Dann sollten Sie auch im Unterbericht-Entwurf die dargestellte Breite anpassen. Dazu dient der Menüpunkt Bearbeiten/Reporteigenschaften. Ändern Sie zunächst die Maßeinheit in "Pixel" (gemeint sind freilich Punkt). Nun können Sie exakt den Wert eintragen, den im Hauptbericht der Unterbericht-Platzhalter als Breite hat.
Daten aus dem Unterbericht empfangen
Häufiger Anwendungsfall: Unterbericht berechnet eine Zahl, Hauptbericht verarbeitet diese Zahl weiter.
Beispiel
Der Hauptbericht kennt die Anzahl der Datensätze normalerweise erst am Ende. Nun möchten Sie aber schon vorher einige Anzahlen als Prozent der Gesamtzahl darstellen. Dann muss ein Unterbericht die Datensatzanzahl ermitteln und zurückgeben.
Vorgehensweise:
Jede beliebige Variable des Unterberichts kann die Rolle des "Senders" übernehmen. Sie können auch eine vordefinierte Variable wie $V{REPORT_COUNT} verwenden. Für unser Beispiel ist sie sogar besonders gut geeignet. Es gilt der Wert, den die Variable zum Ende des Unterberichts hat. Sie brauchen im Unterbericht nichts zu modifizieren. Sie müssen Sich lediglich den Namen der Variablen merken.
Legen Sie im Hauptbericht eine Variable als "Empfänger" an, beispielsweise $V{Anzahl_Datensaetze}. Eine Empfänger-Variable hat folgende Besonderheiten:
Die Kalkulationsart ist System. Die eigentliche Kalkulationsart wird stattdessen bei der Subreport-Rückgabedefinition eingetragen.
Der Datentyp muss natürlich zur Variablen aus dem Unterbericht passen.
Klicken Sie im Hauptbericht mit der rechten Maustaste auf den Unterbericht-Platzhalter. In den Eigenschaften gehen Sie auf die Lasche 'Subreport (andere)', Unterlasche 'Subreport Rückgabewerte'. Dort verbinden Sie die beiden Variablen, indem Sie mit 'Hinzufügen' die Variablennamen eintragen (siehe Abbildungen).
Sie können beliebig viele Daten in den Unterbericht hinein senden und aus ihm empfangen. Sie müssen nur die entsprechenden Variablen bzw. Parameter anlegen.
Der empfangene Wert steht erst im nächsten Berichtsbereich zur Verfügung. Lösung ggf. durch eine Pseudogruppe.
Damit ist gemeint:
Steht der sendende Unterbericht im Bereich "title", dann haben Sie seinen Rückgabewert nicht im "title", sondern erst im ersten Gruppenkopf bzw. beim ersten Detailbereich.
Steht der sendende Unterbericht im Bereich "detail", dann haben Sie seinen Rückgabewert erst beim nächsten Datensatz, nicht beim aktuellen Datensatz.
Lösung: Dem Berichtsbereich, in dem Sie den Rückgabewert brauchen, stellen Sie mit Hilfe einer Pseudogruppe (siehe Kapitel Gruppen) einen Hilfsabschnitt voran. In diesen hinein verschieben Sie den sendenden Unterbericht. Oder (als Alternative) Sie setzen dort einen zusätzlichen Unterbericht hinein, dessen einzige Aufgabe das Zurückgeben des Rückgabewertes ist.
Beispiel: Mit der Anzahl der Datensätze rechnen
Die Variable $V{REPORT_COUNT} des Hauptberichts enthält bekanntlich erst am Ende des Hauptberichts die gesamte Anzahl der Datensätze. Gelegentlich braucht man diese Anzahl aber schon früher, manchmal sogar ganz zu Beginn, um damit zu rechnen (etwa eine Anzahl in Prozent der Gesamtzahl). Die Feldeigenschaft "Auswertungszeitpunkt" ist hier keine Lösung, sie vertuscht das Problem nur oberflächlich.
Lösung: Sie erzeugen (in der Admin-Konsole!) einen neuen Unterbericht. Dieser Unterbericht basiert auf der Hauptsuche, also nicht auf einer Tabellensuche. Diesen Unterbericht stellen Sie an den Anfang des Berichts. Ihn lassen Sie seine eigene Variable REPORT_COUNT zurückgeben.
Falls Sie die Gesamtzahl in einem Titelblatt auswerten wollen, müssen Sie auf den Bereich "title" verzichten und ihn durch zwei Pseudogruppen auf Berichtsebene ersetzen - der erste Gruppenkopf (sehr klein) enthält den Unterbericht, den zweiten (größer) gestalten Sie als Titelblatt. Mehr dazu später unter Beispiele anhand ausgewählter Aufgaben.
Daten in Unterbericht hinein senden
Dies ist etwas einfacher und flexibler als das Empfangen.
Umsetzung:
Legen Sie im Unterbericht einen Parameter (nicht Variable!) an mit folgenden Eigenschaften:
Name: beliebig, aber merken Sie ihn sich für den Hauptbericht (am besten "herauskopieren")
Datentyp: muss dem gewünschten Wert aus dem Hauptbericht entsprechen
Kontrollkästchen 'interaktiv abfragen' unbedingt abwählen, falls angehakt
Klicken Sie im Hauptbericht mit der rechten Maustaste auf den Unterbericht-Platzhalter. In den Eigenschaften gehen Sie auf die Lasche 'Subreport (andere)', Unterlasche 'Subreport Parameter'. Dort tragen Sie den Parameternamen ein sowie einen beliebigen Ausdruck. Den Wert des Ausdrucks sendet der Hauptbericht dann in den Unterbericht.
Im Unterbericht nutzen Sie den Parameter in Ausdrücken mit der Syntax $P{Name}; also wie eine Variable, nur mit $P statt $V.
Sie können beliebig viele Daten in den Unterbericht hinein senden und aus ihm empfangen. Sie müssen nur die entsprechenden Variablen bzw. Parameter anlegen.
Diagramme
Erstes Beispiel: Ein einfaches Kuchendiagramm
Ziel:
Je Gruppe X ein Kuchenstück mit der Summe des Feldes Y.
Vorgehen:
Nach X sortieren: Daten / Reportrtanfrage / Sortieroptionen
Nach x gruppieren: Ansicht / Reportgruppen
Variable Summe_Y anlegen, die $F{Y} aufaddiert und pro Gruppe zurückgesetzt wird.
Abschnitt summary sichtbar machen, sofern noch nicht geschehen.
Neues Diagramm einfügen; mit rechter Maustaste Diagrammeigenschaften aufrufen. Lasche Diagrammdaten, darauf Lasche Details; dort folgendes eintragen:
Ausdruck für Schlüssel: $F{X} ("Kuchenstück")
Ausdruck für Wert: $V{Summe_Y} ("Größe des Kuchenstückes")
Bezeichnungen
Den Inhalt der gelben Tortenstückbezeichnungen ändert man über den entsprechenden Ausdruck unterhalb der Ausdrücke für Schlüssel und Wert. Je nach Feldtyp von $F{X} kann das $F{X} selbst sein oder beispielsweise $F{X}.toString().
Bezeichnungen mit Prozentangabe
Falls Sie in der Bezeichnung des Tortenstücks den Prozentanteil bezüglich der Gesamtsumme benötigen, dann müssen Sie das Diagramm in einem separaten Unterbericht ausgeben.
Kehren Sie zunächst in die Administrationskonsole zurück und fügen Sie dem Bericht einen Unterbericht hinzu. Weisen Sie dem Unterbericht die Hauptsuche zu (so dass Sie im Unterbericht dieselben Daten haben). Öffnen Sie dann wieder den iReport-Designer.
Der Unterbericht wird durch ein graues Rechteck repräsentiert. Öffnen Sie den Unterbericht und legen Sie im Unterbericht einen neuen Parameter an (Menüpunkt Ansicht / Reportparameter). In diesem Beispiel möge er Gesamtsumme_vom_Hauptbericht heißen.
Wechseln Sie wieder zum Entwurf des Hauptberichts. Legen Sie eine Variable für die Gesamtsumme von $F{X} an. In diesem Beispiel möge sie $V{Gesamtsumme} heißen.
In den Eigenschaften des grauen Rechtecks, welches den Unterbericht repräsentiert, wird unter anderem die Kommunikation zwischen Haupt- und Unterbericht eingerichtet, indem Variablen und Parameter verknüpft werden. Verknüpfen Sie $P{Gesamtsumme_vom_Hauptbericht} mit $V{Gesamtsumme}.
Nun steht Ihnen im Unterbericht in allen Ausdrücken die Gesamtsumme zur Verfügung.
Legen Sie im Unterbericht die benötigten Gruppen und das Diagramm an.
Der folgende Ausdruck ergibt Strings wie ABC(35%) und XYZ(65%). Er kann als Bezeichnungsausdruck im Diagramm dienen, oder auch als einfaches Textfeld.
$F{X} + " (" + (new Integer((new Double(0.5+100.0* $V{Summe_Y}.doubleValue() /$P{Gesamtsumme_vom_Hauptbericht}.doubleValue())).intValue())).toString() + "%)"
Farben und Transparenz der Tortenstücke
Die Eigenschaft Farben der Reihen kann eine Liste von Farben aufnehmen. Jasper entnimmt die Farben zunächst aus dieser Liste, danach aus einer Standardpalette.
Die Eigenschaft Vordergrund Alpha bestimmt den Grad der Durchsichtigkeit der Tortenstücke. Es muss eine reelle Zahl zwischen 0 und 1 sein. Der Wert 0 macht die Tortenstücke so durchsichtig, dass sie unsichtbar werden. Ein gutes Ergebnis erzielen Sie mit 0,5.
Zweites Beispiel: Balkendiagramm
Hier sieht man zwei voneinander unabhängige Felder gruppiert nach dem Monat.
In der Jasper-Nomenklatur bilden die roten Säulen (Anfragewert) eine Serie und die blauen Säulen (Gewichteter Anfragewert) eine weitere Serie..
In den Diagrammeigenschaften muss man daher jeweils eine Serie anlegen. Gegenüber dem Tortendiagramm gibt es daher ein weiteres Dialogfenster zur Bearbeitung je einer Serie mit den folgenden vier Eingabefeldern:
Serienausdruck: dies ist die Bezeichnung der Serie, wie sie in der Legende erscheint, und sollte daher eine Konstante sein. Typische Serienausdrücke sind $R{Projectvalue} und Anfragewert.
Kategorieausdruck: entspricht der x-Achse, im Beispiel den Monaten, und sollte beim Abbilden von Gruppenergebnissen dem Gruppenausdruck (geeignet in einen String konvertiert) ergeben.
Im obigen Diagramm lautet er:JAVAnew SimpleDateFormat("MMM yy").format( $F{Salesdate} == null ? new Date(0,0,0) : new Date($F{Salesdate}.getYear(),$F{Salesdate}.getMonth(),1) )
Ausdruck Feldwerte: dies ist die Säulenhöhe, meist eine Variable, die die Gruppensumme bereitstellt.
Ausdruck Bezeichner: kann leer bleiben.
Man würde erwarten, dass der Kategorieausdruck exakt dem Gruppenausdruck entspricht und erst der Bezeichnerausdruck dasselbe als String enthält. Im aktuellen Stand von Jasper scheint der Bezeichnerausdruck aber ignoriert zu werden.
Kreuztabellen
Eine Kreuztabelle ist eine tabellarische Zusammenfassung von Daten nach zwei Merkmalen. Als Beispiel sei hier eine Zählereinbaustatistik in CURSOR-CRM/EVI dargestellt:
Jahr / Ortsteil | Nord | Süd | Gesamt |
---|---|---|---|
2005 | 12 | 14 | 26 |
2006 | 22 | 23 | 45 |
Gesamt | 34 | 37 | 71 |
Kreuztabelle anlegen
Die Kreuztabelle finden Sie als Objekt Crosstab im Fenster Palette.
Ziehen Sie das Objekt in den Bereichtentwurf. Sodann öffnet sich der Kreuztabellenassistent.
Der erste Schritt des Assistenten fordert zur Eingabe eines sogenannten Subdatasets auf. Das voreingestellte Subdataset mit dem Namen des Reports steht für alle Daten des Reports und passt normalerweise.
Die weiteren Schritte sind selbsterklärend.
Kreuztabelle bearbeiten
Bearbeitet wird die Kreuztabelle auf einer eigenen Lasche, die zwei zusätzliche Fensterchen enthält. Dort findet man die Variablen, die in der Kreuztabelle verwendet werden, und kann diese auch modifizieren.
Wenn Sie einen Berichtentwurf später wieder bearbeiten, dann fehlt diese Lasche zunächst. Sie öffnen Sie über das Kontextmenü zur Kreuztabelle.
Bilddaten in Reports bereitstellen
Das Logo eines Geschäftspartners und die Bilder von Anspechpartner und Mitarbeiter sollen im Portrait-Report mit ausgegeben werden. Diese Aufgabe umfasst nur die technische Grundlage, nicht aber die Anpassung und Umgestaltung vorhandener Reports.
Voraussetzungen
Die Bilddaten sind in der Datenbank in Binärform abgelegt. Das Laden und Konvertieren erfordert mehr Ressourcen als normale Textfelder. Bilder sollten daher nur in Portraitreports eingefügt werden, die nur wenige Daten enthalten. Die Verarbeitung ist nicht auf Listen- oder sogar Massendaten-Reports ausgelegt. Werden einige Reports mit Bilddaten ausgestattet und diese im Cockpit oder auf Masken verwendet, so steigt auch der Speicherverbrauch im Client. Die Größe der Reports ist maßgeblich von der Größe und Anzahl der Bilder abhängig. Daher kann es nötig sein, die Speichereinstellungen des Clients hochzusetzen.
Konfiguration der Suche
Das Logo des Geschäftspartners bzw. die Bilder von Ansprechpartnern und Mitarbeitern können wie normale Textfelder als Suchergebnisfeld in der Suche aufgenommen werden. Als einschränkende Funktion stehen nur 'ist leer' bzw. 'ist nicht leer' zur Verfügungen. Wichtig ist, dass die Option 'Duplikate erlauben' immer gesetzt sein muss.
Es macht keinen Unterschied, ob Bilder in der Hauptsuche oder in Tabellensuchen für Unterreports ausgegeben werden. Man sollte aber vermeiden, mehere Bildfelder in einer Suche zu selektieren.
Design im Editor
Die Kreuztabelle finden Sie als Objekt Image im Fenster Palette.
Ziehen Sie das Objekt in den Bereichtentwurf. Es öffnet sich dann zunächst ein Dateiauswahldialog. Diesen können Sie aber abbrechen und später über die Eigenschaften des Objekts die notwendigen Einstellungen vornehmen.
Positions Typ: Fließend
Streckungstyp: Nicht strecken
Ausdruck: Z.B. $F{Logo}
Ergebnissklasse Bild: java.io.InputStream
Bild skalieren: Form behalten
Bei Fehlertyp: Leer
Ausrichtung: Oben Links
Um sich auch den Ausdruck im Designer anschauen zu können, werden die Bilddaten in die temporäre Report-Datenbank übertragen. Das zur Verfügung stehende Feld trägt ebenfalls den Datentyp java.io.InputStream.
Für weiterführende Informationen zum Thema „Bilder im Report“ sei auf die käuflich zu erwerbende Hilfe des iReport-Designers hingewiesen.
Beispiele
Das Ergebnis der Geburtstagsvorschau sieht dann im Cockpit folgendermaßen aus:
Ein angepasstes Ansprechpartnerportrait ebenfalls:
Externe Bilder in Reports bereitstellen
Externe Bilder können als URL in den Report eingebunden werden.
Voraussetzungen
Die verwendeten Bilder müssen auf einem internen Web-Server uneingeschränkt lesend zur Verfügung stehen. Hierrauf muss der Rich-Client wie auch der Applikationsserver direkten Zugriff haben, ohne eine Proxy-Konfiguration oder SSL-Zertifikate angeben zu müssen. Die Funktion des Webservers dient ausschließlich der Bereitstellung beliebiger Bilder im Format .png, .jpeg oder .gif unter einem festen und eindeutigen Pfad. Es muss sichergestellt sein, dass sich die URL dieses Server nicht ändert und auch nicht der Pfad zu den Bildern. Ansonsten sind betroffene Reports per Hand anzupassen. Für die Ausfallsicherheit muss der Systemadministrator Sorge tragen.
Design im Editor
Auf dem Bildfeld sollten folgende Einstellungen gesetzt werden:
Positions Typ: Fließend
Streckungstyp: Nicht strecken
Ausdruck: Z.B. "http://intern.cursor.de/gift.png"
Ergebnisklasse Bild: java.lang.String
Bild skalieren: Form behalten
Bei Fehlertyp: Leer oder Fehler
Ausrichtung: Oben Links/Rechts
Ist als Fehlertyp „Fehler“ eingestellt, so erhält der Anwender einen Fehlerdialog, der auf den fehlenden, ungültigen pfad hinweist. Ein solcher Report kann erst wieder fehlerfrei ausgeführt werden, wenn das Bild wieder zur Verfügung steht oder der Report im Designer angepasst wurde.
Bilder aus der Icon-Bibliothek
Ab der Version 15.2 können auch die Icons aus dem Icon-Repository (Entität Image) in Reports verwendet werden. Als Anwender können Sie verfügbare Bilder zu einem Report einfach auswählen und hinzufügen. Hierfür wurde das Layout der Reportbearbeitung geschaffen, um die neuen Konfigurationsmöglichkeiten übersichtlich darzustellen.
Abbildung: Konfigurationsmaske eines Reports
Neue Bilder können aus der Icon-Bibliothek dem Report hinzugefügt werden. Jedes Bild wird mit dem eindeutigen Kennzeichen dargestellt.
Abbildung: Bilder in der Bibliothek
Die Bilder stehen im Report-Designer als Parameter zur Verfügung. Die Bilder stehen auch in allen Unterreports zur Verfügung.
Abbildung: Bilder im Report
Ein neues Bild wird über die Palette auf den Report gezogen. Dabei kann die Bild-Datei aus dem temporären Report-Bearbeitungs-Ordner ausgewählt werden.
Folgende Einstellungen sollten auf dem Bildfeld gesetzt werden:
Key: Der Name des Parameters, z.B. "USER_IMAGE_Accept_16_16"
On Error Type: Blank
Der im Bildfeld stehende Pfad wird beim Speichern des Reports entfernt, da die Bilder bei der Ausführung als InputStream übergeben werden. Daher ist der Name des Parameters als Key sehr wichtig und darf nicht vergessen werden.
Die neu hinzugefügten Bilder werden nun im ausgeführten Report mit ausgeben.
Abbildung: Report mit Bildern aus der Bibliothek
Da ein exportierter Report nur aus einer XML-Datei besteht, sind dort Bilder nicht enthalten, sondern nur die Referenzen auf den eindeutigen Bild-Namen. Bilder müssen zwischen den Systemen per Customizingranport übermittelt werden. Es ist darauf zu achten, dass neue Bilder und der Report sich in demselben Customizing-Paket befinden
Hyperlinks
Felder können mit Hyperlinks versehen werden. Ein Hyperlink kann aufrufen:
Eine Internetseite
Eine Entität oder Liste in CURSOR-CRM/EVI (analog zu den Links in internen Emails)
Einen Abschnitt innerhalb des Reports
Hyperlinks auf Datensätze
Ein Klick auf einen solchen Hyperlink veranlasst, dass das im Hintergrund laufende CRM eine Maske mit dem ensprechendenden Datensatz öffnet.
Grundsätzlich gibt es drei verschiedene Notationen für die URL eines Hyperlinks auf Entitätsdatensätze:
Einfache Notation:
<Entityname>=<PrimaryKey> --- Beispiel: Activity=891ni23f8sdlAcErweiterte Notation:
Einen einzigen Datensatz öffnen: <VersionName>://'<Entityname>&pk=<PrimaryKey>'
Beispiel: CARMEN://'Activity&pk=891ni23f8sdlAc'Listenansicht mehrerer Datensätze öffnen: <VersionName>://'<Entityname>&pk=<PrimaryKey1>$!!$<PrimaryKey2>$!!$<...>'
Beispiel: CARMEN://'Activity&pk=891ni23f8sdlAc$!!$0aj238agsjd21dAc$!!$...$!!$...' (Beispiel für eine Variable dazu siehe weiter unten)
Um das Hyperlink einzubauen, öffnet man über das Kontextmenü (rechte Maustaste) den Menüpunkt Hyperlink.
Dabei sind folgende Einstellungen zu beachten:
Hyperlink target: Blank (muss von Hand eingetippt werden, da sonst das Hyperlink nicht korrekt erzeugt wird)
Hyperlink type: Reference (muss von Hand eingetippt werden, da sonst das Hyperlink nicht korrekt erzeugt wird)
Expression: Dieser Ausdruck muss einen String ergeben, dessen Inhalt der URL entspricht.
Beispiel
Im nachfolgenden Beispiel wird zuerst der Anfang des Links fest definiert ("ContractAccount="). Dieser String dynamisch in den Link einzufügen, wird der Platzhalter $F{ContractAccountPk_Pk} verwendet. Dieser bedeutet, dass in die Entität Vertragskonto (ContractAccount) gesprungen wird. Um den Primärschlüssel Platzhalter wird dann zur Laufzeit durch den Inhalt des Feldes ([F]ield) des gerade verarbeiteten Datensatzes ersetzt. Das Ergebnis kann beispielsweise der String "ContractAccount=TX1729CnAc" sein.
Der Reportviewer blendet stets ein Hilfefähnchen (Tooltip) ein, das die zu öffnende URL zeigt. Um einen sprechenderen Tooltip zu erhalten, können Sie einen beliebigen Stringausdruck in der Lasche Tooltip hinterlegen. Die mit CRM ausgelieferten Reports verwenden in allen Hyperlinks den Platzhalter $R{OpenHyperlink}, der für "Öffnen" steht.
Verlinken eines Diagramms
Auch die Balken bzw. Tortenstücke von Diagrammen kann man mit Hyperlinks versehen. Durch Klick auf einen Balken oder ein Tortenstück im Diagramm springt man dann innerhalb des Reports zu den ausführlichen Daten.
Dabei verweist ein Link allerdings immer auf eine Menge von Datenätzen (eben jene, die in diesem Diagramm zu einer Gruppe zusammengefasst wurden). Daher muss der Link auch etwas anders definiert werden. Es ist in der Linkdefinition nicht möglich, per $F{}- Platzhalter direkt auf den Primärschlüssel eines Datensatzes zuzugreifen, da mehrere Primärschlüssel gruppiert werden müssen. Daher muss zunächst eine Variable angelegt werden, die zur Laufzeit gefüllt wird und letztlich in den Link eingefügt wird.
Dieser Beispiel-Report ("Wochenrückblick") gruppiert alle Aktivitäten in einem Unterreport nach ihrem Typ. Über den Link "ALLE" werden alle Aktivitäten der letzen Woche in der Listenansicht angezeigt. Mit einem Klick auf ein entsprechendes "Kuchenstück" werden eben nur die Aktivitäten des gewählten Typs angezeigt. Für die beiden Link-Typen (Alle / Gruppe) müssen die beiden folgenden Variablen definiert werden.
Variable für einen Link auf mehrere Datensätze
Ein Link auf mehrere Datensätze ist analog zum Link auf einen einzelnen Datensatz (erweiterte Notation mit Programmname vor dem Doppelpunkt). Die Primärschlüssel werden dabei getrennt durch die Zeichenfolge $!!$ aneinandergehängt.
Dies erzielt man durch einen Variable, die beim Aktualisieren ihren eigenen alten Wert nimmt und um den Pk ergänzt.
Beispiel
Beispiel: Der Name der Variablen sei allpk. Dann muss ihr Ausdruck lauten:
($V{allpk == null ? "" : ($V{allpk} + "$!!$")) + $F{Pk}
Erläuterung: Vor den neuen Primärschlüssel (Pk) wird die bisher bereits konstruierte Zeichenfolge und das Trennzeichen gestellt.
Der Hyperlinkausdruck lautet nun
"CARMEN://'Activity&pk=" + $V{allpk} + "'"
Links auf den einzelnen "Kuchenstücken" werden zwar genauso definiert, allerdings ist die Option dafür in einigen Untermenüs versteckt. Mit einem Rechtsklick auf das Diagramm gelangt man in das Menu "Diagramm Eigenschaften". Über die Reiter "Diagramm Daten" → "Details" → "Abschnitts-Hyperlink" gelangt man zu folgendem Dialog. Er wiederum identisch zu dem eines Textfeldes. Ein Link wird wieder mit den Parametern Hyperlink Ziel = Blank und Hyperlink Typ = Reference erstellt. Im String der Hyperlink Referenz ist entsprechend die Variable $V{pklinks} zu verwenden
Einschränkungen
Durch die Anpassung der Link-Syntax an die CURSOR-CRM Linkfunktionalität, ist es nun möglich auch aus den verschiedenen Ausgabeformaten eines Reports in die Anwendung zu springen. Die Verwendung von Hyperlinks funktioniert allerdings nicht bei jedem Ausgabeformat. Die folgende Tabelle zeigt welche Links bei welchem Format verwendet werden können:
= funktioniert
= nicht verfügbar
Einschränkungen bei Hyperlinks
Links auf Labels/Feldwerten | Links auf Diagrammen | Bemerkungen | |
---|---|---|---|
.jprint (JasperReportsViewer) | |||
.pdf (AcrobatReader) | Diagramme werden in PDF als Bild dargestellt | ||
.csv | |||
.html | Der CRM-Primärschlüssel darf kein '#' enthalten | ||
.rtf (Word Rich Text) | Diagramme werden in Word als Bild dargestellt | ||
.xls (Excel) |
Hyperlinks zu Sprungzielen innerhalb des Reports
Solche Hyperlinks ermöglichen die Navigation innerhalb eine Reports als Drill-Down. So wird beispielsweise auf der Titelseite eine Zusammenfassung der Ergebnisse dargestellt. Durch Hyperlinks in den Zeilen kann auf die Seite mit den entsprechenden Detailergebnissen gesprungen werden.
Hierbei sind technisch zwei Hyperlinks erforderlich, nämlich ein anklickbarer Verweis am Startpunkt und ein Sprungziel am Zielpunkt.
Sprungziel:
Es wird an irgendeinem Objekt, das sich an der anzuspringenden Stelle befindet, ein Hyperlink vom Typ „None“ angebracht. Als anzuspringendes Ziel muss der Anker-Ausdruck (Anchor Name Expression) einen eindeutigen Namen, hier "abcdefg", ergeben. Der Anker-Ausdruck kann auch Feldinhalte einhalten.
Verweis auf das Ziel:
An der Stelle, an der nun der anklickbare Hyperlink erscheinen soll, bringt man an einem beliebigen Objekt einen Hyperlink an, der den Verweis auf das Ziel beinhaltet. Dies ist derselbe String oder Stringausdruck wie beim zuvor definierten Sprungziel, er wird aber in der Hyperlink Anchor expression eingetragen. Der Linktyp LocalAnchor muss von Hand eingetippt werden, da das Eingabefeld von iReport nicht korrekt funktioniert.
In diesem Beispiel wurde als Ziel ein fester String, nämlich "abcdefg", verwendet. Genausogut kann der Stringausdruck dynamisch aus eindeutigen Feldinhalten zusammengesetzt werden. Das kann auch einfach ein Primärschlüsselfeld sein.
Lesezeichen
Falls Lesezeichen für die PDF-Ausgabe erstellt werden sollen, ist das Feld 'Anchor' zu füllen und das Bookmark-Level entsprechend zu setzten. Das Level bestimmt die Verschachtelungstiefe, wobei mit der Zahl 1 begonnen wird. Die Generierung der Lesezeichen funktioniert nur, bei der direkten Ausgabe ins Pdf-Format über CURSOR-CRM, da dort die entsprechenden Parameter konfiguriert wurden. Der Export aus dem JasperViewer heraus oder im Designer berücksichtigt keine Lesezeichen.
Aufruf einer Entität in CURSOR-CRM/EVI
Als Hyperlink-Typ wird 'Blank/Reference' gewählt. Der URL-Ausdruck muss nun den (englischen) Entitätsnamen gefolgt vom Primärschlüssel der Entität enthalten.
Ausdruck: Entität=Primärschlüssel
"Activity=" + $F{Pk}
Hyperlinks auf Suchen
Auch das Öffnen von Suchen mit der Übergabe von Parametern ist möglich.
Auch hier muss der Hyperlink in Jasper vom Typ Blank/Reference sein.
Die Syntax des URL-Ausdrucks ist:
Syntax:
"CARMEN://SEARCH/?Cu&pk=1r6qh2m1b2kuk7olExtendedSearch&po=0,~an=City.Cu,~fn=ef,~vu=" + $F{City}
In diesem Beispiel wird in der Suche, deren Pk 1r6qh2m1b2kuk7olExtendedSearch
ist, nach Datensätzen gesucht, wobei der Wert des Feldes City als Eingabewert genutzt wird.
Den zusammengesetzten Link kann man im Suchdesigner (nicht in Jasper) wie folgt erzeugen:
Das Feld für den Suchparameter muss mit „Keine Einschränkung“ konfiguriert sein
Das Feld für den Suchparameter muss als Sucheingabefeld konfiguriert sein.
So muss die Suche zunächst gespeichert werden.
Immer noch im Suchdesigner ändert man das Feld auf „ist gleich XXX“, ohne die Suche zu speichern-
In diesem Augenblick klickt man auf das Icon „Per Mail senden“, es befindet sich in der vertikalen Iconliste auf dem linken Rand des Suchdesigners.
Die so erzeugt eE-Mail enthält den Link auf die myCRM-Suche.
Tipp
Falls die E-Mail nicht funktioniert, weil z.B .Outlook nicht installiert ist, dann konfigurieren Sie für den Mitarbeiter, unter dem Sie eingeloggt sind, den serverseitigen Mailversand. Dies ist andernorts dokumentiert. Die E-Mail mit der URL erscheint dann in einem Vorschaufenster.
Tipps zur Darstellung
Verfeinerung Reports auf Masken
Für Maskenreports ist eine Einstellungsmöglichkeit geschaffen worden, den Report mit oder ohne Toolbar anzuzeigen. Die Konfiguration erfolgt im GUI-Builder, da in diesem bereits die Reports auf der Maske platziert werden. Im Eigenschafteneditor ist eine Einstellungsmöglichkeit hinzugefügt worden: Toolbar anzeigen. Der Report wird für den Fall, das keine Toolbar angezeigt werden soll, automatisch auf die Größe des Reportpanels angepasst und ist vom Anwender nicht änderbar.
Formatierung als Prozent
In Jasper rechnet man nicht mit Prozentzahlen, sondern bildet den Anteil an einer Sache als reelle Zahl zwischen 0 und 1 ab. Zum Beispiel wird 50% hinter den Kulissen einfach als Zahl 0,5 behandelt.
Zur Darstellung an der Oberfläche wird daraus die dazugehörige Prozentdarstellung gebildet.
Hierzu stellt man für das Zahlenfeld das folgende Muster ein:
#,##0 %
Stile
Menüpunkt: Format / Stile
In iReport kann man ein Objekt beliebig formatieren, zum Beispiel kann man Schriftarten einstellen. Um dies zu vereinfachen, bietet Jasper Stile an. Ein Stil ist eine komplette Feldformatierung.
In CURSOR-CRM-Berichten sind mehrere nützliche Stile vordefiniert:
Decimal für reelle Zahlen (Double, BigDecimal);
Integer für ganze Zahlen (Integer, Long);
Text für Zeichenfolgen (String);
Label für Feldbezeichner
Es ist nicht möglich, diese Stile in CURSOR-CRM/EVI an zentraler Stelle zu ändern.
null-Werte ausblenden
Wenn ein Feld leer ist, dann druckt Jasper nicht etwa nichts, sondern null. Dieses können Sie ändern, indem Sie die Feldeigenschaft Leer wenn NULL ankreuzen.
Bedingtes Ausblenden
Um ein Feld oder einen Abschnitt nur unter bestimmten Bedingungen darzustellen und andernfalls auszublenden, gibt es die Eigenschaft 'Drucken wenn' bzw. 'Anzeigen wenn'. Dort trägt man einen Ausdruck ein, der ein Boolean ergibt.
Ausgabe, wenn ContEndDate in der Vergangenheit liegt:
$F{ContEndDate}.before($P{PrintDate})
Einen Abschnitt ganz ausblenden:
false
(Nützlich, um einen Abschnitt zu verstecken, aber ihn unsichtbar aufzubewahren)
Gesamtseitenzahl
Um die Anzahl der Seiten auszugeben (etwa in der Form Seite 1 von 37), verwendet man die Variable PAGE_NUMBER. Man muss beim Textfeld dann aber den Auswertungszeitpunkt auf Bericht umstellen, da man sonst die aktuelle Seitennummer erhält.
Man kann nicht Seite 1 von 37 durch einen einzigen String-Ausdruck erzeugen. Man braucht zwei Textfelder, die beide $V{PAGE_NUMBER} ausgeben, deren Auswertungszeitpunkt aber unterschiedlich ist.
Überdeckung von Übersetzungen in Reports
Enthält eine Auswertung im Hauptreport Freitextfelder (z.B. Freetext1) und enthält ein Unterreport von einer anderen Entität auch das gleichnamige Freitextfeld, so wurde die Übersetzung des Hauptreports und somit der Hauptentität überdeckt. D.h. $R{Freetext1} liefert nur die Übersetzung aus der Aktivität (Unterreport) obwohl der Geschäftspartner Hauptreport auch sein Freitextfeld ausgibt.
Der Fix erstellt nun für das Aktivitäten Freifeld eine eigene Übersetzung:
$R{Freetext1}: Freitext1 des Geschäftspartners (Hauptreport)
$R{Freetext1_Ac}: Freitext1 der Aktivität (Unterreport)
Bei doppelten Feldnamen wird das Kürzel der Entität an den Feldnamen gehängt. Es kann sein, dass sich dadurch der normale Feldname $F{...} von dem Übersetzungs-Feldnamen $R{...} unterscheidet. Hintergrund ist, dass zwar jeder Unterreport auf eine eigene Datenquelle zugreift, aber die Übersetzung für Haupt- und alle Unterreports nur in einer Datei gehalten wird.
Scriptlets
JasperReports unterstützt Java-Ausdrücke in Feldern und Variablen. Darüber hinausgehende komplexe Programmierungen müssen in eine Scriptlet-Klasse ausgelagert werden. Diese Klasse muss dem iReport-Designer, dem CURSOR-CRM/EVI-Client und Applikationsserver bereitgestellt werden. Aus diesem Grund kann die Klasse nur seitens CURSOR Software AG bereitgestellt werden.
Wie auch für das spezielle Customizing von Diagrammen wurde das Projekt 'JRCustomizer' aufgesetzt. Die kompilierte Bibliothek wurde nach Customizing2/ext/jasperreports/jrCustomizer.jar kopiert und als Projekt-Datei bereitgestellt.
Scriptlet-Klassen können in die Berechnung in allen Phasen der Report-Ausführung eingreifen. Zudem können eigene Methoden bereitgestellt werden. Eine aktuelle Aufstellung der Klassen und Methoden findet sich in der Bibliothek unter /META-INF/*.txt
// de.cursor.jr.CursorScriptlet.class
Public class CursorScriptlet extends JRDefaultScriptlet {
public String reverse(String text, String delimiter)
throws JRScriptletException { ... }
}
Die Scriplet-Klasse muss in den Report-Eigenschaften hinterlegt werden.
Zum Zugriff bietet JasperReports einen Parameter. Dort können Werte erfragt und definierte Methoden aufgerufen werden:
$P{REPORT_SCRIPTLET}.reverse($F{ProjectStatusKey_Desc}, "/")