Skip to main content
Skip table of contents

Bearbeitung von Reportlayouts mithilfe von JasperReports

Allgemeines zu JasperReports

2025.4

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, Excel (XLSX), CSV und Word (DOCX) zu exportieren und auf dem Bildschirm anzuzeigen oder zu drucken. 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.

Zur Bearbeitung der Report-Designs steht das Jaspersoft Studio in der Community Edition direkt vom Hersteller zu Verfügung. Die Verwendung dieser Software benötigt eine kostenfreie Registrierung in der Jaspersoft Community.

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 mit alle Sektionen:

CODE
<jasperReport name="Blank_A4_2" language="java" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="d579de28-4a41-404c-a851-5c1eb4d2a09a">
	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
	<query language="sql"><![CDATA[]]></query>
	<background splitType="Stretch"/>
	<title height="79" splitType="Stretch"/>
	<pageHeader height="35" splitType="Stretch"/>
	<columnHeader height="61" splitType="Stretch"/>
	<detail>
		<band height="125" splitType="Stretch"/>
	</detail>
	<columnFooter height="45" splitType="Stretch"/>
	<pageFooter height="54" splitType="Stretch"/>
	<summary height="42" splitType="Stretch"/>
</jasperReport>

In der Vorschau wird er so dargestellt:

image2025-6-11_14-58-32.png

Die Benutzeroberfläche von Jaspersoft Studio

image2025-6-12_7-59-50.png

Das Studio zeigt einen Berichtsentwurf umgeben von Fenstern, welche Werkzeuge oder einfügbare Elemente enthalten.

Die Fenster, die Sie am häufigsten benutzen werden sind:

  • Project Explorer (links): Zeigt die Ressourcen wie Reports (*.jrxml, *.jasper), die Datenquelle, Bilder und Projekt-Bibliotheken.

  • Outline (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.

  • Properties (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ü „Window“): 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.

Ausgabe von Feldinhalten und Feldbezeichnungen

Aus der Outline können Felder und Parameter in den Berichtsentwurf gezogen und danach der entsprechende Stil eingestellt werden. Oft ist es einfacher, ein schon vorhandenes Textfeld zu kopieren und seinen Ausdruck auf das gewünschte Datenfeld abzuändern.

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.

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 siehe 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 IntegerDoubleBooleanTimestampString

Falls Sie einen Report bearbeiten, der mit einer früheren Version 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öglichkeit zum Öffnen des Editors ist der Punkt 'Edit expression' im Kontextmenü jedes Feldobjektes.

image2025-6-12_8-0-40.png

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 Finish 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

Freenumber1_plus_Freenumber2_iReport_4.1.2.png

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:

  • Name: ProjectValue_Total

  • Calculation: Sum

  • Reset type: Gemeint ist: unter welchen Umständen nimmt die Variable erneut den Initialwert an): Name der Gruppe

  • Expression: $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:

  • Increment type: 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 deenitsi (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:

$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 die Sort Fields in der Outline des Reports ein.

image2025-7-1_6-27-51.png

In den Eigenschaften des Sortierfeldes lassen sich nun die Reihenfolge konfigurieren oder das Feld ändern.

image2025-7-1_6-37-47.png

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:

image2025-7-1_6-42-36.png

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 in der Outline enthält den Punkt Create 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 sich im 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_ContactPerson).

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:

image2025-7-1_6-50-47.png

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

image2025-7-1_6-52-25.png

So wird ist einer von – Platzhalter (wird zur Laufzeit gesetzt) eingetragen:

image2025-7-1_6-52-44.png

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.

image2025-7-1_6-51-27.png

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{countEntries}. 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.

e76b7eeb-a7aa-4b02-a0a2-5baf2377d4ba.png
4d15a648-ab1c-4450-b4ad-03e1c3503b81.png

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.

Jasper-Kuchendiagramm.jpg

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 das Jaspersoft Studio.

Der Unterbericht wird durch ein graues Rechteck repräsentiert. Öffnen Sie den Unterbericht und legen Sie im Unterbericht einen neuen Parameter an. In diesem Beispiel möge er totalCountMainReport 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{totalSum} 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{totalCountMainReport} mit $V{totalSum}.

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{totalCountMainReport}.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 Ansprechpartner 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, mehrere 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 Berichtentwurf. 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.

image2025-7-1_7-43-21.png
  • Position Type: Fix Relative to Top

  • Strech Type: No Strech

  • Ausdruck: Z.B. $F{Picture}

  • Scale Image: Retain Shape

  • On Error Type: Blank

  • Image Alignment: Oben Links/Rechts

Um sich auch den Ausdruck im Designer anschauen zu können, werden die Bilddaten in die temporäre Report-Datenbank übertragen.

image2025-7-1_7-51-6.png

Beispiele

Ein angepasstes Ansprechpartnerportrait ebenfalls:

image2025-7-1_8-27-30.png

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. Hierauf 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, .jpg oder .svg 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:

  • Position Type: Fix Relative to Top

  • Strech Type: No Strech

  • Ausdruck: Z.B. "http://intern.cursor.de/gift.png"

  • Scale Image: Retain Shape

  • On Error Type: Blank

  • Image Alignment: 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

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.

image-20230825-233532.png

Konfigurationsmaske eines Reports

Neue Bilder können aus der Icon-Bibliothek dem Report hinzugefügt werden. Jedes Bild wird mit dem eindeutigen Kennzeichen dargestellt.

image-20230825-233556.png

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.

image2025-7-1_8-31-50.png

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.

image2025-7-1_8-32-52.png

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.

image2025-7-1_8-33-33.png

Die neu hinzugefügten Bilder werden nun im ausgeführten Report mit ausgeben.

image2025-7-1_9-34-38.png

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 sich im Web Client der entsprechende Datensatz öffnet.

image2025-6-12_7-28-25.png

Dabei sind folgende Einstellungen zu beachten:

  • Hyperlink Target: Self oder Blank

  • Hyperlink Type: Reference

  • Hyperlink Reference Expression: Der Ausdruck zum öffnen der Entität. Sonderzeichen im Primärschlüssel müssen für die URL encodiert werden.

    • Notation: /webclient/<Entityname>/<PrimaryKey>

    • Beispiel: "/webclient/link/Employee/" + URLEncoder.encode($F{Pk}, "UTF-8")

  • Hyperlink Tooltip Expression: $R{OpenHyperlink}

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. In der Rubrik "Hyperlink" kann unter "Anchor and Bookmark" zum einen der eindeutige Anker-Ausdruck (Anchor Name Expression) und in einem andern Objekt das Ziel (Bookmark Level Expression) gleichermaßen hinterlegt werden.

image2025-6-12_7-33-59.png
image2025-6-12_7-34-18.png

Lesezeichen

Falls Lesezeichen für die PDF-Ausgabe erstellt werden sollen, ist das Feld 'Anchor Name Expression' 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.

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:

"/webclient/search/ContactPerson/DefaultContactPerson/po%3D0%2C%7Ean%3DContactPerson%2BrCustomerKey_ContactPerson.MatchCode.Cu%2C%7Efn%3Dlf%2C%7Evu%3DADAC"

In diesem Beispiel wird in der Suche, deren Name "DefaultContactPerson" ist, nach Datensätzen gesucht, wobei der Wert des Feldes Kurzname des Geschäftspartners als Eingabewert genutzt wird.

Den zusammengesetzten Link kann man in der Erweiterten Suche wie folgt erzeugen:

  1. Die Suche über die Suchverwaltung öffnen und die entsprechenden Kriterien einschränken

  2. Die Suche als Lesezeichen in myCrm speichern

  3. Über das Kontextmenü auf dem myCrm-Eintrag den Link anzeigen lassen

  4. Im Jaspersoft Studio den Link hineinkopieren und die Werte durch Variablen ersetzen

Tipps zur Darstellung

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

Im Jaspersoft Studio 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 Blank when 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 Report 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 Jaspersoft-Studio, dem CURSOR-CRM/EVI-Client und Applikationsserver bereitgestellt werden. Aus diesem Grund kann die Klasse nur seitens CURSOR Software AG bereitgestellt werden.

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.

image2025-6-12_7-50-8.png

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.