Skip to main content
Skip table of contents

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:

CODE
<?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:

  1. Abschnittseigenschaften
    Wird z.B. das Text-Feld der Aktivität im Detail-Bereich der Auswertung ausgeben, so muss die Option Teilbar immer aktiv sein.

  2. Ü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.

  3. 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

JAVA
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:

JAVA
(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:

JAVA
(($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:

JAVA
("#EMPTY-KEY#".equals($F{PjManager_Pk}))
? $F{PjManager_ShortCut}
:$F{PjManager_LastName} + ","+$F{PjManager_FirstName}+
"("+$F{PjManager_ShortCut} + ")"

Umwandlung eines Datums in einen String

CODE
(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:

JAVA
$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

JAVA
$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:

JAVA
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:

JAVA
$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:

JAVA
($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:

JAVA
$F{EndDate}.getYear() - $F{StartDate}.getYear() + 1

"Heute"

Der folgende Ausdruck liefert das aktuelle Datum:

JAVA
new Date()

Datumsvergleich

Der folgende Ausdruck ergibt einen Wert, welcher besagt, ob das Datum A vor dem Datum B liegt:

JAVA
$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.

JAVA
( $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:

JAVA
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:

CODE
($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:

CODE
$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:

CODE
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:

  1. Bezeichner

    • Style: Label

    • Ausdruck: "Anzahl Kunden in " + $F{City}

  2. 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:

  1. 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.

  2. 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.

  3. 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:

  1. 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

  2. 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:

  1. Nach X sortieren: Daten / Reportrtanfrage / Sortieroptionen

  2. Nach x gruppieren: Ansicht / Reportgruppen

  3. Variable Summe_Y anlegen, die $F{Y} aufaddiert und pro Gruppe zurückgesetzt wird.

  4. Abschnitt summary sichtbar machen, sofern noch nicht geschehen.

  5. 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.

JAVA
$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:

    JAVA
    new 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:

  • (Warnung) Key: Der Name des Parameters, z.B. "USER_IMAGE_Accept_16_16"

  • (Warnung) 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

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=891ni23f8sdlAc

  • Erweiterte 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:

(Haken) = funktioniert

(Fehler) = nicht verfügbar

Einschränkungen bei Hyperlinks


Links auf Labels/Feldwerten

Links auf Diagrammen

Bemerkungen

.jprint (JasperReportsViewer)

(Haken)

(Haken)


.pdf (AcrobatReader)

(Fehler)

(Fehler)

Diagramme werden in PDF als Bild dargestellt

.csv

(Fehler)

(Fehler)


.html

(Fehler)

(Fehler)

Der CRM-Primärschlüssel darf kein '#' enthalten

.rtf (Word Rich Text)

(Haken)

(Fehler)

Diagramme werden in Word als Bild dargestellt

.xls (Excel)

(Fehler)

(Fehler)


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:

  1. Das Feld für den Suchparameter muss mit „Keine Einschränkung“ konfiguriert sein

  2. Das Feld für den Suchparameter muss als Sucheingabefeld konfiguriert sein.

  3. So muss die Suche zunächst gespeichert werden.

  4. Immer noch im Suchdesigner ändert man das Feld auf „ist gleich XXX“, ohne die Suche zu speichern-

  5. In diesem Augenblick klickt man auf das Icon „Per Mail senden“, es befindet sich in der vertikalen Iconliste auf dem linken Rand des Suchdesigners.

  6. 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

JS
// 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:

CODE
$P{REPORT_SCRIPTLET}.reverse($F{ProjectStatusKey_Desc}, "/")

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.