Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten.
Druckvorgang starten.
Zur Standardansicht zurückkehren.
Installation Reportgenerator(en)
Installationsbeschreibung zu den Reportgeneratoren, Tipps und Tricks, Return Variablen aus Subreport
Als Reportgeneratoren kommen zwei Versionen zum Einsatz.
Einerseits der alte und eigentlich nur mit Java 7 Code lauffähige iReport
und der Eclipse basierte Nachfolger Jasperstudio.
Achtung: Jasperstudio ist sehr ressourcenhungrig und leider nicht stabil (alle paar Stunden neu starten) auch das Arbeiten mit Subreports ist im Studio nicht wirklich implementiert. Daher verwenden wir gerne auch noch den iReport 5.5.0, trotz des massiven Nachteils, dass er nur mit Java7 Code arbeiten kann.
Für JasperStudio 6.20.x oder höher, solltest du ausreichend RAM in deinem Rechner zur Verfügung haben. Unsere Erfahrung, ab 16 GB humpelt es, ab 32GB geht’s halbwegs.
https://sourceforge.net/projects/jasperstudio/files/
Installation Jasperstudio
Hinweis:
Wenn du Jasperstudio und iReport auf dem gleichen Rechner installieren möchtest, so zuerst Jasper Studio installieren und dann den iReport.
Es sollten die jrxml mit dem iReport und die jasper mit dem Studio verlinkt sein.
Die Zusatz-Libs findest du hier und
hier
Welcher Reportgenerator muss wo verwendet werden
In den neueren Reports werden auch HelperReport Methoden verwendet, welche nur mit Java 8 compiliert wurden. Wenn diese Methoden verwendet werden, kann nur mehr mit JasperStudio kompiliert werden. D.h. wenn beim Kompilieren Fehlermeldungen wie z.B. 
aufscheinen, so muss mit Jasperstudio kompiliert werden.
Debricated Java Funktionen
Ab der Version 1.0.0 ist auch der Serverteil des Kieselstein ERP Servers mit Java 11 kompiliert. Das kann durchaus bedeuten, dass Funktionen, die in Java 7 zur Verfügung standen, in Java 8 bereits als debricated angekündigt waren, aber noch gingen und nun in Java 11 nicht mehr funktionieren.
So wurden gerade im Bereich der Kalender und Zeit Methoden massive Änderungen durchgeführt.
Tipps und Tricks für die Report gestaltenden Consultants
- Wenn man im Summary Band, den PSQL_Executer.subreport aufruft, muss danach noch ein Feld interpretiert werden, sonst macht der Report nichts. Das ist auch beim Jasper Studio so.
Hängt ev. auch an den Eigenschaften in dem der Subreport definiert ist!
- Variablen werden erst nach dem ersten Detail berechnet. Das bedeutet, dass diese erst nach dem Durchlaufen des (ersten) Details einen gültigen Wert haben. Will man nun z.B. einen Gruppen-Header, der ja vor dem eigentlichen Detail kommt, mit einer Variablen andrucken oder eben nicht, so kann das nicht über Variablen gelöst werden, sondern muss direkt in die Print When expression des Gruppen-Headers eingetragen werden.
- Man kann dem Report auch generelle Bedingungen mitgeben, durch welche ganze Zeilen herausgefiltert werrden (Siehe Eigenschaften des Reports).
Rückgabe von Werten aus den Subreports
Diese Funktion ist gegeben, aber in der Definition der Return-Variablen extrem kritisch.
Der wesentlichste Punkt ist, dass man akzeptieren muss, dass Subreports parallel zum Hauptreport ausgeführt werden.
https://community.jaspersoft.com/wiki/how-sum-return-values-multiple-subreport-various-levels
Daher ist z.B. während der Ausführung eines Details (Detail-Bands mit Subreport) nicht sichergestellt, dass die Rückgabevariablen während des Rendering des Details-Bands bereits zur Verfügung stehen. Daher werden auch weiterrechnende Variablen, welche auf Rückgabewerten des Subreports aufbauen, nicht richtig bzw. zu spät interpretiert. Dieses “zu spät” ist offensichtlich auch von so Dingen wie Rechenlast abhängig.
Daher ist folgende Vorgehensweise offensichtlich erforderlich:
- Hauptreport
- Variable, welche vom Subreport befüllt wird
- Calculation:
- System … System bedeutet, es wird der Wert dieser Variablen nicht durch den (Haupt-)Report verändert (aber durch die Parameter Übergabe des Subreports und seiner Calculation-Art)
- Resettype:
| Resettype |
Bedeutung |
Hinweis |
| Report |
für Gesamtsummen unten am Ende |
der Wert stimmt auch erst im Summary |
| Group |
für Gesamtsummen am Ende der Gruppe |
der Wert stimmt erst im entsprechenden Group Footer |
| None |
für Zeilensummen im weiteren Detail |
der Wert stimmt erst im, dem dem Subreport nachfolgenden Detail |
- Wichtig: Wenn Sie, wie z.B. oben drei verschiedene Zwischensummen benötigen, so müssen drei Variablen definiert werden, welche durch die Parameter-Rückgabefunktion des Subreports, in drei Definitionen, befüllt werden.

- Dass die Datentypen stimmen müssen, ist selbstverständlich.
- Rückgabeparameter
- Wichtig: Wenn Sie im Rückgabeparameter Calculationtyp Sum o.ä. verwenden, so dürfen vom Subreport keine Nullwerte kommen!
- Interessant: Man kann durchaus zwei Variablen aus dem Subreport im Hauptreport zusammenzählen. D.h. es wird beim Rückgabeparameter die Destination Variable mehrfach angegeben und als Calculationsart SUM verwendet.
Um die vom Subreport erhaltenen Werte zu sehen, muss nach dem Detailband, in dem der Subreport ausgeführt wird, ein weiteres Detail-Band eingerichtet werden. In diesem stehen die Werte aus dem Rückgabeparameter, wenn der Resettype der Variablen auf none steht, zur Verfügung.
Sollte man am Ende des Reports einen Subreport mit Return Variable benötigen, so ist der Trick, dass man eine Gruppe mit Bedingung null macht. Diese so reihen, dass sie die äußerste Gruppe ist und den Subreport, der die Returnvariable liefert, im Gruppenfooter aufruft. Die Variable, in der die Returnvariable eingefüllt wird, muss auf diese Gruppe gestellt sein. Dann steht im Summary der Wert zur Verfügung. Gegebenenfalls schiebt man das Feld dann über den oberen Rand des Summarys hinaus, damit die optische Position “richtig” ist.
Wenn Werte aus dem Subreport in das rufende Report Summary übergeben werden sollten, muss im Hauptreport der Resettype auf Report stehen.
Als Beispiel siehe: rech_warenausgangsjournal_materialeinsatz.jrxml
Trick
Will man im Summary einen Subreport mit Rückgabeparameter aufrufen, so gibt es ja nach dem Summary kein Band mehr, welches noch interpretiert wird. Daher macht man sich eine Gruppe mit Bedingung null und reiht diese als äußerste Gruppe. In den Group Footer gibt man seine Summary Variablen und den Aufruf des Subreports mit der Rückgabevariablen.
Die Variable in die der Rückgabewert eingetragen = aufsummiert wird, hat als Rest-Group diese äußerste Gruppe.
Im Summary, das ja dann danach kommt, kann man nun auf den Wert zugreifen. Gegebenenfalls schiebt man ein anzudruckendes Feld über den oberen Rand raus. Das ist nur mit der Tastatur möglich. In der Feldeingabe sind negative Werte für Top nicht zulässig. Gegebenenfalls auch direkt im XML ändern.
Welche Parameter stehen immer zur Verfügung
Generell gilt die Regel, dass Fields und Parameter nicht von anderen Reports übernommen werden dürfen. Davon ausgenommen sind folgende Parameter, welche immer an alle Reports angeliefert werden und daher jederzeit nachgetragen werden können.
| Parameter |
Bedeutung |
kopieren von |
| P_MANDANT_OBJ |
Mandantenobjekt mit einer Vielzahl von weiteren Informationen über den Mandanten. Von Mandantennummer bis zum Länderkennzeichen |
rech_rechnung.jrxml |
| P_SQLEXEC |
Aufruf von Datenbank Querys aus dem Report heraus Muster für Variable siehe fert_fehlteile.jrxml, Variable: LosEndetermin |
rech_rechnung.jrxml |
| P_MODUL |
interner Name des Moduls zur automatischen Findung der Subreports. Siehe dazu auch com.lp.util.HelperReport.getSubreportPath |
rech_rechnung.jrxml |
| P_LOGO_IMAGE |
Logo aus dem Verzeichnis allgemein, also allgemein/logo.png |
rech_rechnung.jrxml |
| P_LOGO_SUBREPORT |
Pfad auf das Verzeichnis mit dem aktuell gültigen Firmenlogo mit allen Sprach und Mandanten Unterverzeichnissen |
rech_rechnung.jrxml |
| P_MITLOGO |
Sollte die Brief-Papier Information (Logo) gedruckt werden oder nicht |
rech_rechnung.jrxml |
| REPORT_DIRECTORY |
Pfad auf das Verzeichnis des aktuellen Reports, um z.B. zu Subreports zu finden |
rech_rechnung.jrxml |
| REPORT_ROOT_DIRECTORY |
Pfad auf das Report-Root-Verzeichnis |
rech_rechnung.jrxml |
Schriften
In Verbindung mit den Forderungen aus der eRechnung und damit aus Zugferd ergibt sich, dass Zugferd PDF Dateien nach dem Standard PDF/A-3 verwendet werden müssen.
In PDF/A-3 ist gefordert, dass unter anderem nur freie Schriften verwendet werden dürfen und dass keine transparente Bilder verwendet werden dürfen.
Zusätzlich wird ein Farbschema gefordert welches von Kieselstein ERP immer auf sRGB2014.icc gesetzt wird.
In diesem Zusammenhang ergibt sich, dass als Schrift nur mehr die Libration Sans verwendet werden darf. Diese muss auf deinem Kieselstein ERP Server installiert sein und auch auf deinen Clients. Für die Bearbeitung der Reports, muss diese Schrift sowohl in iReport als auch in JasperStudio verwendet werden.
Bitte beachte, dass für einen Zugferd kompatiblen Rechnungsversand nur freie Schriften verwendet werden dürfen. Also keine gekauften Schriften, die dann ins PDF eingebettet werden müssten und der Empfänger der PDF eine Lizenzverletzung begehen würde. Siehe auch
Arbeiten mit iReport
Es darf ausschließlich iReport 5.5.0 verwendet werden. Alle anderen Versionen haben andere Bugs, die sich teilweise erst nach einiger Zeit zeigen.
Die Vorteile von iReport sind seine Geschwindigkeit und seine Übersichtlichkeit und dass man mit Subreports vernünftig arbeiten kann. Der wesentlichste Nachteil ist, dass iReport nur Java 7 kann und dass neuere Funktionen des Kieselstein-Clients nur mehr unter Java 8 zur Verfügung stehen.
[Einrichten von iReport]siehe
Arbeiten mit Jasper Studio
das liegt leider daran, dass der iReport nur Java 7 kann und der aktuelle Kieselstein Client unter Java 8 läuft.
Daher musste (aktuell ist das ein leider) auf den Nachfolger Jasperstudio 6.20.5 gewechselt werden (https://sourceforge.net/projects/jasperstudio/files/)
ACHTUNG: Jasperstudio 6.20.6 hat andere Property Definitionen (kann mit den Properties am Root nicht umgehen und hat weitere Bugs). Aktuell verwenden wir 6.20.5
Welche Reports müssen mit Jasper Studio bearbeitet werden
und welche können noch im iReport 5.5.0 bearbeitet werden
Report Editor
In Kieselstein ERP wird der iReport für das Editieren der mitgelieferten Reports verwendet.
Bitte achten Sie darauf die exakt richtige Version des iReports für die Bearbeitung der Formulare zu verwenden.
Nachfolgend Hinweise zu der Arbeitsweise und den Eigenheiten von iReport welche bei der Gestaltung der Reports beachtet werden sollten.
Hinweis: Für das Arbeiten mit iReport sollte mindestens eine Zwei-Tasten Maus zur Verfügung stehen. Eine Bearbeitung der Druckformulare mit nur eine Maustaste (MAC) ist nicht möglich.
Achtung: Wenn Sie Druckformulare selbst bearbeiten wollen, müssen Sie diese als Anwenderreport ablegen, da ansonsten die bearbeiteten Reports bei einem Update der Kieselstein ERP Version gelöscht werden!!
Die Hierarchie der Verzeichnisstruktur können Sie unter “System -> Druckformulare” entnehmen.
Grundsätzliche Vorgangsweise beim Bearbeiten eines Reports
- Wenn nicht vorhanden, ein Verzeichnis für Anwenderreport anlegen, und Originalreports hineinkopieren. Bitte nur die tatsächlich benötigten Formulare einkopieren (und nicht einfach alle)
- Bei bereits vorhandenem Anwenderreport: Backup des Anwenderreport-Verzeichnis erstellen.
- Textfelder (Felder oder Parameter) im iReport anpassen.
- Änderung speichern und mit “Build - Compilieren”. Damit werden ihre Änderungen im laufenden System übernommen.
- Änderung mit Kieselstein ERP Client ansehen (den entsprechenden Report Druck aufrufen).
Feldnamen der Reports
Starten sie das Programm iReport. Gehen Sie auf “Datei -> Öffnen” und laden Sie den entsprechenden Report.
Unter “Ansicht -> Report Felder” und “Ansicht -> Report Parameter” finden Sie die Feldnamen und die Parameter Namen des Report.
“Felder” werden nur im Detailabschnitt des Reports verwendet. Für jede z.B Rechnungsposition wird eine Zeile im Detailabschnitt des Reports gedruckt.
Zugriff auf ein Feld mit dem Namen Gesamtpreis ist über $F{Gesamtpreis} möglich.
“Parameter” sind nur einmal im ganzen Report vorhanden.
Zugriff auf einen Parameter mit dem Namen P_KOPFTEXT ist über $P{P_KOPFTEXT} möglich.
Die Namen sind sprechend gewählt z.B. im Anwenderreport der Rechnung unter:
im Dateiverzeichnis Ihres Kieselstein ERP-Server (…) report/rechnung/anwender/rech_rechnung.jrxml finden Sie den Parameter P_KOPFTEXT, dieser enthält den Kopftext der Rechnung.
Wollen Sie z.B. P_KOPFTEXT ändern, gehen Sie im Report auf das entsprechende Feld, klicken mit der rechten Maustaste darauf und wählen “Eigenschaften”.
Unter “Textfeld -> Ausdruck für Textfeld” sehen Sie den Wert des Feldes.
Wenn Sie unten rechts auf “Expression Editor öffnen” klicken, können Sie leicht verschiedene Felder oder Parameter auswählen und mit “Anwenden” übernehmen.
Unter “Allgemein -> Drucken wenn” wird angegeben, wann der Inhalt des Feldes angedruckt werden soll.
Z.B. new Boolean($F{Positionsart}.equals(“Stuecklistenpos”))
gibt an, dass das Feld nur gedruckt werden soll, wenn der Wert des Feldes Positionsart gleich “Stuecklistenpos” ist.
In Textfeld und Allgemein können Sie einige Konstrukte der Java Programmiersprache verwenden, die Datentypen der Felder und Parameter entsprechen Java Datentypen, weitere Informationen dazu finden Sie in der Java Dokumentation.
Wenn Sie Änderungen durchgeführt haben, gehen Sie auf “Build -> Compilieren” und ihre Änderungen werden im laufenden System übernommen.
Bevor Sie Änderungen machen, empfehlen wir ein Backup des Reportverzeichnisses zu erstellen, dadurch können fehlerhafte Änderungen zurückgenommen werden.
Weiterführende Dokumentation:
Kostenpflichtige iReport Dokumentation zu beziehen unter: http://www.jasperforge.org/sf/wiki/do/viewPage/projects.ireport/wiki/HomePage
iReport Hilfen und Dokumentation sind über Suchmaschine im Internet auffindbar.
Dies ist nur eine Kurzanleitung wie iReport mit Kieselstein ERP Drucken eingesetzt werden kann und stellt keine ausführlich iReport Anleitung dar.
Breite der Barcodes:
Die Größe der gedruckten Barcodes richtet sich nach der Größe des definierten Feldes. Der Barcode wird so gedruckt, dass er sowohl von der Breite her als auch von der Höhe her in die gedachte Umrahmung des Feldes passt. Zugleich wird das für den Barcode erforderliche Strich/Lücken Verhältnis beibehalten.
Anmerkung: Die Angabe erfolgt in 1/72" (Punkt bzw. Dezidot) Für die Umrechnung von Punkten auf mm verwenden Sie als Näherung bitte einen Multiplikator von 0,353. So ergeben 220 Punkte eine Breite von 77,66 mm.
In der Praxis hat sich bewährt, eine Höhe von 10 mm (28 Punkte) zu verwenden und die Breite ausreichend breit zu definieren.
(100/72 = Inch * 25,4 = mm = 1/72*25,4 = 0,35277)
Bitte bedenken Sie, dass ein gut lesbarer Barcode zu anderen Strichen und Kanten einen ausreichenden Abstand haben muss. Als Mindestabstand ist die Breite zweier Zeichen zu empfehlen.
Bitte bedenken Sie auch, dass Barcodescanner üblicherweise eine maximale Erfassungsbreite von 70 mm haben. D.h. mit einem Rand von wenigen Zeichen darf ein Barcode maximal 220 Punkte breit sein.
Definition der Barcodetype
Die Definition der Barcodetype wird über den Formulareditor vorgenommen.
Üblicherweise wird der Code 128 verwendet. Bitte beachten Sie dazu auch Drucken von Barcodes.
Welche Parameter können wo verwendet werden.
Alle Parameter sind in den vordefinierten, von uns gepflegten Reports enthalten. Sollten Sie in Ihrem eigenen (Anwender) Report Parameter vermissen, so öffnen Sie bitte den Originalreport, gehen Sie auf Ansicht, Reportparameter. Hier sehen Sie nun alle definierten Felder, Variablen und Parameter. Sie können den gewünschten Parameter nun mit der rechten Maustaste kopieren, in Ihren eigenen Report wechseln und dort mit rechter Maustaste und Einfügen in Ihre Reportparameterliste aufnehmen.
ACHTUNG: Die Parameter werden nur innerhalb der gleichen Reports unterstützt. Das Einfügen ungültiger Parameter in einen Report kann zum Abbruch des Programms führen.
Dies ist im Konzept des JasperReports nicht direkt vorgesehen. Als Workaround gehen Sie bitte wie folgt vor:
Definieren Sie eine neue Gruppe mit Namen Summary und als äußerste Gruppe definieren. D.h. sie muss in der Ansicht der Reportgruppen als erstes stehen. Die Summary-Gruppe mit Header Höhe 0 und Footer Höhe 78 anlegen.
Die Felder aus dem Original-Summary in den Footer der (neuen) Summary-Gruppe (=SummaryFooter) verschieben.
Das Original-Summary auf Höhe 0 setzen.
Anmerkung: Sind in den Detailpositionen Felder mit Höhe 0 enthalten, werden sie beim Einfügen der neuen Gruppe nicht mitverschoben. Diese müssen manuell an die richtige Position gebracht werden, also an die richtige Position in der richtigen Gruppe per Hand nachziehen. Beispiel: $F{Lerrzeile} im Detail des Rechnungsreports.
Dringende Empfehlung
Bilder, die auf einem Report ausgedruckt werden sollten, dürfen im Dateinamen keine Leerzeichen enthalten. Der Dateiname sollte nur aus Kleinbuchstaben und _ bestehen. Er darf nur mit Buchstaben beginnen, im weiteren Namen dürfen Ziffern vorkommen, aber nicht an erster Stelle.
Definition der Abmessungen des Reports
Die Abmessungen eines Reports / eines Formulares, z.B. einer Etikette können im Reportgenerator unter Ansicht, Reporteigenschaften definiert werden. Definieren Sie hier Abmessungen, Ausrichtungen und Ränder.
WICHTIG: Es hat sich bewährt, den Drucker immer im Porträt bzw. Hochformat zu definieren, auch wenn ein Formular verwendet wird, welches breiter als hoch ist. Um dies für die Reportvorlage richtig definieren zu können, müssen Sie die Höhe etwas höher als die Breite angeben. Die eigentliche Höhe des Etikettes definieren Sie dann mit der Höhe des Druckbereiches im jeweiligen Druck-Band (Detail, bzw. Title). Siehe dazu auch Etikettendruck.
Wenn Sie die Abmessungen des Reports verringern, so achten Sie bitte unbedingt darauf, dass auch die Höhen der einzelnen Elemente der Dokumentenstruktur (pageHeader, Detail usw.) angepasst werden müssen. Sind diese zu groß, erhalten Sie Fehlermeldungen wie:
“1. The detail section, the page and column headers and footers and the margins do not fit the page height.”
Gehen Sie in diesem Falle in die verwendeten Elemente (Bands) und klicken Sie in die Band height. Geben Sie hier einen Wert ein der passt (mm -> DeziDots = mm/0,353) oder höher ist. Beim Verlassen des Feldes wird dieser Wert dann automatisch auf die richtige Höhe gesetzt.
Der Druck des Lieferscheins ist nach unten verschoben
Wenn man ein Feld mit einer bestimmten Höhe aus einem Report löscht, dann bleibt der dafür reservierte Platz bestehen, da dieser über die Bandbreite jenes Bandes bestimmt wird, in dem sich das Feld befindet. Um also den entstehenden Leerraum zu entfernen, der durch das Löschen des Feldes entsteht, muss man die Bandbreite entsprechend anpassen.
Beispiel: Es wird ein Feld “P_BEZEICHNUNG” mit Höhe 24 Pixel aus dem Band “Title” entfernt. In der Folge muss die Bandbreite des Bandes “Title” ebenfalls um 24 Pixel verringert werden.
Seit meiner letzten Änderungen werden die Texte mit Style Informationen gedruckt.
Wird in Ihrem Report ähnliches wie
angedruckt, so muss für das jeweilige Textfeld unter Font, Is styled text angehackt sein, damit die Formatierungsinformationen aus den Kommentardateien, aus den Textdateien usw. mit angedruckt werden.

Datenexport aus der Druckvorschau
Damit insbesondere Listen in anderen Programmen weiterverarbeitet werden können, wird dringend empfohlen die Spalten und Zeilen auszurichten. Nur so wird erreicht, dass auch in den exportierten Daten die Spalten untereinanderstehen. Es reicht NICHT dies optisch auszurichten. Es muss dies mit den Jasper Werkzeugen, gleiche Breite UND links bzw. rechtsbündig ausgerichtet werden. Auch die Höhen müssen gleich und ausgerichtet sein.
Für den eigentlichen Export verwenden Sie am besten den CSV Export.
Um die Datei in Excel zu übernehmen, benennen Sie nun die Erweiterung der Datei bitte auf .TXT um. Nun mit Excel öffnen, Getrennte Breite, Trennzeichen Komma, Texterkennung “”, markieren Sie nun alle Spalten und kennzeichnen Sie diese als Text und nun Fertigstellen.
So haben Sie die Daten optimiert importiert.
Drucken von mehrspaltigen Reports z.B. für Etiketten
Mit iReport können auch mehrspaltige Reports definiert werden, so wie sie z.B. für Laseretiketten für Laserdrucker (Zweckform, Herma, …) benötigt werden. Definieren Sie dazu die Eigenschaften des Reports unter Bearbeiten, Reporteigenschaften und klicken Sie auf den Reiter Spalten.
Geben Sie hier die gewünschte Anzahl der Spalten ein und definieren Sie auch den benötigten Zwischenraum.
Im eigentlichen Report finden Sie nun die angegebenen Spalten angezeigt. Definieren Sie nun die Inhalte der linken Spalte.

Wichtiger Hinweis:
Der Druck von Etiketten auf A4 Vorlagen ist nur für den Ausdruck von einmaligen “Listen” zu empfehlen. Gerade für die Schritte, bei denen einzelne Etiketten benötigt werden, z.B. Wareneingang, werden Drucker benötigt, welche diese einzelnen Etiketten auch ausdrucken können. Das mehrmalige Einlegen von A4-Etiketten hat schon so manchen Laserdrucker ruiniert. Auch diese Formulare sind nur für den einmaligen Durchlauf durch den Laserdrucker gedacht. Wir hatten immer wieder Fälle in denen einzelne Etiketten sich vom Trägermaterial gelöst haben und auf der Trommel des Druckers geklebt sind.
Praktische Kommandos, Bedingungen im iReport
Nachfolgend eine lose Sammlung praktischer Kommandos für den iReport.
-
Nur Drucken wenn String Leer ist:
new Boolean($F{F_POSITION}!=null&&$F{F_POSITION}.trim().length()>0)
F_POSITION ist hier der String
-
new Boolean($F{F_POSITION}!=null&&$F{F_POSITION}.trim().length()>0 && $F{F_POSITIONSART}.equals(“Ident “))
Beachten Sie bitte, dass auch jeder Abschnitt seine Bedingung hat. So sind die Bedingungen für den PageHeader üblicherweise in diesem abgebildet (<$V{IS_CURRENT_PAGE_NOT_ONE}>) und nicht bei jedem einzelnen Feld.
Funktionen, die von Kieselstein ERP zusätzlich für die Reportgestaltung im iReport verwendet werden können
Nachfolgend eine Sammlung ergänzender Funktionen für die Verwendung im iReport. Voraussetzung dafür ist, dass das lpclientpc.jar in den Classpath des iReport (siehe Extras, Optionen, Classpath) eingebunden ist.
Alle Funktionen sind in der Klasse com.lp.util.HelperReport gesammelt. Der Aufruf aus iReport entspricht immer dem Muster:
com.lp.util.HelperReport.FUNKTION
-
boolean pruefeObCode39Konform(String sString)
Sind in dem String nur Code39 druckbare Zeichen enthalten
-
String wandleUmNachCode39(String input)
Ersetzt Umlaute mit deren Entsprechung ohne Umlaut
-
Double time2Double(java.sql.Time time)
-
String ersetzeUmlaute(String input)
Wandelt Ö auf Oe usw.
-
String wandleUmNachCode128(String input)
-
String ersetzeUmlauteUndSchneideAb(String input,int maxStellen)
-
String getWochentag(java.util.Locale locale, java.sql.Timestamp tDatum)
Liefert den Wochentagsnamen in der jeweiligen Sprache
-
String ganzzahligerBetragInWorten(Integer betrag)
-
Integer getCalendarOfTimestamp(java.sql.Timestamp tTimestamp, Locale locale)
-
String getMonatVonJahrUndWoche(Integer iJahr, Integer iWoche, Locale locale)
Liefert den Monatsnamen eines Jahres und einer Kalenderwoche
-
Integer getCalendarWeekOfDate(Date date)
-
Integer getCalendarWeekOfDate(String sDate, Locale locale)
-
Boolean pruefeEndsumme(BigDecimal bdReportNettoValue, BigDecimal bdHvValue, Double dAbweichung, String listeMwstsaetze, Locale reportLocale)
-
String laenderartZweierLaender(String lkzKunde, String lkzBasis, String uidNummer, java.sql.Timestamp tsEUMitglied)
Ermittelt die Länderart des Kunden in Bezug auf die Basis (= Mandant)
-
String entferneStyleInformation(String)
Entfernt die in den Texteingaben enthaltenen Styleinformationen wis bold usw.
-
int berechneModulo10(String nummer)
’nummer’ darf nur Ziffern zwischen 0 und 9 enthalten!
-
String berechneModulo10Str(String nummer)
-
Time double2Time(Number zahl)
-
Konvertierung eines Strings in einen anderen Datentyp, ohne Fehlermeldung (Exception):
BigDecimal toBigDecimal(String bigDecimal) ; // wandelt nach BigDecimal, in Locale “deAT”
BigDecimal toBigDecimal(String bigDecimal, Locale locale) ; // wandelt nach BigDecimal in angegebener Locale
BigInteger toBigInteger(String bigInteger) ; // wandelt nach BigInteger mit Radix 10 (Dezimalzahlen)
BigInteger toBigInteger(String bigInteger, int radix) ; wandelt nach BigInteger mit angegebenen Radix (oktal, hex, ….)
Integer toInteger(String integer) ; // wandelt nach Integer
All diesen Funktionen gemeinsam: Bei einem fehlerhaften Format, oder auch null als Parameter wird null anstatt einer Exception zurückgeliefert. Dies muss im Report entsprechend ausgewertet werden.
Anwendungsbeispiele:
HelperReport.toBigDecimal(“25'100,12”, new Locale(“de”, “CH”)) ; // deCH
HelperReport.toBigDecimal(“25.100,12”) ; // deAT
HelperReport.toBigDecimal("-25'987.65”) ;
Bei der Kompilierung kommt eine ClassNotFoundException Fehlermeldung
Diese Meldung bedeutet, dass der iReport Compiler eine Java Klasse nicht findet. Um die Formulare von Kieselstein ERP mit der gewünschten Funktionalität auszustatten, werden viele Klassen direkt von Kieselstein ERP zur Verfügung gestellt. Dafür muss der Pfad auf den Kieselstein ERP Client mit in den ClassPath des iReport eingebunden werden.
Sie finden dies unter Extras, Optionen, Classpath. Geben Sie hier den Pfad auf den aktuellen Kieselstein ERP Client an.

Bitte beachten Sie, dass in der Regel der Kieselstein ERP Client unter … zu finden ist.
Fehlermeldung unsupported version
Kommt beim Kompilieren eine Fehlermeldung ähnlich
java.lang.UnsupportedClassVersionError: com/lp/util/report/PositionRpt : Unsupported major.minor version 51.0
so bedeutet dies, dass iReport nicht unter Java 7 ausgeführt wird.
Beachten Sie bitte in jedem Falle, dass iReport nur unter Java 7 genutzt werden kann und dass Sie dafür den Client für Java 7 benötigen.
Die Clients für Wildfly sind für Java 8 kompiliert. Gegebenenfalls bitten Sie Ihren Kieselstein ERP Betreuer Ihnen einen passenden Client zur Verfügung zu stellen.
Gegebenenfalls siehe auch im iReport, Hilfe, Info.
Wichtiger Hinweis:
in den Reports können nur die “fields” und “parameter” verwendet werden, welche vom Kieselstein ERP-Server auch angeliefert werden. D.h. wenn Felder bzw. Parameter aus anderen Reports kopiert werden, so haben diese normalerweise nicht die gewünschte Wirkung. Hintergrund: Diese Felder werden über sogenannte Call-Backs vom Application-Server befüllt und wenn diese nicht vorgesehen sind, sind sie eben NULL.
Ausnahmen:
Es gibt Parameter, die in allen Reports zur Verfügung stehen, aber nicht in allen Reports ausgeführt sind. Diese sind:
- Mandanten-obj
- psql-executer
- logo….
- report_directory
- report_root_directory
Diese Parameter können jederzeit in einen (Haupt-)Report von einem anderen Report einkopiert werden. Für die Verwendung in Subreports müssen diese selbstverständlich durchgereicht werden.
Was sind Styles?
In iReport können Styles folgendermaßen angelegt werden: Style Bibliothek -> Neuer Style (Symbol). Daraufhin öffnet sich ein Popup, in welchem der neue Style zu definieren ist. Bei Style Name ist ein Name für den aktuellen Style anzugeben, damit man beim Anlegen mehrerer Styles den Überblick behalten kann. Der Standardstyle beinhaltet alle Formatierungen, die ein Feld standardmäßig haben soll, z.B. ist das der häufig schwarze Vordergrund auf weißem Hintergrund. Mit dem Button ‘Hinzufügen’ kann man eine neue Bedingung erstellen, an welche andere Formatierungen geknüpft sind. Z.B. legt man als Bedingung new Boolean ($F{Projektbezeichnung}.contains(“Fehler”)) fest, was bedeutet, dass wenn in dem Feld ‘Projektbezeichnung’ das Wort ‘Fehler’ vorkommt, der definierte Style angewendet wird.

Anwendung des definierten Styles im Report:
Man wählt in ein oder mehreren Reportfeld-Eigenschaften im Register ‘Allgemein’ unter ‘Style’ den zuvor definierten Style aus.
Worauf ist bei Verwendung von Styles speziell zu achten?
Damit die definierten Styles auch angezeigt werden, gibt es folgende Punkte zu beachten:
- Beim Style in der Style Bibliothek:
- Es sollten unter ‘Allgemein’ Vorder-, Hintergrundfarbe und Modus definiert sein (Modus nicht undurchsichtig, Standard wäre am besten)
- Beim Standardstyle soll ein aussagekräftiger Name definiert werden
- Beim Report-Feld, auf das der Style angewendet wird (Feld-Eigenschaften):
- Im Register ‘Allgemein’ ist beim Style der anzuwendende Style auszuwählen
- Im Register ‘Allgemein’ ist das Feld auf NICHT transparent zu setzen
- Im Register ‘Alle’ sind die Vorder- und die Hintergrundfarbe zu löschen (Bei Vorder- und Hintergrund rechts daneben das Kreis-Symbol anklicken)

Meine im iReport definierten Feldgrößen passen nicht zu den Ausdrucken
Vermutlich sind die für den Kieselstein ERP Server verfügbaren Fonts (Schriften) nicht identisch mit den von Ihnen beim Design der Reports verwendeten Schriftvorlagen. Gerade bei Linux und MAC-Servern müssen diese aus Lizenzgründen extra installiert werden. Siehe dazu bitte auch auf Ihrer Installations-CD unter Tools/Linux/Fonts.
Bei den Adressetiketten werden nur leere Etiketten gedruckt.
Wie bereits an anderer Stelle angeführt, ist das Ausdrucken von Etiketten eine eigene Wissenschaft, die manchmal unterschätzt wird. Die Thematik ist hier vor allem, dass Druckertreiber nicht immer 100%ig richtig implementiert sind und auch Aufgrund der vielen zu treffenden Einstellungen manchmal etwas vergessen wird.
Hier nun eine lose ergänzte Sammlung von Punkten / Empfehlungen, die für das Etikettendrucken erforderlich sind, die getestet werden sollten, wenn der Etikettendruck nicht wie gewünscht funktioniert:
- Stellen Sie sicher, dass Sie auf das Etikett / den Etikettendrucker eine Testseite ausdrucken können.
- Versuchen Sie das Etikett aus einem Textverarbeitungsprogramm zu drucken.
- Spannen Sie ein großes Blatt Papier ein, wenn möglich und drucken Sie auf dieses.
- Etiketten Orientierung: Etiketten werden in aller Regel im iReport so definiert, dass sie für den Designer lesbar sind. Oft ist hier die Etikettenbreite größer als die Etikettenhöhe. Dadurch wird im iReport bei Änderungen der Abmessungen die Orientierung automatisch auf Querformat umgeschaltet, was von der Druckrichtung her falsch ist. Um dies zu korrigieren, muss in das jrxml File des Reports eingegriffen werden. Ändern Sie hier bei Orientation den Wert von Landscape auf Portrait ab. Speichern Sie die Datei, gehen Sie wieder in den iReport und kompilieren sie die Datei erneut. Nun kann geduckt werden.
- Ein weißes Blatt, eine leere Etikette wird gedruckt. Um festzustellen, woran das Problem liegen könnte, vergrößern Sie das Etikettenformular entsprechend und stellen Sie die Nutzdaten einfach in die Mitte. In aller Regel erhält man nun Informationen, wo denn eigentlich hingedruckt wird.
Oft ist es auch so, dass die Orientation (siehe oben), der Auslöser für dieses Verhalten ist.
- Bei Verwendung von dedizierten Etikettendruckern, stellen Sie unbedingt in den Druckereigenschaften des Etikettendruckers das eingelegte Etikett ein.
- Bei Verwendung von CUPS Treibern achten Sie unbedingt darauf, dass die Etikettendefinition im iReport in das Etikett passt. Schon geringe Abweichungen (1 Pixel) führen dazu, dass das Etikett gedreht oder gar nicht gedruckt wird.
Ausdrucken aller Bearbeiter Daten
Gerade in Angeboten, aber auch für eine gute Kommunikation mit Ihren Partnern (Kunden und Lieferanten), ist es erwünscht, nicht nur den Namen des Ansprechpartners, sondern auch seine ausführlichen Kontaktdaten mit anzudrucken. Dafür steht in den öffentlichen Reportvorlagen eine sogenannte Objectvariable zur Verfügung.
Diese lautet in allen Reports: <P_BEARBEITER>
Um nun z.B. die EMail-Adresse des Bearbeiters anzudrucken, muss folgendes Konstrukt unter Textfeld eingegeben werden: <$P{P_BEARBEITER}.getSEmail()>
Wichtig: Damit diese Erweiterungen im iReport kompiliert werden können, muss der Klassenpfad auf das kieselstein-ejb-1.V.VV.jar / lpclientpc.jar gesetzt werden, welches du unter LW:\kieselstein\client\lib\ findest
Es stehen folgende Werte zur Verfügung:
| Typ |
Methode |
| java.lang.String |
getSEmail() |
| java.lang.String |
getSMobil() |
| java.lang.String |
getSNachname() |
| java.lang.String |
getSTelefonDWFirma() |
| java.lang.String |
getSTelefonFirma() |
| java.lang.String |
getSTitel() |
| java.lang.String |
getSVorname() |
Ausdrucken aller Positionsinhalte als einzelne Felder
Für manche offizielle Formularvorlagen ist es erwünscht, dass, insbesondere zu Positionierungszwecken, die Felder z.B. der Artikelbezeichnungen als jeweils einzelnes Datenfeld zur Verfügung stehen. Um diese Forderung zu erfüllen, wird an einige offizielle Reportvorlagen die Objectvariable <F_POSITIONSOBJEKT> übergeben. Um nun z.B. nur die Artikelnummer mithilfe dieser Objectvariabeln zu drucken, muss folgendes Konstrukt unter Textfeld eingegeben werden: $F{F_POSITIONSOBJEKT}.getSIdent()
Es stehen in den unten angeführten Vorlagen folgende Variablen zur Verfügung.
| Typ |
Aufruf |
AF |
BS |
AG |
AB |
LS |
RE |
GS |
| String |
getSIdent() |
|
|
|
|
|
|
|
| String |
getSBezeichnung() |
|
|
|
|
|
|
|
| String |
getSZusatzbezeichnung() |
|
|
|
|
|
|
|
| String |
getSZusatzbezeichnung2() |
|
|
|
|
|
|
|
| String |
getSKurzbezeichnung() |
|
|
|
|
|
|
|
| String |
getSPositionsartCNr() |
|
|
|
|
|
|
|
| String |
getSText() |
|
|
|
|
|
|
|
| BigDecimal |
getBdUmrechnungsfaktor() |
|
|
|
|
|
|
|
| String |
getSEinheitBestellung() |
|
|
|
|
|
|
|
| String |
getSArtikelgruppe() |
|
|
|
|
|
|
|
| String |
getSArtikelklasse() |
|
|
|
|
|
|
|
| String |
getSArtikelreferenznr() |
|
|
|
|
|
|
|
| String |
getSArtikelmaterial() |
|
|
|
|
|
|
|
| Float |
getFArtikelmaterialgewicht() |
|
|
|
|
|
|
|
| String |
getSVerkaufsEANNr() |
|
|
|
|
|
|
|
| String |
getSWarenverkehrsnr() |
|
|
|
|
|
|
|
| String |
getSUrsprungsland() |
|
|
|
|
|
|
|
| Float |
getFArtikelgewicht() |
|
|
|
|
|
|
|
Bitte beachten Sie auch die unter Ergebnisklasse Textfeld erforderliche Typ-Definition.
eine andere Sortierung als ursprünglich gewünscht
Um dies zu erreichen, fügt man nach der Definition der FieldNames die sogenannten sortField hinzu. Damit werden die Reports in der angegebenen Reihenfolge sortiert.
z.B.: <sortField name=“Lagerort”/>
ACHTUNG: Bei Änderungen direkt im XML, welche vom Designer nicht unterstützt werden, direkt aus dem XML heraus speichern und dann erst in den Designer zurückwechseln. XML Kommentar wird NICHT unterstützt, d.h. wieder herausgelöscht.
Das kann man natürlich auch für die Sortierung aus dem Sort-Field nutzen.
1 - Installation Jasperstudio
Einrichten des Jasperstudio
Für das Arbeiten mit Jasperstudio ist unbedingt folgendes zu beachten:
Ein Arbeiten mit Jasperstudio unter 16 GB Ram ist faktisch unmöglich. Auch muss von einer entsprechend leistungsfähigen CPU ausgegangen werden. Idealerweise sind sowohl Programme als auch Reports auf einer SSD Platte verfügbar.
Zusätzlich solltest du deinem JasperStudio mehr Speicher geben. D.h. in der “c:\Program Files\jaspersoftstudio\Jaspersoft Studio.ini” erhöhe den Wert des -Xmx von 2048m auf 4G
Automatisches Build abschalten
Es ist leider so, dass dieses Build in der Regel die erzeugten Jasper-Dateien zerstört. Daher muss dies unbedingt abgeschaltet werden, bevor die Reports, also die Projekte zugeordnet werden. Es sollte auch das automatische Sichern der Report Sources vor dem Build / Kompilieren eingeschaltet sein.
Hauptmenüleiste, Window, Preferences

General, Workspace, Build


Kompatibilität zu iReport 5.5.0
Da das Arbeiten, gerade für komplexere Reports mit Subreports und Rückgabewerten im iReport deutlich einfacher ist, ist es sehr praktisch, wenn die XML-Sourcen der Reports kompatibel zu JasperReport 5.5.0 abgespeichert werden. Es steht damit zwar das automatische Fontsizing zur Anpassung an den verfügbaren Platz NICHT zur Verfügung, aber da Schriften unter 6 Punkt sowieso als nicht geschrieben gelten, benötige ich diese Funktion nicht.

Kennzeichnen für Jasperstudio wird instabil
Wenn das automatische Sichern vor dem Kompilieren nicht mehr geht, empfiehlt sich, das Jasper Studio neu zu starten, damit nicht deine Editierarbeit vergebens war.
Installation
Report Backup
Wir raten dringend dazu, vor der Installation ein Backup des gesamten Report-Verzeichnisses zu machen. Es ist leider immer wieder vorgekommen, dass durch die Installation die Jasper-Dateien, die eigentlich ausführbaren Dateien sind, zerstört wurden.
Bitte denke auch daran, dass die Workspace-Einstellungen Benutzer-Werte sind. Also, auch wenn der gleichen Rechner/Server genutzt wird. In dem Moment, wo du dich mit einem anderen Benutzer als der einrichtende anmeldest, bitte die Einstellungen prüfen.
herunterladen
2026-02-02
Verwende nur die 6.21.5
Wichtig: verwende für die Kieselstein-ERP Libs immer die aktuelle Version.
So funktioniert die 6.21.5. mit der 1.1.16 (kieselstein-ejb-1.1.16.jar). Mit älteren Versionen gibt es anscheinend inkompatibilitäten.
Die Datei findest du unter.
Für den Download muss du dich entsprechend registrieren.
Hinweis: Auch für die Installation wird nun eine Registrierung verlangt.
2024-10-01 / 6.21.3
Mit der Version 1.0.0 oder höher kann Jasper Studio 6.21.3 verwendet werden.
einrichten
Die Einrichtung ist so aufgebaut, dass zuerst die Einstellungen im Standard Workspace erzeugt werden und dann in das Report-Verzeichnis verschoben werden. Damit das Jasperstudio das erkennt, ist ein Anlegen, Verschieben, Löschen und Re-Importieren erforderlich. Daher die nachfolgende Beschreibung.
Solltest du mehrere Kieselstein-Installationen parallel betreuen, kannst du durch entsprechende Namensvergabe dies komfortable steuern.
Neues Project = Kieselstein anlegen



Project anlegen Variante 2
Nun im Menü Project und dann Project Explorer

Wenn noch kein Projekt angelegt, dann auch hier anlegen
im leeren darunter liegenden Feld, Rechtsklick mit der Maus


Project einstellen
ACHTUNG: Ab der Version 1.0.3 ist die Pfadtrennung in dist und data aktiv. Idealerweise werden von dir nur die anwenderspezifischen Reports bearbeitet, die sich im LW:\kieselstein\data\reports befinden.
- Rechtsklick auf Projektname (Kieselstein)

Im Einstellungsdialog, Java Build Path, dann der Reiter Libraries und klicke auf Classpath.
Nun die weiteren Jars hinzufügen, also Knopf Add External JARs.

Und nun die drei Files hinzufügen

core-3.2.1.jar und javase-3.2.1.jar sind für die Bearbeitung von QR-Codes.
kieselstein-ejb-1.1.16.jar für die Verwendung der zahlreichen Helperreport-Methoden.
Die Zusatz-Libs findest du hier und
hier
Bitte beachte, dass das aktuell zu deiner Kieselstein ERP Server Version passende kieselstein-ejb-x.x.x.jar verwendet wird.
Ab der Version 2.1 muss zusätzlich auch das kieselstein-common-2.1.x.jar zur Verfügung gestellt werden.
Das kieselstein-ejb-x.x.x.jar findest du im lib Verzeichnis des Clients. Kopiere diese idealerweise in das bin Verzeichnis.
Zusätzlich solltest du bei Erweiterungen im Helper daran denken, dass diese Datei auf die aktuell von dir verwendeten Kieselstein Version aktualisiert werden sollte. Siehe dazu deinen aktuellen Client, LW:\kieselstein\client\lib\kieselstein-ejb-x.x.x.jar
Bitte beachte, dass die hier angeführten Versionsnummern zu deiner Serverinstallation passen müssen.
Hinweis:
Wenn beim Start des JasperStudio das Projekt nicht geladen werden konnte, können auch die Properties nicht eingestellt werden. Nicht geladen kommt dann vor, wenn du z.B. ein Update deines Kieselstein ERP Servers gemacht hast und die Projektdefinitionen (.project) im Report-Root-Verzeichniss mit abgelegt hast und diese damit beim Update mit-verschoben wurden.
Dies erkennt man daran dass
das Projekt nicht aufgeklappt werden kann. Stellst du nun die Datei wiederum am richtigen Platz her, so kann mit einem Doppelklick auf den Projektnamen die Definition nachgeladen werden. Somit können danach auch die Einstellungen des Projektes z.B. Java Build Path wieder bearbeitet werden.
Verbinden der Reportdateien mit dem Projekt
Automatisches Build abschalten
Unbedingt vorher das automatische Build abschalten.
dafür erneuter Rechtsklick auf den Projektnamen
Nun siehst du, wo die Einstellungsdateien liegen. Z.B.

Verschiebe diese nun in dein Kieselstein-ERP-Report-Root-Verzeichnis.

Nun das oben angelegte Projekt löschen
Also erneut Rechtsklick auf das Projekt und Delete / löschen

und aus dem Reportverzeichnis wieder importieren
Also erneuter Rechtsklick in das freie Feld im Projekt-Explorer und “Importieren” wählen.

In diesem Import Dialog, wählen General bzw. Allgemein und in dem Ordner den Typ
Existing Project into Workspace.

Hier nun das Reportverzeichnis deines Kieselstein-ERP Servers angeben.

Du findest nun im Projektexplorer unter Kieselstein die gesamten definierten Reports.

ACHTUNG:
Wenn die Reports durch eine andere Quelle, z.B. iReport verändert werden, musst du im jeweiligen Detail (Unter-) Baum mit Rechtsklick die Anzeige aktualisieren. Das auch, wenn nur der Inhalt der Reportdefinition, also das jrxml File geändert wurde.
Hinweis:
Denke daran die Kompatibilität zu iReport 5.0.0 einzustellen.
Tipp:
Die Files bitte immer aus dem Projektbaum des Jasperstudios öffnen und da auf die jrxml Files klicken. Das sind die eigentlichen Sourcen.
Hinweis:
Ist bereits unter einem anderen User eine Jasper Studio Installation vorhanden, so einfach das Jasperstudio starten. Es kommt der Willkommens Schirm. Dann Menü, Window, new Window. Dann im oberen Reiter den Project Explorer auswählen und dann weiter mit rechter Maustaste und Import.
Hinweis mehrere Installationen gleichzeitig warten
Wenn mehrere Kieselstein-Installationen faktisch parallel bearbeitet werden sollten, z.B. für verschiedene Firmen oder für die Testinstallation, so kannst du aus der ersten Installation die oben beschriebenen Dateien bzw. Verzeichnisse in die anderen Reportverzeichnisse kopieren.
WICHTIG: Es sind keine doppelten Projektnamen erlaubt. D.h. es muss nach dem Kopieren (und vor dem Importieren) die Datei .project (z.B. LW:\kieselstein\dist\wildfly-26.1.2.Final\kieselstein\reports.project) bearbeitet werden. Hier ist der Wert für
name entsprechend auf den neuen eindeutigen Projektnamen zu ändern. Danach bitte bei Projekt importieren fortsetzen.
Sollte im Importdialog
das Projekt nicht ausgewählt werden können, so gibt es ein Projekt unter diesem Namen bereits. Also die .project Datei entsprechend bearbeiten.
Wichtig:
In .classpath des Projektes stehen die einzubindenden externen Java-Klassen drinnen. D.h. wenn man gemeinsam ein Report-Verzeichnis verwenden möchte, müssen die externen Java-Klassen auch in den exakt gleichen Verzeichnissen liegen.
Hier hat sich bewährt, die
Classpathentry’s in UNC Notierung anzugeben.
D.h. man kann das bin Verzeichnis auch dafür nutzen, diese speziellen Java Libs, zentral bei den Reports mit zu hinterlegen und damit sehr klar das Projekt zur Verfügung zu haben.
Vor dem Kompilieren immer speichern
Leider ist es so, dass, obwohl “Speichern vor Kompilieren” angehakt ist, Jasperstudio auch in der Version 6.20.5 dies nicht zuverlässig macht.
Da das Ding auch immer wieder mal abstürzt, habe ich mir angewöhnt, dass ich immer, bevor ich auf “Kompilieren” klicke, auf “Speichern” klicke. Auch das übliche Strg+S geht leider nicht immer.
noch einstellen
Ich habe für mich noch folgende Einstellungen getroffen
Window, Preferences, General, Editors
Prompt to save on close event if still open elsewhere
Window, Preferences, Jaspersoft Studio, Report Designer
- Abschalten: Automatically exand bands to fit child elements
- Abschalten: Resize band to accomodate pasted elements
Window, Preferences, Jaspersoft Studio, Report Designer, Rulers And Grid
- Grid Options, schalte ich generell alles aus, lasse aber Show Rulers an und Ruler Measure Unit auf Centimeter.
- Elements Alignment ist sehr praktisch
Window, Preferences, Java, Compiler
Compiler compliance level -> habe ich auf 1.11 gestellt, da derzeit der Server nur in Java 11 compiliert ist
Window, Preferences, General

Alway run in background -> abschalten -> üblicherweise kompiliere ich nur den Report, der mich interessiert und nicht laufend alle (was man bei komplexen Programmen dann doch will)
Empfehlung
Ich richte alle Felder im 10 Pixel Raster aus. Nur wenn der Platz extrem begrenzt ist, z.B. bei Etiketten gehe ich ins 5er Raster oder wirklich pixelweise.
Das hat sich auch für Formulare, welche nach XLS oder CSV exportiert werden sollten, sehr bewährt.
Ausrichten von Feldern, Align Elements
Ab der Version 6.21.3 kann man durch markieren mehrerer Felder, Rechtsklick und Auswahl von Align Components die Felder entsprechend untereinander bzw. in Bezug zum Band ausrichten.
Damit werden die Formating Tools nicht mehr benötigt.
Wichtig
Damit die Einstellungen gespeichert werden können, muss man auf das Programmverzeichnis entsprechende Rechte vergeben
“c:\Program Files\Jaspersoft\Jaspersoft Studio-6.20.5”
Info zu Variablen
Wenn man den Namen einer Variablen ändert, ändert er automatisch alle Verwendungen auch ab.
Im iReport hat er das nicht gemacht. Hat beides seine Vorteile.
weitere Einstellungen
Wie werden CSV Daten exportiert. Siehe Window, Preferences, Jaspersoft Studio, Exporters und z.B. CSV Exporter. Hier würde ich als FieldDelimiter \t anstatt Komma versuchen.

Installation weiterer Schriften
Insbesondere für die PDF/A-3 Forderungen dürfen nur freie Schriften verwendet werden.
So wird von Kieselstein ERP in der Zugferd-Rechnung der freie Font Arimo vorausgesetzt, welcher in den Standard Formularen verwendet wird.
Es sollten nur freigegebene Fonts für die Gestaltung deiner Rechnungen inkl. der Kopf- und Fußzeilen verwendet werden.
Dieser zusätzliche Font muss unter Umständen in deinem JasperStudio eingerichtet werden. Siehe dazu
Compilieren
Um einen bearbeiteten Report zu kompilieren habe ich mir angewöhnt, zuerst auf speichern (1)(dieses einen Reports) zu klicken und danach diesen einen Report zu compilieren (2).

Nach dem kompilieren muss im unteren Panel

erscheinen. Sollten hier Fehler aufscheinen diese beheben.
Fehler beim Kompilieren finden
Auf den Tab-Problems, den Report suchen und rechts-Klick. Einstellungen siehe
Fehlermeldungen
- Anzeigen der Fehlermeldungen:

- General, Problems

- Damit erscheint unten der Problems Tab

- auf das View Menu in der Tab-Zeile rechts klicken

- nur Show Errors/Warnings on Project anhaken

- in den (fehlerhaften) Report klicken
- Rechtsklick auf den Fehler

- Goto Resource -> bringt dich direkt in den Source-Text mit dem Fehler

welche auch mit dem roten X am linken Rand gekennzeichnet ist.
Hier bewährt sich, jedes Feld mit einem eindeutigen Namen versehen zu haben.
Parameter für Subreports editieren
Leider ist das Bearbeiten von Parametern für Subreports auch im Jasper Studio 6.21.5 faktisch unmöglich. D.h., wenn du nur den JasperStudio zur Verfügung hast, musst du diese direkt in den Sourcecode reinschreiben.
- D.h. du öffnest die jrxml Datei im Jasperstudio (wobei das auch mit einem guten Texteditor gemacht werden kann, wie z.B. Notepad++ (aber kein Word o.ä.))
- du kopierst aus einem anderen Report einen bestehenden Subreport, z.B. artikel/ww_anlageverzeichnis
- gib deinem Subreport einen für dich eindeutigen und sprechenden Namen

- wechsle nun im JasperStudio auf den Reiter Source und suche nach dem Namen deines Subreports

- Kopiere nun für jeden zu übergebenden Parameter den folgenden Block. Achte dabei darauf, dass der name exakt so wie von deinem Subreport verwendet geschrieben ist. Achte auch auf die Groß-/Kleinschreibung
<subreportParameter name="P_WAEHRUNG">
<subreportParameterExpression><![CDATA[$P{P_WAEHRUNG}]]></subreportParameterExpression>
</subreportParameter>
Jeder Subreport Parameter besteht aus diesen Zeilen. Du arbeitest hier direkt in der XML Definition (man könnte auch sagen, im Source) deines Reports. Sollten sich hier Fehler einschleichen, kommt beim Wechsel zurück in die Design Ansicht eine entsprechende Fehlermeldung, wie z.B.:

- Hier hat sich bewährt Parameter für Parameter vorzugehen, also
- einen Parameter dazu schreiben
- zurückwechseln in die Design Ansicht
- kommt keine Fehlermeldung, dann speichern
- kommt eine Fehlermeldung, zurück ins Source und den Tippfehler ausbessern
- schlimmstenfalls kannst du, auf die zuletzt gespeicherte Version zurückwechseln.
Neues Field ist im Report nicht sichtbar
Wenn man im JasperStudio ein neues Feld in den Report einfügt, also mit der Maus per Drag & Drop reinzieht, so passiert es leider immer wieder, dass man das Feld zwar im Reportdesigner sieht, es aber nicht angedruckt wird.
Die Ursache dafür erkennt man daran, dass unter den Eigenschaften des Feldes der Font in hellgrau aufgeführt wird. Das bedeutet, dass dem Feld weder Font noch Größe zugewiesen ist und deshalb nichts gedruckt wird.
Man erkennt das auch im Source, dass zwar hinterlegt ist, aber wesentliche Elemente fehlen.
<staticText>
<reportElement x="0" y="10" width="100" height="10" uuid="...">
<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
</reportElement>
<text><![CDATA[Static Text]]></text>
</staticText>
Die Lösung dafür lautet, trotz den ganzen Anzeigen den Font noch einmal auswählen und auch die Schriftgröße auswählen. Damit wird die Anzeige schwarz und nach dem kompilieren ist das Feld auch sichtbar. Im Source sieht man
<textElement>
<font fontName="Arimo" size="8"/>
</textElement>
ein neues XML Element, welches den Font auch definiert.
2 - Installation iReport 5.5.0
Einrichten des iReport
Um den iReport mit Kieselstein ERP verwenden zu können, darf ausschließlich die Version 5.5.0 verwendet werden.
Diese benötigt selbst wiederum Java 7, welche üblicherweise nicht mehr auf den Rechnern installiert ist.
Wenn du iReport verwenden möchtest, raten wir den iReport nach dem Jasper Studio zu installieren, sodass die Erweiterung .jrxml auf den iReport zeigt und die Erweiterung .jasper auf das Jasper Studio.
Herunterladen von: https://sourceforge.net/projects/ireport/files/iReport/iReport-5.5.0/iReport-5.5.0-windows-installer.exe/download?use_mirror=kumisystems&download=&failedmirror=deac-riga.dl.sourceforge.net
Für das Drucken von QR-Codes benötigst du zusätzlich noch
core-3.2.1.jar
javase-3.2.1.jar
Für alle ehemaligen HELIUM V Anwender, hier muss es auch ein lpclientpc.jar geben, welches noch mit Java 7 kompiliert wurde. Dieses ebenfalls unter zusatz_libs zur Verfügung stellen.
Unsere Empfehlung ist, dass du im Verzeichnis c:\Program Files (x86)\Jaspersoft\iReport-5.5.0\ ein weiteres Unterverzeichnis zusatz_libs anlegst, in das diese Dateien installiert werden.
Diese Dateien müssen in den Classpath (Extras, Optionen, Reiter Classpath) mit aufgenommen werden.
Zusätzlich muss die c:\Program Files (x86)\Jaspersoft\iReport-5.5.0\etc\ireport.conf geändert werden, dass beim Aufruf von iReport 5.5.0 das Java 7 verwendet wird.
Wir legen dies üblicherweise unter c:\Program Files (x86)\Jaspersoft\iReport-5.5.0\jre7 ab.
D.h. hier ist das
jdkhome=“c:\Program Files (x86)\Jaspersoft\iReport-5.5.0\jre7”
zu setzen.
Da das JRE7 in der richtigen Version aktuell schwer zu bekommen ist, haben wir hier eine Version zusammengestellt.
Vor dem ersten Einsatz des iReport solltest du unter Optionen Plugins konfigurieren. Check for iReport Updates ausschalten und wichtig unter Optionen, Optionen Register Compiler Reportverzeichnis zum Compilieren verwenden anhaken. Der Haken bei keep.java kann entfernt werden.
Dass du auf das Verzeichnis der Reports ein Schreibrecht haben musst, ist selbstverständlich.
Bitte beachte auch, dass, falls die Reports auf einem Netzwerk-Share liegen, dieses Share mit ein Laufwerksbuchstaben zugewiesen sein muss. Mit UNC Pfad kommt der iReport nicht zurecht.
daran denken
Um im iReport die Konfigurationen überhaupt speichern zu dürfen, sind Schreibrechte am Verzeichnis erforderlich.
Report Editor
Nachfolgend Hinweise zu der Arbeitsweise und den Eigenheiten von iReport welche bei der Gestaltung der Reports beachtet werden sollten.
Hinweis: Für das Arbeiten mit iReport sollte mindestens eine Zwei-Tasten Maus zur Verfügung stehen. Eine Bearbeitung der Druckformulare mit nur eine Maustaste (MAC) ist nicht möglich.
Achtung: Wenn Sie Druckformulare selbst bearbeiten wollen, müssen Sie diese als Anwenderreport ablegen, da ansonsten die bearbeiteten Reports bei einem Update der Kieselstein ERP Version gelöscht werden!!
Die Hierarchie der Verzeichnisstruktur siehe
Vor dem ersten Einsatz des iReport sollten Sie unter Optionen Plugins konfigurieren Check for iReport Updates ausschalten und ‘‘‘wichtig’’’ unter Optionen, Optionen Register Compiler ‘‘‘Reportverzeichnis zum Compilieren verwenden’’’ anhaken. Der Haken bei keep.java kann entfernt werden.
Dass Sie auf das Verzeichnis der Reports ein Schreibrecht haben müssen, ist selbstverständlich.
Grundsätzliche Vorgangsweise beim Bearbeiten eines Reports
- Wenn nicht vorhanden, ein Verzeichnis für Anwenderreport anlegen, und Originalreports hineinkopieren.
- Bei bereits vorhandenem Anwenderreport: Backup des Anwenderreport-Verzeichnisses erstellen.
- Textfelder (Felder oder Parameter) im iReport anpassen.
- Änderung speichern und mit “Build - Compilieren” werden ihre Änderungen im laufenden System übernommen.
- Änderung mit Kieselstein ERP Client ansehen (den entsprechenden Report Druck aufrufen).
Feldnamen der Reports
Starten sie das Programm iReport. Gehen Sie auf “Datei -> Öffnen” und laden Sie den entsprechenden Report.
Unter “Ansicht -> Report Felder” und “Ansicht -> Report Parameter” finden Sie die Feldnamen und die Parameter Namen des Reports.
“Felder” werden nur im Detailabschnitt des Reports verwendet. Für jede z.B. Rechnungsposition wird eine Zeile im Detailabschnitt des Reports gedruckt.
Zugriff auf ein Feld mit dem Namen Gesamtpreis ist über $F{Gesamtpreis} möglich.
“Parameter” sind nur einmal im ganzen Report vorhanden.
Zugriff auf einen Parameter mit dem Namen P_KOPFTEXT ist über $P{P_KOPFTEXT} möglich.
Die Namen sind sprechend gewählt z.B. im Anwenderreport der Rechnung unter:
im Dateiverzeichnis deines Kieselstein ERP Server (…) /server/helium/report/rechnung/anwender/rech_rechnung.jrxml
finden Sie den Parameter P_KOPFTEXT, dieser enthält den Kopftext der Rechnung.
Wollen Sie z.B. P_KOPFTEXT ändern, gehen Sie im Report auf das entsprechende Feld, klicken mit der rechten Maustaste darauf und wählen “Eigenschaften”.
Unter “Textfeld -> Ausdruck für Textfeld” sehen Sie den Wert des Feldes.
Wenn Sie unten rechts auf “Expression Editor öffnen” klicken, können Sie leicht verschiedene Felder oder Parameter auswählen und mit “Anwenden” übernehmen.
Unter “Allgemein -> Drucken wenn” wird angegeben, wann der Inhalt des Feldes angedruckt werden soll.
Z.B. new Boolean($F{Positionsart}.equals(“Stuecklistenpos”))
gibt an, dass das Feld nur gedruckt werden soll, wenn der Wert des Feldes Positionsart gleich “Stuecklistenpos” ist.
In Textfeld und Allgemein können Sie einige Konstrukte der Java Programmiersprache verwenden, die Datentypen der Felder und Parameter entsprechen Java Datentypen, weitere Informationen dazu finden Sie in der Java Dokumentation.
Wenn Sie Änderungen durchgeführt haben, gehen Sie auf “Build -> Compilieren” und ihre Änderungen werden im laufenden System übernommen.
Bevor Sie Änderungen machen, empfehlen wir ein Backup des Reportverzeichnises zu erstellen, dadurch können fehlerhafte Änderungen zurückgenommen werden.
Weiterführende Dokumentation:
Kostenpflichtige iReport Dokumentation zu beziehen unter: http://www.jasperforge.org/sf/wiki/do/viewPage/projects.ireport/wiki/HomePage
iReport Hilfen und Dokumentation sind über Suchmaschinen im Internet auffindbar.
Dies ist nur eine Kurzanleitung wie iReport mit Kieselstein ERP Drucken eingesetzt werden kann und stellt keine ausführliche iReport Anleitung dar.
Breite der Barcodes:
Die Größe der gedruckten Barcodes richtet sich nach der Größe des definierten Feldes. Der Barcode wird so gedruckt, dass er sowohl von der Breite her, als auch von der Höhe her in die gedachte Umrahmung des Feldes passt. Zugleich wird das für den Barcode erforderliche Strich/Lücken Verhältnis beibehalten.
Anmerkung: Die Angabe erfolgt in 1/72" (Punkt bzw. Dezidot) Für die Umrechnung von Punkten auf mm verwenden Sie als Näherung bitte einen Multiplikator von 0,353. So ergeben 220 Punkte eine Breite von 77,66mm
In der Praxis hat sich bewährt, eine Höhe von 10mm (28Punkte) zu verwenden und die Breite ausreichend breit zu definieren.
(100/72 = Inch * 25,4 = mm = 1/72*25,4 = 0,35277)
Bitte bedenken Sie, dass ein gut lesbarer Barcode zu anderen Strichen und Kanten einen ausreichenden Abstand haben muss. Als Mindestabstand ist die Breite zweier Zeichen zu empfehlen.
Bitte bedenken Sie auch, dass Barcodescanner üblicherweise eine maximale Erfassungsbreite von 70 mm haben. D.h. mit einem Rand von wenigen Zeichen darf ein Barcode maximal 220 Punkte breit sein.
Definition der Barcodetype
Die Definition der Barcodetype wird über den Formulareditor vorgenommen.
Üblicherweise wird der Code 128 oder der QR-Code verwendet. Bitte beachte dazu auch Drucken von Barcodes
Welche Parameter können wo verwendet werden.
Alle Parameter sind in den vordefinierten, von uns gepflegten Reports enthalten. Sollten Sie in Ihrem eigenen (Anwender) Report Parameter vermissen, so öffnen Sie bitte den original Report, gehen Sie auf Ansicht, Reportparameter. Hier sehen Sie nun alle definierten Felder, Variablen und Parameter. Sie können den gewünschten Parameter nun mit der rechten Maustaste kopieren, in Ihren eigenen Report wechseln und dort mit rechter Maustaste und Einfügen in Ihre Reportparameterliste aufnehmen.
ACHTUNG: Die Parameter werden nur innerhalb der gleichen Reports unterstützt. Das Einfügen ungültiger Parameter in einen Report kann zum Abbruch des Programms führen.
Dies ist im Konzept des JasperReports nicht direkt vorgesehen. Als Workaround gehen Sie bitte wie folgt vor:
Definieren Sie eine neue Gruppe mit Namen Summary und als äußerste Gruppe definieren. D.h. sie muss in der Ansicht der Reportgruppen als erstes stehen. Die Summary-Gruppe mit Header Höhe 0 und Footer Höhe 78 anlegen.
Die Felder aus dem original Summary in den Footer der (neuen) Summary-Gruppe (=SummaryFooter) verschieben.
Das original Summary auf Höhe 0 setzen.
Anmerkung: Sind in den Detailpositionen Felder mit Höhe 0 enthalten, werden sie beim Einfügen der neuen Gruppe nicht mitverschoben. Diese müssen manuell an die richtige Position gebracht werden, also an die richtige Position in der richtigen Gruppe per Hand nachziehen. Beispiel: $F{Lerrzeile} im Detail des Rechnungsreports.
Dringende Empfehlung:
Bilder, die auf einem Report ausgedruckt werden sollten, dürfen im Dateinamen keine Leerzeichen enthalten. Der Dateiname sollte nur aus Kleinbuchstaben und _ bestehen. Er darf nur mit Buchstaben beginnen, im weiteren Namen dürfen Ziffern vorkommen, aber nicht an erster Stelle.
Definition der Abmessungen des Reports:
Die Abmessungen eines Reports / eines Formulares, z.B. einer Etiketten können im Reportgenerator unter Ansicht, Reporteigenschaften definiert werden. Definieren Sie hier Abmessungen, Ausrichtungen und Ränder.
WICHTIG: Es hat sich bewährt, den Drucker immer im Porträt bzw. Hochformat zu definieren, auch wenn ein Formular verwendet wird, welches Breiter als Hoch ist. Um dies für die Reportvorlage richtig definieren zu können, müssen Sie die Höhe etwas höher als die Breite angeben. Die eigentliche Höhe des Etikettes definieren Sie dann mit der Höhe des Druckbereiches im jeweiligen Druck-Band (Detail, bzw. Title). Siehe dazu auch Etikettendruck.
Wenn Sie die Abmessungen des Reports verringern, so achten Sie bitte unbedingt darauf, dass auch die Höhen der einzelnen Elemente der Dokumentenstruktur (pageHeader, Detail usw.) angepasst werden müssen. Sind diese zu groß, erhalten Sie Fehlermeldungen wie:
“1. The detail section, the page and column headers and footers and the margins do not fit the page height.”
Gehen Sie in diesem Falle in die verwendeten Elemente (Bands) und klicken Sie in die Band height. Geben Sie hier einen Wert ein, der passt (mm -> DeziDots = mm/0,353) oder höher ist. Beim Verlassen des Feldes wird dieser Wert dann automatisch auf die richtige Höhe gesetzt.
Der Druck des Lieferscheins ist nach unten verschoben
Wenn man ein Feld mit einer bestimmten Höhe aus einem Report löscht, dann bleibt der dafür reservierte Platz bestehen, da dieser über die Bandbreite jenes Bandes bestimmt wird, in dem sich das Feld befindet. Um also den entstehenden Leerraum zu entfernen, der durch das Löschen des Feldes entsteht, muss man die Bandbreite entsprechend anpassen.
Beispiel: Es wird ein Feld “P_BEZEICHNUNG” mit Höhe 24 Pixel aus dem Band “Title” entfernt. In der Folge muss die Bandbreite des Bandes “Title” ebenfalls um 24 Pixel verringert werden.
Seit meiner letzten Änderungen werden die Texte mit Style Informationen gedruckt.
Wird in Ihrem Report ähnliches wie
angedruckt, so muss für das jeweilige Textfeld unter Font, Is styled text angehackt sein, damit die Formatierungsinformationen aus den Kommentardateien, aus den Textdateien usw. mit angedruckt werden.

Datenexport aus der Druckvorschau
Damit insbesondere Listen in anderen Programmen weiterverarbeitet werden können, wird dringend empfohlen die Spalten und Zeilen auszurichten. Nur so wird erreicht, dass auch in den exportierten Daten die Spalten untereinander stehen. Es reicht NICHT dies optisch auszurichten. Es muss dies mit den Jasper Werkzeugen, gleiche Breite UND links bzw. rechtsbündig ausgerichtet werden. Auch die Höhen müssen gleich und ausgerichtet sein.
Für den eigentlichen Export verwenden Sie am besten den CSV Export.
Um die Datei in Excel zu übernehmen, benennen Sie nun die Erweiterung der Datei bitte auf .TXT um. Nun mit Excel öffnen, Getrennte Breite, Trennzeichen Komma, Texterkennung “”, markieren Sie nun alle Spalten und Kennzeichnen Sie diese als Text und nun Fertigstellen.
So haben Sie die Daten optimiert importiert.
Drucken von mehrspaltigen Reports z.B. für Etiketten
Mit iReport können auch mehrspaltige Reports definiert werden, so wie sie z.B. für Laseretiketten für Laserdrucker (Zweckform, Herma, …) benötigt werden. Definieren Sie dazu die Eigenschaften des Reports unter Bearbeiten, Reporteigenschaften und klicken Sie auf den Reiter Spalten.

Geben Sie hier die gewünschte Anzahl der Spalten ein und definieren Sie auch den benötigten Zwischenraum.
Im eigentlichen Report finden Sie nun die angegebenen Spalten angezeigt. Definieren Sie nun die Inhalte der linken Spalte.

Wichtiger Hinweis:
Der Druck von Etiketten auf A4 Vorlagen ist nur für den Ausdruck von einmaligen “Listen” zu empfehlen. Gerade für die Schritte bei denen einzelne Etiketten benötigt werden, z.B. Wareneingang, werden Drucker benötigt, welche diese Einzelnen Etiketten auch ausdrucken können.
Das mehrmalige Einlegen von A4-Etiketten hat schon so manchen Laserdrucker ruiniert. Auch diese Formulare sind nur für den einmaligen Durchlauf durch den Laserdrucker gedacht. Wir hatten immer wieder Fälle in denen einzelne Etiketten sich vom Trägermaterial gelöst haben und auf der Trommel des Druckers geklebt sind.
Praktische Kommandos, Bedingungen im iReport
Nachfolgend eine lose Sammlung praktischer Kommandos für den iReport.
-
Nur Drucken wenn String Leer ist:
new Boolean($F{F_POSITION}!=null&&$F{F_POSITION}.trim().length()>0)
F_POSITION ist hier der String
-
new Boolean($F{F_POSITION}!=null&&$F{F_POSITION}.trim().length()>0 && $F{F_POSITIONSART}.equals(“Ident “))
Beachten Sie bitte, dass auch jeder Abschnitt seine Bedingung hat. So sind die Bedingungen für den PageHeader üblicherweise in diesem abgebildet (<$V{IS_CURRENT_PAGE_NOT_ONE}>) und nicht bei jedem einzelnen Feld.
Funktionen die von Kieselstein ERP zusätzlich für die Reportgestaltung im iReport verwendet werden können
Nachfolgend eine Sammlung ergänzender Funktionen für die Verwendung im iReport. Voraussetzung dafür ist, dass das lpclientpc.jar in den Classpath des iReport (siehe Extras, Optionen, Classpath) eingebunden ist.
Alle Funktionen sind in der Klasse com.lp.util.HelperReport gesammelt. Der Aufruf aus iReport entspricht immer dem Muster:
com.lp.util.HelperReport.FUNKTION
-
boolean pruefeObCode39Konform(String sString)
Sind in dem String nur Code39 druckbare Zeichen enthalten
-
String wandleUmNachCode39(String input)
Ersetzt Umlaute mit deren Entsprechung ohne Umlaut
-
Double time2Double(java.sql.Time time)
-
String ersetzeUmlaute(String input)
Wandelt Ö auf Oe usw.
-
String wandleUmNachCode128(String input)
-
String ersetzeUmlauteUndSchneideAb(String input,int maxStellen)
-
String getWochentag(java.util.Locale locale, java.sql.Timestamp tDatum)
Liefert den Wochentagsnamen in der jeweiligen Sprache
-
String ganzzahligerBetragInWorten(Integer betrag)
-
Integer getCalendarOfTimestamp(java.sql.Timestamp tTimestamp, Locale locale)
-
String getMonatVonJahrUndWoche(Integer iJahr, Integer iWoche, Locale locale)
Liefert den Monatsnamen eines Jahres und einer Kalenderwoche
-
Integer getCalendarWeekOfDate(Date date)
-
Integer getCalendarWeekOfDate(String sDate, Locale locale)
-
Boolean pruefeEndsumme(BigDecimal bdReportNettoValue, BigDecimal bdHvValue, Double dAbweichung, String listeMwstsaetze, Locale reportLocale)
-
String laenderartZweierLaender(String lkzKunde, String lkzBasis, String uidNummer, java.sql.Timestamp tsEUMitglied)
Ermittelt die Länderart des Kunden in Bezug auf die Basis (= Mandant)
-
int berechneModulo10(String nummer)
’nummer’ darf nur Ziffern zwischen 0 und 9 enthalten!
-
String berechneModulo10Str(String nummer)
-
Time double2Time(Number zahl)
-
Konvertierung eines Strings in einen anderen Datentyp, ohne Fehlermeldung (Exception):
BigDecimal toBigDecimal(String bigDecimal) ; // wandelt nach BigDecimal, in Locale “deAT”
BigDecimal toBigDecimal(String bigDecimal, Locale locale) ; // wandelt nach BigDecimal in angegebener Locale
BigInteger toBigInteger(String bigInteger) ; // wandelt nach BigInteger mit Radix 10 (Dezimalzahlen)
BigInteger toBigInteger(String bigInteger, int radix) ; wandelt nach BigInteger mit angegebenen Radix (oktal, hex, ….)
Integer toInteger(String integer) ; // wandelt nach Integer
All diesen Funktionen gemeinsam: Bei einem fehlerhaften Format, oder auch null als Parameter wird null anstatt einer Exception zurückgeliefert. Dies muss im Report entsprechend ausgewertet werden.
Anwendungsbeispiele:
HelperReport.toBigDecimal("25'100,12", new Locale("de", "CH")) ; // deCH
HelperReport.toBigDecimal("25.100,12") ; // deAT
HelperReport.toBigDecimal("-25'987.65") ;
Für weitere Helper siehe auch
Bei der Komplierung kommt eine ClassNotFoundException Fehlermeldung
Diese Meldung bedeutet, dass der iReport Compiler eine Java Klasse nicht findet. Um die Formulare von Kieselstein ERP mit der gewünschten Funktionalität auszustatten, werden viele Klassen direkt von Kieselstein ERP zur Verfügung gestellt. Dafür muss der Pfad auf den Kieselstein ERP Client mit in den ClassPath des iReport eingebunden werden.
Sie finden dies unter Extras, Optionen, Classpath. Geben Sie hier den Pfad auf den aktuellen Kieselstein ERP Client an.

Fehlermeldung unsupported version
Kommt beim Kompilieren eine Fehlermeldung ähnlich
java.lang.UnsupportedClassVersionError: com/lp/util/report/PositionRpt : Unsupported major.minor version 51.0
so bedeutet dies, dass iReport nicht unter Java 7 ausgeführt wird.
Beachten Sie bitte in jedem Falle, dass Sie iReport nur unter Java 7 genutzt werden kann und dass Sie dafür den Client für Java 7 benötigen.
Die Clients für Kieselstein ERP sind für Java 8 kompiliert, was bedeutet dass für Anwender die nur Kieselstein ERP verwenden, das JasperStudio eingesetzt werden muss. Die Arbeitsweise ist sehr ähnlich.
2.1 - Rückwärts-Kompatibilität Jasperstudio -> iReport 5.5.0
Rückwärts Kompatibilität des iReport <-> Jasper Studio
Es kommt immer wieder vor, dass Reports im Jasperstudio ohne Berücksichtigung der Rückwärtskompatibilität bearbeitet wurden.
Wenn man nun, aus den verschiedensten Gründen, als Report-Designer dann doch den alten iReport verwenden möchte / muss, so sind uns bisher folgende Punkte aufgefallen, die über einen Texteditor im jrxml File geändert werden müssen.
-
Änderungen
- das Feld textAdjust=“StretchHeight” aus JasperStudio muss in iReport isStretchWithOverflow=“true” heissen.
Wichtig: Wurde die Rückwärtsübersetzung nicht durchgeführt, geht die Information verloren und damit wurde eventuell der Report teilweise unbrauchbar, da nicht mehr die gesamte Information angedruckt wird.
-
Verschiedene Barcode-Komponenten, die über JasperStudio eingefügt wurden, kann der iReport nicht mehr interpretieren. D.h. diese im JasperStudio aus dem XML entfernen und “nur” abspeichern. Dann kann der Report wieder im iReport geöffnet werden.
Beim Öffnen im iReport erscheint z.B. die Fehlermeldung:

Man findet im Report.jrxml

Diesen Block komplett entfernen und durch ein iReport Element ersetzen.
In diesem Falle ist es ein DataMatrix Barcode, welcher in seiner Definition im iReport anders ist, da andere Lib’s verwendet werden.
Zusatznotiz zum DataMatrix Code.
In den freien Lib’s ist bei Dateninhalten mit drei oder mehr * (Sternchen) ein Bug enthalten, der den Code für die Scanner nicht lesbar macht. Dies ist derzeit (2024) nur durch Kauflizenzen der Barcodelibrary behebbar. Daher unser Rat -> QR-Code verwenden.
3 - Formulare bearbeiten
Formulare bearbeiten
Es hat sich bewährt, die Bereiche, welche Bands genannt werden, die nicht benötigt werden, mit Löschen zu entfernen. Die üblichen Standardbereiche (z.B. Summary) erscheinen dann in Grau und können jederzeit wieder aktiviert werden.
Title
Daten, die vom Kieselstein-ERP Server angeliefert werden
Parameter
Fields
Variablen
Empfehlungen zum Bearbeiten
wo findet man im Jasperstudio was?
Seiteneigenschaften:
- Report anklicken, rechte Maus
- Show Properties
- dann im rechten Eingabedialog, rechts unten
Edit Page Format
- hier kann auch die Darstellung der Feldeinheiten (Pixel, mm) eingerichtet werden.
wie findet man Parameter / Field - Namen?
Manchmal kommt es vor, dass man einfach den Namen des Parameters / des Feldes nicht findet (weil schon 100-Mal überlesen). Dafür einfach in den Reiter Source gehen und hier nach Teilen des erwarteten Namens suchen. Meist wird es dann klar, wie der Name genau lautet.
Hyperlink
Hyperlink sind praktische zusätzliche Eigenschaften innerhalb der Reports.
In Verbindung mit dem Report-GoTo kann man hier fast einen Drilldown implementieren. D.h. aus dem Report heraus auf einen bestimmten Datensatz springen oder dies für eine externe Verlinkung, z.B. zur Kieselstein ERP Homepage nutzen.
Info:
Um für den Hyperlink auch die Tooltips bearbeiten zu können, klickst du das gewünschte Feld an und wechselst dann auf Advanced
. Hier findest du auch den Hyperlink Tooltip
. Dieser muss von seinem Inhalt her immer ein String, keine Konstante, sein.
kann man Parameter / Fields von einem zum anderen Report kopieren?
Nein!
Da die Werte / Inhalte der Parameter / Fields über sogenannte Call-Back abgerufen werden, werden vom Kieselstein ERP Server nur die Inhalte angeliefert, die auch tatsächlich programmtechnisch vorgesehen sind.
In allen Hauptreports stehen folgende Parameter zur Verfügung, auch wenn sie nicht in den Formularen ausgeführt sind (historisch bedingt).
- REPORT_DIRECTORY
- REPORT_ROOT_DIRECTORY
- P_LOGO_IMAGE
- P_MANDANT_OBJ
- P_SUBDIRECTORY
- P_MODUL
- P_SQLEXEC
- P_SQLEXEC.execute(QueryString mit einem Rückgabewert)
- P_SQLEXEC.executes(QueryString mit einem Array von Rückgabewerten)
Als Beispiel siehe pers_benutzerstatistik.jrxml, Variable MaxAB_Pos_1 bzw. siehe
- P_SQLEXEC.subreport(QueryString mit Rückgabewert(en) die wiederum in einem Subreport verwendet werden können)
Der Parameter REPORT_ROOT_DIRECTORY
Dieser Parameter zeigt direkt auf das Report Rootverzeichnis der Standard-Reports. Also z.B. auf LW:\kieselstein\dist\wildfly-26.1.2.Final\kieselstein\reports. Üblicher Weise wurde diese Definition dazu genutzt, auf ein Logo, ein allgemeines Formular, welches im Bereich der Anwender-Reports definiert ist (sein muss), zu zeigen. Eine Möglichkeit diesen Parameter weiter zu nutzen ist, diesen wie folgt zu nutzen.
new java.io.File($P{REPORT_ROOT_DIRECTORY}.substring(0,$P{REPORT_ROOT_DIRECTORY}.toLowerCase().lastIndexOf( "dist" ))+
"/data/reports/allgemein/iso9001.png").toURL()
Beachte auch hier die entsprechende Schreibweise für Windows / Linux.
Das kommt darauf an!
Will man eine Reportvariante erstellen, so muss immer vom Originalformular ausgegangen werden.
Die meisten Fehler passieren, wenn man unterschiedliche Formulare, die optisch gleich sind, übertragen möchte.
Ein Beispiel:
Das Los Ablieferetikett wurde schön gestaltet, es funktioniert alles. In diesem konkreten Falle wurde auch die Referenznummer der Stückliste mitgedruckt.
Nun bestand auch der Wunsch, dass das Losetikett gleich aussehen sollte, einziger Unterschied, die Chargennummer kommt aus dem Kommentar.
Nun wurde einfach das Ablieferetikett kopiert und als Losetikett definiert. Ging eigentlich ganz gut, nur die Referenznummer wurde nicht gedruckt.
Hintergrund: Die Fields und Parameter sind leider, aus den verschiedensten Gründen nicht immer gleich benannt. Daher findet der Callback das Field, den Parameter nicht und somit kann es nicht funktionieren.
Um nun, gerade bei Etiketten diese effizient vom einem Formular zum anderen zu übertragen hat sich folgende Arbeitsweise bewährt:
- Kopieren der neuen Ziel-Etikette auf den gewünschten Namen (alles klein, keine Umlaute nur Underline)
- Öffnen der optisch zu kopierenden Etikette und der Zieletikette im Reportgenerator
- Verschieben der Originalfelder in der Zieletiketten z.B. rechts raus, damit im eigentlichen Feld Platz wird.
- Kopieren aller Felder in die Zieletikette
- üblicherweise sind die Felder um 10x10 Pixel nach rechts unten verschoben. Also mit Strg+Cursor nach oben und nach links an die richtige Stelle schieben
- Speichern
- die Größe der Zieletikette anpassen
- die Felder / Parameter auf die richtigen Namen umbenennen
- die überzähligen Felder löschen
- Kompilieren. Hat man vergessen ein Feld umzubenennen, kommt ein entsprechender Fehler.
Merke
Fields und Parameter immer nur vom Original-Ausgangsreport nachtragen. NIE von irgendeinem anderen Report, auch wenn er sehr ähnlich zu sein scheint.
was bedeuten die gelben Rufzeichen?

in “alten” Reports werden für sehr viele Felder diese Ausrufezeichen angezeigt. Diese bedeuten generell, dass mit diesem Feld irgendwas nicht stimmt. Da man beim normalen Arbeiten diese Information benötigt, sollten die “falschen” Fehler / Warnungen entfernt werden.
Fährt man mit der Maus auf das Ausrufezeichen, so sieht man eine genauere Fehlermeldung. 
Das bedeutet nun, dass man, um diesen Hinweis wegzubekommen, die PDF Font Namen aus dem Source entfernen muss. Also:
- auf den Reiter Source klicken

- Strg+F (Finden und Ersetzen) und PDFFontName eingeben

- damit findet man den ersten Eintrag von

- diesen durch nichts (leer) im gesamten XML ersetzen
- üblicherweise sind pdfFontName=“Helvetica” und pdfFontName=“Helvetica-Bold” verwendet. Diese alle entfernen. Damit sind die Warnungen bzgl. PdfFontName weg und die Rufzeichen haben wieder ihre übliche Bedeutung.
Um das Ausrufezeichen bei einem einzelnen Feld zu entfernen, dieses markieren, in den Properties auf den Reiter Advanced gehen und unter PDF abschalten.

Leider wird dadurch der Eintrag im Source nicht entfernt, daher muss man, wie oben beschrieben, diesen manuell aus dem Source entfernen.
Sammlung von praktischen Sonderzeichen
| Sonderzeichen |
Bedeutung |
Bemerkung |
| • |
Interpunktion |
|
| · |
Middle Dot |
|
| √ |
ok Häckchen |
ACHTUNG: Anzeige im Browser geht so nicht. |
| Ø |
Durchmesserzeichen, Alt+0216 |
Hinweis: Das original UTF Durchmesserzeichen, wird vom Tahoma-Font leider nicht unterstützt |
| ∑ |
Summenzeichen |
|
| ► |
Hinweis in den Reports auf GoTo |
ACHTUNG: Anzeige im Browser geht so nicht. |
Siehe dazu auch https://wiki.selfhtml.org/wiki/Zeichenreferenz oder auch https://seo-summary.de/html-sonderzeichen/
Für Sonderzeichen in den message-dateien (Sprachübersetzungen) müssen die Unicodezeichen verwendet werden. Eine Definition ist in den jeweiligen Sprachen enthalten, siehe aber auch z.B. https://symbl.cc/de/unicode/table/.
Farbverläufe darstellen
Manchmal will man z.B. die zusammengehörenden Ebenen farblich darstellen um so rasch zu sehen was zusammen gehört. Dies kann man z.B. mit Styles machen. Als Beispiel sei auf den Report ../fertigung/fert_gesamtkalkulation.jrxml verwiesen.
Fehlermeldung: Parameter msg must not be empty
Wenn ein Formular, mit einem Barcode nicht gedruckt werden kann -> es kommt schwerer Fehler und es steht im Detail der Fehlertext:
java.lang.NullPointerException: Parameter msg must not be empty
So bedeutet dies, dass versucht wurde einen Barcode für einen Leerstring auszudrucken.
Das muss bitte in der Druckbedingung für den Barcode abgefangen werden, sodass gar kein Barcode erzeugt wird.
Druck von Datamatrix Codes
Es kommt immer wieder mal vor, dass Datamatrix Barcodes mal quadratisch und das andere Mal rechteckig gedruckt werden.
Wenn das für dich wichtig ist, so muss im Reportgenerator (iReport)

bzw. im Jasper Studio im Reiter Barcode

unter Shape auf Force Square gestellt werden.
Beachte bitte zusätzlich, dass die verwendete Library für den Datamatrix Code, so wie alle freien Bibliotheken, fehlerhafte Inhalte liefert, wenn drei oder mehr Sternchen in den Daten enthalten sind.
Kennzeichnung Ausdruck Art
Woher kommen die Informationen der Ausdruckart (große Druckvorschau, E-Mail, …).
Auf den offiziellen Belegen, Anfrage bis Proformarechnung wird bei der Aktivierung auch mit angedruckt, auf welchen Weg dieser Beleg erzeugt wurde. D.h. es wird am rechten Rand der tatsächliche Ausdruckzeitpunkt und der Weg des Ausdrucks eingeblendet.

Dieser Streifen setzt sich aus zwei Informationen zusammen:
- im Report Background wird der Text (Erzeugt durch…) und der Ausdruckzeitpunkt ausgeführt. Dieser kann auch Sprachabhängig sein.

- Im Report Ausdruckmedium wird anhand der Drucktype definiert welche Information dafür angedruckt wird.

Da diese Information in der Regel für dich, bzw. dein Finanzamt von Bedeutung ist, ist dies nicht Sprachabhängig.
Der Inhalt dieses Reports wird programmtechnisch beim tatsächlichen “Druck”, also der Aktivierung des Beleges in den Ausdruck eingebunden.
Pfade
Nachdem immer öfter die Frage nach den Pfaden bzw. wie hängen denn die Reports untereinander zusammen kommt, hier der Versuch einer Aufstellung derselben.
Grundsätzlich beginnt es damit, welche Reports werden verwendet:
- die Standardreports, welche in der Titelzeile mit einem S gekennzeichnet sind
- die Anwenderspezifischen Reports, welche in der Titelzeile mit einem A gekennzeichnet sind
Für die Erklärung gehen wir hier nun z.B. von der Standard Rechnung aus.
Es wird vom Applicationserver (wildfly) das hinterlegte Rechnungsformular aufgerufen. In Abhängigkeit von Mandanten und Sprachen siehe wird der programmtechnisch hinterlegte Report rech_rechnung.jasper aufgerufen.
Der Source für dieses Jasper-File ist rech_rechnung.jrxml.
In diesem sind folgende allgemeine Subreports enthalten:
- background
- background1
- bewegungs_bild
- belegkopfdaten
- mandanten_absender
Die Pfade dafür werden aus folgenden Parametern erzeugt:
| Report |
Pfad |
| background |
$P{P_LOGO_SUBREPORT}.replaceFirst(“logo.”,“background.”) |
| background1 |
$P{P_LOGO_SUBREPORT}.replaceFirst(“logo.”,“background1.”) |
| bewegungs_bild |
$P{P_LOGO_SUBREPORT}.replaceFirst(“logo.”,“bewegungs_bild.”) |
| belegkopfdaten |
new java.io.File(com.lp.util.HelperReport.getSubreportPath($P{P_MODUL}, “belegkopfdaten”, $P{MANDANT_C_NR}, $P{REPORT_LOCALE}, $P{P_SUBDIRECTORY}) ).toURL() |
| mandanten_absender |
$P{P_LOGO_SUBREPORT}.replaceFirst(“logo.”,“mandanten_absender.”) |
Das bedeutet vor allem:
Um für Background usw. den richtigen Pfad definiert zu haben, müssen die Dateien logo.jasper, logo.jrxml und logo.png zusammenpassend im Anwenderverzeichnis sein. Damit findet der Reportgenerator dann auch die richtigen Reportvorlagen.
Besonderheit für background:
Hier sind die beiden Subreports logo und fuss mitenthalten, in denen dann die eigentlichen Logo und Fuß Informationen für das offizielle Briefpapier enthalten sind.
4 - Farbdefinitionen
Bewährte Farbdefinitionen
Bei der Erstellung von Formularen / Reports ist auch immer die Frage, wie kann man besondere Felder hervorheben. Hier ist mitzubedenken, dass diese “Farben” auch auf monochromen (SW/WS) Druckern funktionieren sollten.
Gerade für den Druck von Hintergrund Farben hat sich bewährt Pastellfarben zu verwenden.
Ich habe hier einige von mir gerne verwendeten Farbkombinationen zusammengetragen.
Farbdefinitionen für Reports für das Kieselstein ERP-System
Kieselsteinfarben
| Benennung |
[R,G,B] Farben |
| Standard |
[21,114,138] |
| hell |
[33,179,203] |
| sehr hell |
[143,207,218] |
Kieselstein Farben der Belegkopfdaten
| Benennung |
[R,G,B] Farben |
| Hintergrund |
[199,231,237] |
| Trennlinie |
[171,219,227] |
Kieselstein Logo Farben
ab Oktober 2025
| Benennung |
[R,G,B] Farben |
[CMYK] |
| Gelb/orange |
[239,137,33] |
[0,37,90,5] |
| Türkisblau |
[0,106,135] |
[93,51,39,0] |
| Mittelblau |
[131,193,211] |
[50,5,13,5] |
| Hellblau |
[212,237,249] |
[20,0,2,0] |
Standardschrift
- in den Reports: Liberation SANS
- am Bildschirm: Tahoma regular
Hintergrund Farben = Regenbogenfarben in Pastelltönen
| Benennung |
[R,G,B] Farben |
| rot |
[247,171,173] |
| orange |
[254,214,165] |
| gelb |
[250,246,183] |
| grün |
[206,229,183] |
| hellblau |
[169,222,236] |
| dunkelblau |
[165,193,230] |
| violett |
[235,200,222] |
Siehe dazu auch mit 12 Regenbogen Farben, bzw. den Report ../fertigung/fert_gesamtkalkulation.jrxml, die Style Informationen um einen dynamischen Farbverlauf darstellen zu können.
weitere gern verwendete Farben
| Benennung |
[R,G,B] Farben |
| hellgrau |
[204,204,204] (Zebra) |
| orange |
[255,161,50] (Sonntag) |
| mittleres orange |
[255,184,101] |
| helles orange |
[255,207,152] (Samstag) |
| — |
— |
| blau |
[88,193,218] |
| mittleres blau |
[142,208,228] (Feiertag) |
| helles blau |
[177,224,234] |
| sekundärfarbe |
[4,111,159] |
| — |
— |
| helles grün |
[51,255,0] |
| helles rot |
[255,153,153] (Hintergrund) |
| — |
— |
| helles gelb |
[255,255,204] (Hintergrund, passend zu Sonntags Orange) |
5 - Formelsammlung
Eine Sammlung von nützlichen Formeln für den Reportgenerator
Die Beschreibung der Helper wurde aus allgemein\muster_qr_code.jrxml entnommen.
iReport = Java 7
Kalenderwoche aus Timestamp errechnen
und das immer für die vorige Woche, als vom Stichtag = Timestamp den Wochentag abzuziehen, um auf den Sonntag davor zu kommen
com.lp.util.HelperReport.berechneKWJahr(
new java.sql.Date(
$P{P_STICHTAG}.getTime() -
$P{P_STICHTAG}.getDay()*1000*3600*24
)
)
SQL Abfragen für einen Return-Wert
$P{P_SQLEXEC}.execute( SQL Query String)
SQL Abfragen für mehrere Werte
$P{P_SQLEXEC}.executes( SQL Query String)
Beispiel:
Variable Werte 
$P{P_SQLEXEC}.executes(
"select c_nr, f_gewichtkg, f_materialgewicht from ww_artikel " +
"where i_id = (select i_id from ww_artikel where c_nr='"+$F{Artikelnummer}+"');"
)
liefert ein Object in dem im Element 0 die Artikelnummer, im Element 1 das Gewicht usw. enthalten ist.
Die direkte Verwendung in den Feldern könnte wie folgt aussehen:
((Object[])$V{Werte})[0]
((Object[])$V{Werte})[1]
((Object[])$V{Werte})[2]
Gerne auch Variablen verwenden. Dabei muss darauf geachtet werden, dass die Variablen Klasse dem tatsächlichen Wert entspricht. Z.B. String für die c_nr und Double für das Gewicht.
Beachte nur mehr is null gültig
Mit den aktuell verwendeten Postgres-Datenbankservern ist ein Vergleich auf einen NULL Wert nur mehr mit is null zulässig. Die in sehr alten Postgresserver mögliche Form von = null wird nicht mehr unterstützt.
Werte aus der Datenbank
- Bigint aus DB = Long im Jasper Report
- sum() aus der DB liefert immer BigDecimal
Werte aus dem Report anders zusammenstellen und eigenständig sortieren
Manchmal will man einen Teil eines Reports anders sortieren, verschiedene Zwischensummen darstellen und ähnliches. Hier sei als Beispiel der Report ../eingangsrechnung/er_eingangsrechnung_alle.jrxml genannt. Auf diesem sieht man am Ende des Reports eine Zusammenfassung der verschiedenen Steuersätze. Dafür wird der Inhalt, den man an den Subreport übergeben will, in einer Array-List gesammelt (siehe Variable LISTE_UST_SAETZE bzw. LISTE_UST_SAETZE_ADD). Mit dieser Arraylist wird über einen Helper ein Sub-Report aufgerufen (im Summary er_eingangsrechnung_kontierung_summary). Das besondere an dem Helper ist, dass nach dem ersten Element sortiert wird. Dafür muss dieses ein String sein. Nicht zuletzt deshalb gibt es für diesen Helper zwei Ausführungen.
- HelperReport.sortList wird diesem Helper im Sort ein Null-Wert übergeben, wird mit einer Fehlermeldung abgebrochen
- HelperReport.sortListNoNull dieser Helper akzeptiert auch null in der Sortierung
Siehe auch
Array zusammenfügen
Manchmal hat man auch die Aufgabe dass man mehrere Arrays zusammenfügen muss. Ein Beispiel dafür ist der Report ..\eingangsrechnung\er_eingangsrechnung_alle.jrxml in dem man in die Variable LISTE_UST_SAETZE auch die Werte aus den Splittbuchungen mit aufführen will.
Ein Beispiel dazu findest du im Detail 3

im Feld F_TEXT Liste UST Sätze in dem an das Array noch die Details aus der Kontierungs-Splittbuchung dazugefügt werden.
Wo finde ich welches Feld
Oft steht man vor der Herausforderung, in welcher Tabelle welches Feld zu finden ist. Hat man nun eine Ahnung wie das Feld heißen könnte, kann man die Verwaltungstabellen des PostgresQL befragen. Also:
select * from information_schema.columns where column_name like '%herst%';
liefert z.B. eine Liste aller Tabellen die Spaltennamen mit herst beinhalten.
Strings in Zahlen wandeln
com.lp.util.HelperReport.toBigDecimal (String bigDecimal, Locale stringLocale) mit und ohne Local
com.lp.util.HelperReport.toInteger(String integer)
Datum aus Date/Timestamp
$V{LosEnde}.toLocaleString().substring(6,10)+"-"+
$V{LosEnde}.toLocaleString().substring(3,5)+"-"+
$V{LosEnde}.toLocaleString().substring(0,2)
/* $V{LosEnde}.toLocaleString() liefert DD.MM.JJJJ */
ACHTUNG: Liefert das Datum in Abhängigkeit des Report-Locales. Also bei italienisch die italienische Schreibweise (8-nov-2023), welche für SQL Abfragen dann nicht verwendbar ist. Für SQL Abfragen daher z.B. (new SimpleDateFormat(“yyyy-MM-dd”, Locale.GERMAN)).format($V{Datum}) verwenden. Siehe auch.
Zahlen in String wandeln
String.format("%1$,.2f" , $V{DBIIIam})
Siehe dazu auch
Die Bedeutungen
| Zeichen |
Bedeutung |
| %1$ |
das nachfolgende betrifft das Argument 1 (man kann auch mehrere Werte hintereinander ausgeben) |
| , |
im Locale formatiert mit Tausendertrenner ACHTUNG: in AT ist der Tausendertrenner leider das Space |
| .2f |
Vorkommastellen nicht definiert und dann 2 Nachkommastellen ausgegeben als Fließzahl |
Siehe auch
Datum in String konvertieren
(new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN)).format($P{P_ANGEBOTSGUELTIGKEIT})
Locale.ENGLISH
bei den Schreibweisen auf 24 Std 12 Std achten, für Kalenderwoche auch auf die Java Definitionen (siehe Erfolgsrechnung bzw. Link oben)
Mögliche Beispiele:
(new SimpleDateFormat("yyyy-MM-dd", Locale.GERMAN)).format($V{DiesesMonat})+" 00:00:00"
(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.GERMAN)).format($F{Von})
(new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN)).format($V{V_HEUTE}) -- im in Deutsch lesbaren Format
String in Datum konvertieren
Wichtig Datum muss im Stringformat dd.MM.yyyy übergeben werden
com.lp.util.Helper.parseString2Date($F{F_REALISIERUNGSTERMIN})
Beginnzeitpunkt rechnen
Von Obigem bekommt man ein Date, welches mit .getTime() in ein Long verwandelt wird. Hier kann man nun ms (Millisekunden) als Long dazuzählen und mit new java.sql.Timestamp(long) in einen Timestamp verwandeln, mit dem man nun rechnen kann.
So will man z.B. für den jeweiligen Tag wissen, wieviele Stunden der Mitarbeiter vor 6:00 gearbeitet hat. Also:
- z.B. in die Variable Datum, welche ein Date ist:
com.lp.util.Helper.parseString2Date(
(new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN)).format($F{Zeit}) )
- und dann in die Variable Beginn
new java.sql.Timestamp($V{Datum}.getTime()+(6*3600*1000))
- somit erhält man als long
$V{Beginn}.getTime() - $F{Kommt}.getTime()
Stunden dazu oder abziehen
Siehe z.B. rech_rechnung_abrechnung_detail_zeitraum.jrxml
Variable bis
new java.sql.Timestamp (($F{t_zeit}.getTime() + (new Double ($F{n_stunden}.doubleValue()*3600*1000)).longValue()))
Wichtig: Man rechnet mit dem Long und wenn man dann wieder eine Uhrzeit braucht, die Konvertierung auf Timestamp
Tagesdifferenzen errechnen
Wenn man Tagesdifferenzen errechnen will, so hat sich folgende Herangehensweise bewährt:
(($V{V_HEUTE}.getTime() - $F{Liefertermin}.getTime()) / 3600 / 24 / 1000) -> liefert die entsprechenden Tage als Long
V_HEUTE = Calendar.getInstance(Locale.GERMAN).getTime()
Letzter des Monates
com.lp.util.HelperReport.getLetztenTagDesMonats($V{V_HEUTE}, 0)
Das ,0 ist der Monatsversatz, der dazugerechnet wird. Siehe z.B. auch fc_deltaliste_entwicklung.jrxml
Timestamp to Date
Bedeutet, dass die Zeit beim Datum, das auch ein Timeobjekt ist, auf 00:00:00 gesetzt wird.
new java.sql.Date($V{LosBeginn}.getTime())
Kalenderobjekt
Siehe: com.lp.util.HelperReport.asKalender
Dezimalstunden als hh:mm drucken
((String)(com.lp.util.HelperReport.konvertiereZeitDezimalInHHMMSS($V{V_SUMMEDAUER},2,false)))
wobei die Variable ein BigDecimal sein muss. Wenn hinten true, dann auch Sekunden
Date und Timestamp
Da es immer wieder mühsam ist (für den Report Schreibenden), wie man vom einen zum anderen kommt.
| von -> nach |
Formel |
Bemerkung |
| Date -> Timestamp |
new java.sql.Timestamp($V{V_HEUTE}.getTime()) |
Die resultierende Variable ist als Timestamp definiert |
| Timestamp -> Date |
new java.sql.Date($V{LosBeginn}.getTime()) |
Die resultierende Variable ist ein Date |
Zusatz: mit getTime() bekommt man ein long, was ein primitiver Java Typ ist. Wir brauchen in den Reports aber Objekte, darum eben das entsprechende new java.sql…..
Zahlen in String konvertieren
String.format("%05d", $F{F_ARBEITSGANG})
nur für integer
Siehe auch
BigDecimal to String
String.format("%05.4f" , $V{Rabatt}.doubleValue()\*100).replace(",",".")
Je nachdem, was man damit machen muss, es kommt der String im default Locale, also ev. noch die Dezimaltrenner usw. bearbeiten.
Time in Double konvertieren
Manchmal muss man aus der Datenbank eine Time, z.B. die Sollzeit eines Zeitmodelles, in ein Double konvertieren, um damit weiterrechnen zu können.
$V{U_Sollzeit} == null ? 0.00 :
((new Double($V{U_Sollzeit}.getTime())).doubleValue() / 1000 / 3600 ) +1.0
Gerade oder ungerade
für ein int
$V{KW_int}.intValue()\%2 == 0 ? ist eine gerade Zahl
für ein double
xxx.doubleValue()\%2 == 0 ? ist eine gerade Zahl
Fremdsprachige Installationen
Bei fremdsprachigen Installationen, z.B. Konzernsprache in Englisch, müssen bereits die default Reports in der Mandantensprache, z.B. Englisch sein.
D.h. unter z.B. report/auftrag/anwender/ müssen bereits die englischsprachigen Reports für den Auftrag sein. Sollte dann ein Kunde eine deutsche AB benötigen,
ist diese unter 001/de zu hinterlegen.
Zugriff auf die Bezeichnung der intelligenten Zwischensumme
Da die intelligente Zwischensumme hierarchiefähig ist, ist der eigentliche Feldinhalt ein String[Array]. Das bedeutet, will man nun auf den Inhalt zugreifen, so muss das Array-Element angegeben werden. So erhält man z.B. mit $F{F_ZWSTEXTE}[0] eben die Bezeichnung der ersten Zeile des Textes der intelligenten Zwischensumme.
Zugriff auf weitere Infos der Lagerbewegungen
Manchmal benötigt man auch genauere Infos aus der Lagerbewegung.
Dafür gibt es in einigen wenigen Reports das Field F_I_ID_BUCHUNG. Damit kann man sich aus der Lagerbewegungstabelle weitere Details holen.
So z.B. mit nachfolgender Abfrage in einer Variable die Menge exakt dieser Lagerbewegung.
$P{P_SQLEXEC}.execute(
"select n_menge from ww_lagerbewegung where i_id_buchung="+$F{F_I_ID_BUCHUNG}+";"
)
Werte von Gruppen aufsummieren
Manchmal hat man die Situation, dass Werte sich aus Gruppensummen ergeben, anhand dessen ergeben sich verschiedene andere Werte mit denen man dann weiterrechnen sollte.
Ein gutes Beispiel dafür ist z.B. die Zusammenfassende Meldung (ZM) aus der Ausgangsrechnung.
Hier wird die Summe je UID Nummer errechnet und auf ganze Euro gerundet. Diese Werte sollten nun für die Kontrollsumme aufsummiert werden.
Siehe dazu das Formular rech_zusammenfassendemeldung, die Variable Leistung_Gesamt_gerundet.
von ist ein Timestamp
(new SimpleDateFormat("HH:mm", Locale.GERMAN)).format($F{Von}.getTime())
jetzt als String
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date())
zwei Timestamps nur das Datum vergleichen
https://tableplus.com/blog/2018/07/postgresql-how-to-extract-date-from-timestamp.html
To extract a date (yyyy-mm-dd) from a timestamp value
For example, you want to extract from ‘2018-07-25 10:30:30’ to ‘2018-07-25’
- Extract from a timestamp column:
Use date() function:
SELECT DATE(column_name) FROM table_name;
- Extract date from a specific timestamp value:
Cast the timestamp to a date by adding ::date suffix:
SELECT ‘2018-07-25 10:30:30’::TIMESTAMP::DATE;
Or combine date() and substring() function:
SELECT DATE(SUBSTRING(‘2018-07-25 10:30:30’ FROM 1 FOR 10));
im Query mit Monaten rechnen
(t_letztewartung+(i_wartungsintervall \* '1 month'::INTERVAL))
eine weitere interessante Variante ist
(start_date + (duration || ' month')::INTERVAL) < '2010-05-12'
siehe https://stackoverflow.com/questions/5909363/calculating-a-date-in-postgres-by-adding-months
oder auch
https://www.postgresqltutorial.com/postgresql-string-functions/postgresql-to_char/
TO_CHAR(n_min, '999999.99') || ' - ' || TO_CHAR(n_max,'999999.99')
aus ...\stueckliste\stk_gesamtkalkulation_konfigurationswerte.jrxml
Von Bis Zeiten aufsummieren
select sum(EXTRACT(EPOCH FROM (t_bis - t_von))) from pers_maschinenzeitdaten where ...
Istzeit einer Arbeitsgangposition
Bei der Reportgestaltung ergibt sich immer wieder die Forderung, dass man für eine Soll-Zeit-Position die Istzeit errechnen muss.
Aufgrund der Eigenschaft des Kieselstein ERP ist dies leider keine Kleinigkeit.
Der Trick liegt hier darin, dass man das Ende errechnet. Zusätzlich ist zu berücksichtigen, dass Zeitbuchungen der Mitarbeiter auch durch Pausen unterbrochen werden können.
$P{P_SQLEXEC}.execute(
"select sum(EXTRACT(EPOCH FROM (ende - beginn)))/3600 as iststunden from "+
"("+
"select t_zeit as beginn,"+
"(select t_zeit from pers_zeitdaten as danach where danach.personal_i_id=pers_zeitdaten.personal_i_id and danach.t_zeit > pers_zeitdaten.t_zeit "+
"order by t_zeit limit 1) as ende "+
"from pers_zeitdaten where c_belegartnr = 'Los' and i_belegartid="+$F{los_i_id}+" and i_belegartpositionid = "+$F{soll_i_id}+" "+
"order by t_zeit "+
") as foo;"
)
Hier fehlt noch die Berücksichtigung der Pausen.
Mehrere Felder in einen String
Manchmal benötigt man die verschiedenen Spaltenwerte einer Tabelle in einem String. So will man z.B. die verschiedenen möglichen Sperren in einer einzigen Variablen haben. Anstatt der Concat Funktion kann hier im PostgresQL das string_agg verwendet werden.
$P{P_SQLEXEC}.execute(
"select string_agg(ww_artikelsperren.c_grund, ', ') from ww_artikelsperren "+
"inner join ww_artikel ON ww_artikel.i_id = ww_artikelsperren.artikel_i_id "+
"and ww_artikel.c_nr='"+$F{F_IDENT}+"' "+
"and ww_artikel.mandant_c_nr='"+$P{P_MANDANT_OBJ}.getMandantCNr()+"';"
bzw. die Mengenstaffeln der Angebotsstückliste in einen String
select string_agg(cast (n_menge as varchar(255)), '| ') from as_agstklmengenstaffel
where agstkl_i_id=(select i_id from as_agstkl where c_nr='25/0000007' and mandant_c_nr='001')
Wenn du nur einen Wert haben willst, musst du distinct verwenden.
select string_agg(distinct personal_i_id,',') from pers_zeitdaten where c_belegartnr = 'Los' and i_belegartid=336420 and i_belegartpositionid = 192495
einen Subreport mit Tagen
com.lp.util.HelperReport.getSubreportKalendertage(
$P{P_VON},
$P{P_BIS},
$P{P_MANDANT_OBJ}.getTheClientDto())
Liefert einen Subreport mit Datum, Feiertag und Sollzeit (in Stunden) des Firmenzeitmodells
Beispiel siehe: proj_projekt_journal_offene_gantt_zeitachse.jrxml
Query, um eine Summe der jüngsten 10 Mengen zu erhalten
Der Trick liegt hier darin, dass man sich mit einem Select (dem inneren) die Werte holt, den man dann mit einem zweiten Select (dem äußeren) aufsummiert. Man könnte auch sagen, dass man damit einen zweistufigen Select macht. Also z.B. für die Aufträge:
select sum(n_menge) from (
select n_menge from auft_auftragposition
inner join auft_auftrag on auft_auftrag.i_id=auft_auftragposition.auftrag_i_id
where artikel_i_id in (select i_id from ww_artikel where c_nr like 'ABC%')
order by auft_auftrag.t_belegdatum desc
limit 10) as foo;
Für diverse SQL Querys
Siehe https://www.postgresql.org/docs/current/functions-formatting.html alleine schon das SQL kann jede Menge
X_TEXT direkt aus der Datenbank holen
Nachdem im Jasper üblicherweise mit Strings (und nicht mit String-Objekten) gearbeitet wird, aber in der Datenbank auch lange / große X_Texte abgelegt sind, müssen diese mittels CAST aus der Datenbank geholt werden. Z.B. für die Bemerkung aus einer Kostenstelle.
$P{P_SQLEXEC}.execute(
"select CAST(X_BEMERKUNG as VARCHAR(3000)) from LP_KOSTENSTELLE where C_NR = '10';"
)
Beliebiges Textmodul am Report andrucken
Dafür steht der Helper
com.lp.util.HelperReport.getMediastandardTextHtml("Name des Textmoduls", "001", $P{REPORT_LOCALE})
zur Verfügung.
Abfrage mit locale
Um das locale in den Querys verwenden zu können:
{REPORT_LOCALE}.toString().replace("_","")
z.B. Übersetzung der Bezeichnung der Mengeneinheiten
$P{P_SQLEXEC}.execute(
"select c_bez from lp_einheitspr where einheit_c_nr='"+$P{P_EINHEIT}+"' and locale_c_nr='"+$P{REPORT_LOCALE}.toString().replace("_","")+"';"
)
Datenreihen mit Datum generieren
Für PostgresQL (MS-SQL ist anderes und wird, da nicht OpenSource, von Kieselstein ERP nicht verwendet).
Tage zwischen Datumsbereich:
SELECT day::date
FROM generate_series(timestamp '2023-03-01', timestamp '2023-03-31', interval '1 day') day;
Ergebnis:
“2023-03-01”
“2023-03-02”
“2023-03-03”
…
“2023-03-28”
“2023-03-29”
“2023-03-30”
“2023-03-31”
Siehe z.B. …\personal\pers_maschinenproduktivitaet.jrxml
Siehe dazu auch, z.B. proj_projekt_journal_alle_detailliert_zugehoerige_belege_zeitachse.jrxml
com.lp.util.HelperReport.getSubreportKalendertage(
$V{VonBereich},
$V{BisBereich},
$P{P_MANDANT_OBJ}.getTheClientDto())
Stunden für Zeitbereich:
SELECT day::timestamp
FROM generate_series(timestamp '2023-03-01 12:00', timestamp '2023-03-02 18:00', interval '1 hour') day;
“2023-03-01 18:00:00”
“2023-03-01 19:00:00”
…
“2023-03-02 09:00:00”
“2023-03-02 10:00:00”
1. Tag im Monat:
SELECT date '2023-03-01' + interval '1' month \* s.a AS date
FROM generate_series(0,3,1) AS s(a);
Ergebnis:
“2023-03-01 00:00:00”
“2023-04-01 00:00:00”
“2023-05-01 00:00:00”
Raufzählen
SELECT * FROM generate_series(1,3);
Ergebnis:
1
2
3 als integer
Verfügbarkeiten laut Zeitmodell berechnen
Manchmal hat man das Problem, dass man die verfügbaren Stunden aus Zeitmodellen errechnen muss. Dies geht z.B. mit:
select sum(
(select l_verfuegbarkeit from pers_maschinenzmtagesart where tagesart_i_id=coalesce((select tagesart_i_id from pers_betriebskalender where mandant_c_nr='001' and t_datum = tage.day), extract(isodow from tage.day)+10)
and maschinenzm_i_id=(
select maschinenzm_i_id from pers_maschinemaschinenzm
where maschine_i_id=(select i_id from pers_maschine where c_identifikationsnr = '67' and mandant_c_nr='001')
and t_gueltigab <= tage.day
order by t_gueltigab desc limit 1
)
)
) / 1000 / 3600
from (
SELECT day::date
FROM generate_series(timestamp '2024-08-12', timestamp '2024-08-18', interval '1 day') day) as tage;
Siehe z.B. pers_maschinenproduktivitaet.jrxml
Konvertieren auf BigDecimal
Das Einfachste ist BigDecimal.valueOf(value) wobei value z.B. ein Double sein kann.
gerundet auf Nachkommastellen
BigDecimal.valueOf(value).setScale(2, BigDecimal.ROUND_HALF_UP)
Double runden
Manchmal muss man auch Double auf Nachkommastellen runden. Das geht eigentlich mit Math.round, wobei dieses einfach die Nachkommastellen wegrundet. D.h. der Wert ist vorher entsprechend umzurechnen. Z.B.:
Math.round($V{EchtesIst}.doubleValue() * 100)
Usecase ID wird nicht angedruckt
Macht man einen Druck der Auswahlliste (FLR Liste) muss rechts oben die UseCaseID angedruckt werden.
Diese wird nicht angedruckt, wenn im ../report/allgemein auch der flrdruck.jasper vorhanden ist.
Zusätzlich darf es den flrdruck.jrxml ausschließlich ein Mal im allgemein des Wildfly (LW:/kieselstein/dist/wildfly-26.1.2.Final/kieselstein/reports/allgemein) geben und in keinem anderen Verzeichnis.
Das führende Herr / Frau ersetzen
Manchmal will / muss man die förmlichen Anreden entfernen. Also aus Herr Mustermann nur Mustermann haben. Das macht man üblicherweise mit replace. Da es aber auch vorkommen kann, dass der Name des Ansprechpartners Herr enthält muss man das über .replaceAll("^Herr","") machen. D.h. es wird NUR das erste Herr durch den nachfolgenden (Leer-)String ersetzt. Ganz genau muss man dann auch noch auf den beginnenden String prüfen. Für die Ansprechpartner gehen wir hier davon aus, dass es immer eine entsprechende Anrede gibt.
Da man damit auch oft noch das Frau entsprechend herausfiltern will, heißt das dann:
.replaceAll("^Herr ","").trim().replaceAll("^Frau ","").trim()
Subreport overflowed on a band that does not support overflow
Wenn das nicht der Title, die Page Header / Footer betrifft, dann ist der Report, der den Subreport aufruft auf Horizontal gestellt. Er muss auf Vertikal gestellt sein. Passiert gerne, wenn man Reports umkopiert, z.B. mit mehreren Columns und dann gehts am Anfang und auf einmal nicht mehr (weil dann der Overflow kommt). D.h. wenn die Columns auf 1 (zurück-) gesetzt werden, dann auf die Richtung achten.
Zu Datum Tage dazuzuzählen
com.lp.util.Helper.addiereTageZuDatum(date Datum, int Tage)
Beispiel
com.lp.util.Helper.addiereTageZuDatum(com.lp.util.Helper.parseString2Date($P{Liefertermin}) , -2)
im Query zum Datum / Timestamp Tage dazuzählen
select (cast(fert_los.t_produktionsbeginn as date) + i_maschinenversatztage),
fert_los.t_produktionsbeginn, i_arbeitsgangnummer, i_unterarbeitsgang, i_maschinenversatztage, * from fert_lossollarbeitsplan
inner join fert_los on fert_los.i_id=fert_lossollarbeitsplan.los_i_id
where fert_los.c_nr='24/01622-993' and mandant_c_nr='001'
order by i_arbeitsgangnummer, i_unterarbeitsgang;
com.lp.util.HelperReport.getWochentag($P{REPORT_LOCALE}, <Timestamp>$F{Datum})
com.lp.util.HelperReport.getWochentag($P{REPORT_LOCALE}, new java.sql.Timestamp($F{BeginnDatum}.getTime()) ... wenn das ein Date ist
Daten anders sortieren
Üblicherweise werden die Daten des Reports anhand der gewählten Sortierung übergeben. Manchmal will man aber diese, z.B. in einer Reportvariante, anders sortieren. Um dies zu bewerkstelligen, kann direkt im jrxml das Sortierkriterium angegeben werden.
Es muss dies zwischen field name und variable eingefügt werden.
D.h. hier muss:
eingetragen werden. Damit werden die Daten vom Jasper nach diesem Feld sortiert. Beispiel siehe z.B.: ..\report\bestellung\bes_sammelmahnung.jrxml

Wichtig: Dies geht nur für original erhaltene Fields, leider nicht für Variablen.
Sortierung des Materials des Fertigungsbegleitscheines
So wie oben beschrieben, einfach nur zwischen den Zeilen field_name und variable die Sortfields einfügen.
\<sortField name="F_ARBEITSGANG"/><br>
\<sortField name="F_UNTERARBEITSGANG"/><br>
\<sortField name="F_MATERIAL_LAGERORT"/><br>
Dies ist leider nur im XML ersichtlich.
EMail Nachricht aus dem Report erzeugen
Mit folgendem Helper kann aus dem Report heraus eine Nachricht versandt werden. Z.B. wenn ein Wareneingang gebucht wurde und das Wareneingangsetikett gedruckt wird.
com.lp.util.HelperReport.emailSenden(
"wareneingang@kieselstein-erp.org",
"WE zu BS: "+$F{F_BESTELLNUMMER},
"Es wurde ein Wareneingang von "+$F{F_IDENT}+" "+$F{F_BEZ}+" gebucht",
$P{P_MANDANT_OBJ}.getTheClientDto())
- Empfänger
- Betrifft
- Nachricht
- Clientobjekt, um es versenden zu können.
Links hinterlegen
Manchmal ist es praktisch, wenn hinter einem Text, einem Bild ein Hyperlink hinterlegt wird. Damit braucht der Anwender nur auf den Link zu klicken und schon hat er die benötigte Information. Dafür muss dies ein Text Field sein. Dann mit der rechten Maustaste auf das Field und Hyperlink auswählen.
Dies nun auf

Hyperlink type Reference stellen und in den Reference Reiter den gewünschten Webaufruf als String (mit umschließenden Hochkomma “) eintragen.
Beispiel: artikel/ww_inventurstand.jrxml im Lastpagefooter.
Links als GoTo hinterlegen
Manchmal ist es auch praktisch aus dem Formular heraus einen Goto z.B. auf den Artikel oder einen Beleg zu machen. Dafür wird eine besondere Form des Hyperlinks verwendet. Idealerweise verwendest du die Artikelstatistik als Vorlage um dies in anderen Belegen einzubauen.

Der besondere Trick liegt im Reiter Link parameters mit den Parameter namen
- WhereToGoTo
- Key
In whereToGoTo kommt die Helperfunktion für den Aufruf des jeweiligen Modules rein
in Key kommt die Belegnummer oder die I_ID des anzuzeigenden Datensatzes rein.
Im Reiter Tooltip kannst du einen entsprechenden String hinterlegen. Leider werden keine Zeilenumbrüche unterstützt.
Aktuell gibt es folgende Helper:
| Helper |
Bedeutung |
| com.lp.util.GotoHelper.goto_RECHNUNG_AUSWAHL() |
Springe auf die Rechnung |
| com.lp.util.GotoHelper.goto_LIEFERSCHEIN_AUSWAHL() |
Springe auf den Lieferschein |
| com.lp.util.GotoHelper.goto_GUTSCHRIFT_AUSWAHL() |
Springe auf die Gutschrift |
| com.lp.util.GotoHelper.goto_BESTELLUNG_AUSWAHL() |
Springe auf die Bestellung |
| com.lp.util.GotoHelper.goto_FERTIGUNG_AUSWAHL() |
Springe auf das Los |
| com.lp.util.GotoHelper.goto_AUFTRAG_AUSWAHL() |
Springe auf den Auftrag |
| com.lp.util.GotoHelper.goto_ANFRAGE_AUSWAHL() |
Springe auf die Anfrage |
| com.lp.util.GotoHelper.goto_ARTIKEL_AUSWAHL() |
Springe auf den Artikel |
| com.lp.util.GotoHelper.goto_ANGEBOT_AUSWAHL() |
Springe auf das Angebot |
| com.lp.util.GotoHelper.goto_ANGEBOTSTKL_AUSWAHL() |
Springe auf die Angebotsstückliste |
| com.lp.util.GotoHelper.goto_STUECKLISTE_AUSWAHL() |
Springe auf die Stückliste |
| com.lp.util.GotoHelper.goto_PROJEKT_AUSWAHL() |
Springe auf das Projekt |
| com.lp.util.GotoHelper.goto_ZEITERFASSUNG_ZEITDATEN() |
hier muss das ZEITDATEN_I_ID übergeben werden, womit auf die Zeitbuchung gesprungen wird |
| com.lp.util.GotoHelper.goto_ZWISCHENABLAGE() |
Kopiere den Inhalt in die Betriebssystem Zwischenablage. Siehe auch. |
| com.lp.util.GotoHelper.goto_REKLAMATION_AUSWAHL() |
Springe auf die Reklamation |
| com.lp.util.GotoHelper.goto_PROFORMARECHNUNG_AUSWAHL() |
Springe auf die Proformarechnung |
Beachte: Ein goto innerhalb des Moduls, wird unterstützt, führt aber immer dazu, dass der soeben angezeigte Report verlassen wird.
Weitere Helper siehe: …\kieselstein\kieselstein-ejb\src\main\java\com\lp\util\GotoHelper.java ca. ab Zeile 70.
Währung aus dem Mandantenobjekt holen
<string> $P{P_MANDANT_OBJ}.getMandantDto().getWaehrungCNr()
Ausdruckende Person aus dem Mandantenobjekt holen
<int> $P{P_MANDANT_OBJ}.getTheClientDto().getIDPersonal()
Also die Frage, wer druckt diesen Report aus.
Styles hinterlegen
Ein gutes Beispiel für Farbinformationen ist der Report
...\personal\pers_mitarbeiteruebersicht.jrxml.
Etwas einfachers, üblicheres ist z.B.
...\reports\fertigung\fert_gesamtkalkulation.jrxml
Zusätzlich: Wenn du nachträglich Fields von anderen Reports einkopierst, greift die Stylefarbe meistens nicht. Damit diese greift musst du die Farbinformation manuell entfernen. Also:

das forecolor und das backcolor über den Xml Editor manuell herauslöschen. Dann greifen die Farben.
weitere Helper
Du findest eine Aufstellung aller verfügbaren Report-Helper im Report
…/allgemein/muster_qr_code.jrxml
Hier gibt es den Parameter HelperReport
. Fügst du diesen in ein Textfield ein, so siehst du alle verfügbaren Helper.
Liste der Helper
Hinweis: Können jederzeit programmtechnisch erweitert werden. siehe dazu Source.
Der führende String ist:
com.lp.util.HelperReport.
toBigInteger( String, int ) java.math.BigInteger
toBigInteger( String ) java.math.BigInteger
toBigDecimal( String, java.util.Locale ) java.math.BigDecimal
toBigDecimal( String ) java.math.BigDecimal
getDauerEinerTaetigkeitEinesTages( String, String, java.util.Date, com.lp.server.system.service.TheClientDto ) java.math.BigDecimal
getSubreportPDFAusArtikelkommentar( String, String, String, java.util.Locale, int ) com.lp.util.LPDatenSubreport
getSubreportPDFAusArtikelkommentar( String, String, String, java.util.Locale, boolean, int ) com.lp.util.LPDatenSubreport
getMwstSummeAusListeMwstsaetze( String, java.util.Locale ) java.math.BigDecimal
getVerfuegbarkeitEinerMaschineInStunden( String, int, int, com.lp.server.system.service.TheClientDto ) java.math.BigDecimal
berechneOffenenWertEinerBestellung( String, com.lp.server.system.service.TheClientDto ) java.math.BigDecimal
berechneOffenenWertEinesAuftrags( String, com.lp.server.system.service.TheClientDto ) java.math.BigDecimal
konvertiereZeitDezimalInHHMMSS( java.math.BigDecimal, int, boolean ) String
getSubreportArtikelErsatztypen( String, com.lp.server.system.service.TheClientDto ) com.lp.util.LPDatenSubreport
getSubreportAusStringMitKommaGetrennt( String ) com.lp.util.LPDatenSubreport
getSubreportEnthaltenesLosIstMaterial( String, String, com.lp.server.system.service.TheClientDto ) com.lp.util.LPDatenSubreport
getWochentag( java.util.Locale, java.sql.Timestamp ) String
time2Double( java.sql.Time ) Double
getLief1Preis( String, java.math.BigDecimal, String, com.lp.server.system.service.TheClientDto ) java.math.BigDecimal
sortList( java.util.List ) java.util.List
double2Time( Number ) java.sql.Time
emailSenden( String, String, String, com.lp.server.system.service.TheClientDto ) boolean
haengeArrayAn( Object[], Object[] ) Object[]
getSSCC( Long, String ) String
joinStrings( String[], String ) String
zinsesZins( java.math.BigDecimal, java.math.BigDecimal, int ) java.math.BigDecimal
toInteger( String ) Integer
bildDrehen( java.awt.image.BufferedImage, int ) java.awt.image.BufferedImage
getArtikeltechnikeigenschaft( String, String, com.lp.server.system.service.TheClientDto ) String
getSubreportAllergene( String, com.lp.server.system.service.TheClientDto ) com.lp.util.LPDatenSubreport
ersetzeUmlaute( String ) String
ermittleTageEinesZeitraumes( java.util.Date, java.util.Date ) int
pruefeObCode128Konform( String ) boolean
getArtikelkommentarBild( String, String, String, java.util.Locale ) java.awt.image.BufferedImage
getSubreportAusPDFFile( String, int ) com.lp.util.LPDatenSubreport
getMonatVonJahrUndWoche( Integer, Integer, java.util.Locale ) String
ganzzahligerBetragInWorten( Integer ) String
getCalendarWeekOfDate( java.util.Date ) Integer
getCalendarWeekOfDate( String, java.util.Locale ) Integer
ersetzeUmlauteUndSchneideAb( String, int ) String
fuehreSQLQueryAus( String ) Object
getSubreportKalendertage( java.util.Date, java.util.Date, com.lp.server.system.service.TheClientDto ) com.lp.util.LPDatenSubreport
getCalendarOfTimestamp( java.sql.Timestamp, java.util.Locale ) Integer
updateLieferantBeurteilung( Integer, Integer, java.util.Date, String, com.lp.server.system.service.TheClientDto ) Integer
getArtikeleigenschaft( String, String, com.lp.server.system.service.TheClientDto ) String
wandleUmNachCode39( String ) String
wandleUmNachCode128( String ) String
pruefeObCode39Konform( String ) boolean
pruefeEndsumme( java.math.BigDecimal, java.math.BigDecimal, Double, String, java.util.Locale ) Boolean
pruefeEndsumme( java.math.BigDecimal, java.math.BigDecimal, Double ) Boolean
rundeKaufmaennisch( java.math.BigDecimal, int ) java.math.BigDecimal
getVDA4092Barcode( String ) String
berechneKWJahr( java.util.Date ) String
getLiquiditaetsKontostand( Integer, com.lp.server.system.service.TheClientDto ) java.math.BigDecimal
sortListNoNull( java.util.List ) java.util.List
getVDA4092Checksum( String ) Character
getMediastandardTextHtml( String, String, java.util.Locale ) String
getSummeIstZeitEinesBeleges( String, String, com.lp.server.system.service.TheClientDto ) Double
berechneUrlaubsAnspruch( String, java.util.Date, com.lp.server.system.service.TheClientDto ) com.lp.server.personal.service.UrlaubsabrechnungDto
sortListNoNullSprung( java.util.List, int, int ) java.util.List
entferneStyleInformation( String ) String
bildUm90GradDrehenWennNoetig( java.awt.image.BufferedImage ) java.awt.image.BufferedImage
seriennummerErzeugen( String, int ) String
berechneModulo10( String ) int
berechneModulo10Str( String ) String
addiereTageZuDatum( java.util.Date, int ) java.sql.Date
getLetztenTagDesMonats( java.util.Date, int ) java.util.Date
laenderartZweierLaender( String, String, String, java.sql.Timestamp ) String
getSubreportGeraeteseriennummernEinerLagerbewegung( String, Integer, String, com.lp.server.system.service.TheClientDto ) com.lp.util.LPDatenSubreport
Weitere Helper findest du unter ..\kieselstein\kieselstein-ejb\src\main\java\com\lp\util\Helper.java
Report Root
In den Reports steht mit dem Parameter REPORT_ROOT_DIRECTORY der Pfad auf das default Report Root Directory zur Verfügung.
Da alle deine Anwender-Spezifischen-Anpassungen im LW:\kieselstein\data\reports\ liegen müssen, musst du dir in der Regel den Pfad auf das Anwenderspezifische Reportverzeichnis errechnen. Z.B. mit:
$P{REPORT_ROOT_DIRECTORY}.substring(0,$P{REPORT_ROOT_DIRECTORY}.indexOf( "dist" ))+"/data/reports/allgemein"
Anmerkung:
Das P_LOGO_IMAGE ist nur dann dafür geeignet, wenn du auch tatsächlich ein Logo unter LW:\kieselstein\data\reports\allgemein\ abgelegt hast.
$P{REPORT_ROOT_DIRECTORY}.substring(0,$P{REPORT_ROOT_DIRECTORY}.indexOf( "dist" ))+"/data/reports/allgemein"
Datei vorhanden
Aus obigem ergibt sich auch immer wieder, dass man wissen muss, ob es z.B. das gewünschte PDF tatsächlich vorhanden ist.
Dafür stellt uns Java eine Funktionalität zur Verfügung.
D.h. du definierst dir z.B. die Variable filePathString als Boolean und mit Reset Type None
new java.io.File($V{filePathString}).exists()
Damit kannst du dann z.B. beim Drucken des PDF Files vorher darauf prüfen und gegebenenfalls ein, File ist nicht vorhanden andrucken.
Beliebiges PDF-File andrucken
Manchmal ergibt sich die Forderung, dass trotz allem in einem Report der Inhalt einer PDF Datei angedruckt werden muss. Verwende dafür:
com.lp.util.HelperReport.getSubreportAusPDFFile( String <Datei>, int <Auflösung in dpi> )
Hinweis:
Bitte prüfe immer zuerst, ob das spontant Gedachte: Das muss ich immer mitdrucken, wirklich stimmt. Wir haben schon oft erlebt, dass dies nur unter bestimmten Konstellationen zutreffen ist. Nutze daher die dafür vorgesehenen Funktionen wie z.B.:
| Modul |
Beschreibung |
| Kunden |
Kommentar |
| Lieferanten |
Kommentar |
| Artikel |
Kommentar |
| System, Mandant |
AGB |
Unterscheide auch zwischen Textbausteinen und echten PDF Dateien. PDF Dateien sind als ganzseitige Informationen gedacht. D.h. der Vorteil von Textbausteinen ist, dass sich diese auch zwischen verschiedenen anderen Texten / Bildern einfügen lassen. PDF kommen immer als eigene Seite(n) / Anhang.
Achte bei den Ausdrucken der PDFs immer darauf, dass das PDF in dein Formular passt.
Insbesondere wenn dies in den Page-Header / Footer, Title reinpassen sollte und du größere Daten erhältst, kann es sein, dass der Application Server (Wildfly) mit der Berechnung der Darstellung nicht mehr fertig wird und du deinen Kieselstein ERP Server neu starten musst.
Warning
Prüfe diese Reports daher mit möglichst echten Daten immer in einer Testumgebung.
Siehe dazu auch: LW:\kieselstein\dist\wildfly-26.1.2.Final\kieselstein\reports\fertigung\muster\fert_produktionsinformation.jrxml
Bild aus Kundenkommentar andrucken
Es ergibt sich immer wieder die Aufgabe, dass z.B. beim Los ein Kundenspezifisches Logo angedruckt werden sollte. Selbstverständlich hat jeder Kunde sein Logo. Idealerweise kann man die Kunden davon überzeugen, dass wenigstens für alle die Größe der Etikette gleich ist.
Daher nachfolgend ein Beispiel wie man das im Los-Ablieferetikette einrichten kann:
- Ermitteln der Kunden_i_id anhand der Losnummer
Hier ist die Herausforderung, dass im Los manchmal nur der Kunde, manchmal nur der Auftrag und manschmal auch die Auftragsposition gegeben ist, wodurch dann, optisch, auch der Kunde definiert ist. Daher muss man alle drei möglichen Definitionen berücksichtigen.
Darum wird in der Variablen Kunden_I_ID, die ein Integer ist folgendes definiert:
$P{P_SQLEXEC}.execute(
"select coalesce(fert_los.kunde_i_id, "+
" (select kunde_i_id_auftragsadresse from auft_auftrag where auft_auftrag.i_id=fert_los.auftrag_i_id), "+
" (select kunde_i_id_auftragsadresse from auft_auftrag where auft_auftrag.i_id = (select auftrag_i_id from auft_auftragposition where i_id =("+
" select fert_los.auftragposition_i_id from fert_los where i_id=fert_los.i_id)"+
" )"+
" )"+
") from fert_los where c_nr='"+$P{P_LOSNUMMER}+"' and mandant_c_nr='"+$P{P_MANDANT_OBJ}.getMandantCNr()+"';"
)
- Ermitteln der partner_i_id aus dem Kunden
In der Variablen Partner_I_ID, die ebenflas ein Integer ist, wird definiert:
$P{P_SQLEXEC}.execute(
"select partner_i_id from part_kunde where i_id="+$V{Kunden_I_ID}+";"
)
- Holen des Bild-Objektes
Z.B. als Variable Logo_Kunde, welche ein Object ist.

Hier wird davon ausgegangen, dass die verwendete Kommentarart Kundenlogo ist. Gegebenenfalls bitte entsprechend anpassen.
$P{P_SQLEXEC}.execute(
"select o_media from part_partnerkommentar "+
"inner join part_partnerkommentarart ON part_partnerkommentarart.i_id = part_partnerkommentar.partnerkommentarart_i_id "+
"where partner_i_id="+$V{Partner_I_ID}+" "+
"and part_partnerkommentarart.c_bez='Kundenlogo';"
)
- Drucken des Bildes
Siehe z.B. ww_artikelstammblatt, das Bild selbst und unter Image Expression wird die Variable Logo_Kunde gedruckt.
Gegebenenfalls mit der Bedingung, wenn kein Kundenlogo angegeben ist, wird ein eigenes Logo gedruckt:
$V{Logo_Kunde} == null ?
new java.io.File($P{REPORT_DIRECTORY}+"/../allgemein/Eti_Logo.png").toURL() :
$V{Logo_Kunde}
Inline IF
Im Report-Generator steht auch das sogenannte Inline IF-Statement zur Verfügung.
Das bedeutet wenn Bedingung = wahr dann mache das Eine und sonst das Andere.
Geschrieben wird das
Bedingung ? das Eine : das Andere
Wichtig: Beachte hier die Klammern.
So liefert z.B.
$V{Artikel_Referenznr} +
$V{Artikel_Revision}==null ? "" : "-"+$V{Artikel_Revision}
immer einen Leerstring, da die Abfrage ja lautet:
$V{Artikel_Referenznr} + $V{Artikel_Revision}==null
Vermutlich wolltest du aber nur auf $V{Artikel_Revision}==null prüfen und dann das Trennzeichen einfügen.
Daher muss dieser Ausdruck in Klammern gesetzt werden.
$V{Artikel_Referenznr} +
($V{Artikel_Revision}==null ? "" : "-"+$V{Artikel_Revision})
Womit immer die Referenznummer übergeben wird und je nach Inhalt der Revision kommt ein Leersting oder das Ternnzeichen(-) und danach die Revision.
Warum ist das so?
Es wird zuerst die (matehmatische) Operation ausgeführt und dann das Ergebnis geprüft. Durch die Klammernsetzung wird das wie von dir gedacht gesteuert.
Man könnte auch sagen, bitte hilf dem Compiler das so wie von dir gewünscht umzusetzen.
Bedingung, If, Else
Manchmal hat man die Aufgabe innerhalb des Querys Bedingungen zu errechnen. Dafür kann man im SQL-Query auch Case Konstrukte verwenden. So liefert nachfolgendes Beispiel je Chargennummer die lagernde Menge.
select Sum(case when b_abgang = 1 then n_menge * -1 else n_menge end) as Verbrauch, c_seriennrchargennr
from ww_lagerbewegung where artikel_i_id=(select i_id from ww_artikel where c_nr='11031')
and ww_lagerbewegung.b_vollstaendigverbraucht = 0
and b_historie = 0
and n_menge != 0
-- and b_abgang=0
group by c_seriennrchargennr
order by c_seriennrchargennr;
Weiteres SQL KnowHow
siehe auch
6 - Anwender Reports
Nutzen von Anwender Reports
Anwender Reports müssen in dem ${KIESELSTEIN_DATA}/reports Ordner abgelegt werden.
Der reports Ordner muss immer reports genannt sein.
Namenskonvention
{KIESELSTEIN_DATA} … bezeichnet jenes Verzeichnis, welches in deiner Kieselstein ERP Installation mit der Umgebungsvariablen / Environment definiert ist. In der Regel ist dies für Windows LW:\kieselstein_data\ für Linux /opt/kieselstein/data
{KIESELSTEIN_DIST} … bezeichnet das Verzeichnis, welches in der Environment Variablen hinterlegt ist. In der Regel ist dies für Windows LW:\kieselstein_dist\ für Linux /opt/kieselstein/dist
Finden des zu verwendenden Reports
Je nachdem wo du deine Reports hinterlegst, wird der entsprechende Report verwendet. Die Logik dafür ist folgende:
Pfade mit einer Kostenstelle
Falls eine Kostenstelle vorhanden ist, werden zuerst folgende Pfade durchsucht.
- {KIESELSTEIN_DATA}/reports/{modul}/{kostenstelle}/{mandant}/{locale}
- {KIESELSTEIN_DATA}/reports/{modul}/{kostenstelle}/{mandant}
- {KIESELSTEIN_DATA}/reports/{modul}/{kostenstelle}
Standard Pfade
Ansonsten werden folgende Pfade nach einem Report durchsucht.
- {KIESELSTEIN_DATA}/reports/{modul}/{mandant}/{locale_country}
- {KIESELSTEIN_DATA}/reports/{modul}/{mandant}/{locale}
- {KIESELSTEIN_DATA}/reports/{modul}/{mandant}
- {KIESELSTEIN_DATA}/reports/{modul}
- {KIESELSTEIN_DIST}/wildfly-X.X.X.Final/kieselstein/reports/{modul}/{locale_country}
- {KIESELSTEIN_DIST}/wildfly-X.X.X.Final/kieselstein/reports/{modul}/{locale}
- {KIESELSTEIN_DIST}/wildfly-X.X.X.Final/kieselstein/reports/{modul}
Hinweis:
Das impliziert auch, dass die Subdirectorys der Kostenstellen sich nicht mit den Mandantennummern überschneiden dürfen.
D.h. die Reports, welche sich unter {KIESELSTEIN_DIST} befinden, werden bei jedem Update überschrieben. Die Pflege der Anwender-Reports unter Data liegt in deiner Verantwortung.
Anzeige welcher Report verwendet wird
Um den richtigen Report bearbeiten zu können, muss man auch wissen, welcher Report für den Druck den tatsächlich verwendet wird. Daher wird im Titel des Reports und in den üblichen Listen-Auswertungen der verwendete Pfad angezeigt.


Eine wichtige Information ist der führende Buchstabe vor dem Reportpfad. Hier bedeutet S, dass dies ein Standard-Report ist, und ein A steht für den Anwender-Report.
D.h. die Standard-Reports findest du unter LW:/kieselstein/dist/wildfly-26.1.2.Final/kieselstein/reports/… und die Anwenderreports unter LW:/kieselstein/data/reports/…
Migration der Reports
Alter Pfad {KIESELSTEIN_DIST}/wildfly-X.X.X.Final/kieselstein/reports/{modul}/anwender/{mandant}/{sprache}
Neuer Pfad KIESELSTEIN_DATA/reports/{modul}/{mandant}/{sprache}
Auf Linux kann man find . -name "anwender" -type d verwenden, um die Pfade aller Anwenderreport Ordner zu finden.
Beispiele:
-
{KIESELSTEIN_DIST}/wildfly-26.1.2.Final/kieselstein/reports/allgemein/anwender/001/en
-
{KIESELSTEIN_DATA}/reports/allgemein/anwender/001/en
-
{KIESELSTEIN_DIST}/wildfly-26.1.2.Final/kieselstein/reports/rechnung/anwender/001
-
{KIESELSTEIN_DATA}/reports/rechnung/001
-
{KIESELSTEIN_DIST}/wildfly-26.1.2.Final/kieselstein/reports/finanz/anwender
-
{KIESELSTEIN_DATA}/reports/finanz
WICHTIG
In einigen alten Reports sind teilweise auch direkte Zuweisungen wie z.B. für Logos oder ähnlichem enthalten. Diese Reports müssen überarbeitet werden.
Sicherung der Reports
WICHTIG
Denke daran, dass nun nur mehr die Reports von LW:/kieselstein/data/reports gesichert werden müssen.
Übertragung der Report-Einstellungen
Nachdem nun die Strukturen der Reports geändert wurden, können mit nachfolgendem Script diese Werte übernommen werden.
update lp_standarddrucker ls
set c_reportname = case when ls.c_reportname like '%/anwender/%.jasper' then '../../../../data/reports' || substr(replace(ls.c_reportname, '/anwender', '/' || substr(ls.c_reportname, 0, POSITION('/' IN ls.c_reportname))), POSITION('/' IN ls.c_reportname))
when ls.c_reportname like '%\anwender\\%.jasper' then '..\..\..\..\data\reports' || substr(replace(ls.c_reportname, '\anwender', '\' || substr(ls.c_reportname, 0, POSITION('\' IN ls.c_reportname))), POSITION('\' IN ls.c_reportname))
end
where (c_reportname like '%/anwender/%.jasper' or c_reportname like '%\anwender\\%.jasper')
and not exists (
select 7 from lp_standarddrucker ls2
where ls2.c_pc = ls.c_pc
and ls2.c_drucker = ls.c_drucker
and ls2.mandant_c_nr = ls.mandant_c_nr
and ls2.c_reportname = case when ls.c_reportname like '%/anwender/%.jasper' then '../../../../data/reports' || substr(replace(ls.c_reportname, '/anwender', '/' || substr(ls.c_reportname, 0, POSITION('/' IN ls.c_reportname))), POSITION('/' IN ls.c_reportname))
when ls.c_reportname like '%\anwender\\%.jasper' then '..\..\..\..\data\reports' || substr(replace(ls.c_reportname, '\anwender', '\' || substr(ls.c_reportname, 0, POSITION('\' IN ls.c_reportname))), POSITION('\' IN ls.c_reportname))
end
and (ls2.reportvariante_i_id = ls.reportvariante_i_id or (ls2.reportvariante_i_id is null and ls.reportvariante_i_id is null))
);
7 - Belegkopfdaten
Nutzen von Belegkopfdaten
Üblicherweise hat jeder offizielle Beleg, z.B. Rechnung, einen Informationsblock auf dem die Dinge wie Rechnungsnummer, Rechnungsdatum, Ansprechpartner usw. angegeben werden.
Diese Daten sind meist dynamisch, sollten aber trotzdem an der üblicherweise erwarteten Stelle zu finden sein.
Wir haben dafür den Subreport allgemein\belegkopfdaten.jrxml geschaffen, der von den jeweiligen Belegen zentral aufgerufen wird.
In diesem wird nur die Erscheinungsform definiert. Also Hintergrundfarbe, Schriftarten, Trennlinien, Positionierung, usw..
Die Grundidee ist, dass ein Subreportdatenobjekt erzeugt wird (siehe z.B. angb_angebot.jrxml).
In diesem ist je Zeile der erste Wert die Art dieser Zeile. Danach folgen vier Werte. Es müssen immer diese fünf Felder je Zeile gegeben sein.
Mit der Art wird gesteuert, wie die Zeile gedruckt wird.
Der Subreport selbst hat zwei Parameter, der als Überschrift z.B. Rechnung, verwendet wird und einen weiteren der für die Belegkennung (z.B. AG für Angebot) verwendet wird. Die Belegkennung wird nicht nach den verschiedenen Sprachen übersetzt.
Als Art sind aktuell folgende Werte definiert:
| Art |
Beschreibung |
| Links1 |
Überschrift in fett |
| Links2 |
zwei Felder, Lable, Inhalt volle Breite |
| Links4 |
vier Felder, Lable, Inhalt, Lable, Inhalt |
| Linie |
Trennlinie |
| Nicht |
nicht drucken, weil |
Zusätzlich ist es so aufgebaut, dass wenn der Inhalt (beide Inhalte) als null übergeben wird, wird die Zeile nicht gedruckt.
Wichtig: Es dürfen nur Strings übergeben werden. Damit liegt leider z.B. die Formatierung von Datumsangaben wieder im rufenden Report.
ACHTUNG: Offensichtlich muss man für trim() bzw. replace() das Null des String-Objektes vorher abfangen, sonst wird an den Subreport alles als Null übergeben.
D.h. wenn z.B. nur die Überschrift gedruckt wird, dann ist so ein Element beteiligt. Das auslösende Element findet man durch Auskommentieren.
Positionierung im Beleg
Wir richten uns hier nach der Postverordnung und danach, dass die Adresse des Empfängers im DIN-lang Kuvert positioniert sein muss.
Damit ergibt sich, dass dieser Block der Belegkopfdaten von links herein 260 Pixel und 265 Pixel breit sein muss. Die einzige mir bekannte Ausnahme wären alte Schweizer Kuverts, die genau verkehrt herum anzuordnen wären. Da auch die Schweizer inzwischen sich nach den DIN-lang Kuvert richten (dürfen / können) würde ich nichts umstellen.
Diese Ausrichtung gilt meiner Meinung nach auch, für Belege, die per PDF versandt werden, denn im Zweifel, wird das Dokument ausgedruckt.
8 - Report Varianten
Eine Sammlung praktischer / nützlicher Reportvarianten
Da (fast) alle Formulare auch Report-Varianten können und im Laufe der Zeit doch eine Vielzahl von praktischen Reports entstanden ist, hier eine lose Sammlung, was es denn schon so alles gibt.
Das fast bedeutet, dass für die FLR-Drucke keine Reportvarianten möglich sind, da dies generierte Reports sind.
Diese Reports werden von den Mitgliedern der Kieselstein-ERP eG zur Verfügung gestellt und mit der jeweils aktuellen Version ausgerollt.
So wie für alle Reports und Auswertungen. Die richtige Verwendung und die Prüfung der dargestellten Werte liegen beim Anwender / Mitglied.
| Report Zweck |
Vorlage |
Beschreibung |
zu finden unter |
| nicht erledigte Aufträge mit Lagerreichweite |
auft_auftrag_offene_positionen_reichweite |
welche Aufträge kann ich aus dem Lager innerhalb der nächsten 8 Monate bedienen. mit möglichen und Soll-Erlösen |
Auftrag, Journal, offene Positionen, Variante Reichweite |
| Übermengen |
fert_ausgabeliste_mit_uebermenge ww_artikelreservierung |
Gerade in der SMT Fertigung werden meist ganze Rollen in die Produktion gegeben. Nun will man natürlich wissen, welche Übermengen auf welchem Los gebucht sind. Dafür gibt es eine Erweiterung in der Losausgabeliste und in der Reservierungsliste |
Los, Drucken, Ausgabeliste Artikel, Info, Reservierungen |
| Spezial KEG Personalliste |
pers_personalliste_keg |
Darstellung der eingetretenen Personen und deren Zeitmodelle für die Mitarbeiter VZÄ Ermittlung |
Personal, Journal, Variante Mitgliederauswertung |
| LS-Gestehungspreise |
ls_lieferschein_etikett_inhalt |
Gestehungspreise jeder Lieferscheinposition, auch wenn es nicht Lagerbewirtschaftet Artikel sind |
Lieferschein, Lieferschen, Adressetikette |
| Logindaten |
pers_personalliste_login |
Gerade während der Systemeinführung, wann hat nun wirklich wer am Kieselstein ERP gearbeitet |
Personal, Journal, Variante Login-Daten |
| Lieferungen ohne Rechnung |
rech_warenausgangsjournal_ohne_LS |
Liste aller Mengenbehafteten Positionen die keinen Lieferschein (und keine Gutschrift) hinterlegt haben |
Rechnung, Journal, RE-Pos ohne LS |
| Los Kommissionierliste |
Los, Materialliste, fert_materialliste |
Welche Artikel sollte ich an den Fremdfertiger liefern |
Los, Reiter Material, Druck im Detail |
| Zahllastbetrachtung |
finanz_kontoblatt_zahllast |
Spezielle Sortierung des Kontodruckes, um eine gute Übersicht für das Finanzamtskonto zu bekommen. Voraussetzung dafür ist, dass in den Fibu Grunddaten, Kontoart, bei Abgabe der Abgaben Stichtag (15. / 10.) und bei Ust- Erwerbssteuerkonto die verschobene Fälligkeit in der Sortierung eingetragen ist. |
Fibu, Zahllastkonto, Info, Kontoblatt, Nur Zahllast
 |
| Maschinen-Struktur-Liste |
pers_maschinenliste_struktur |
Strukturierte Darstellung von der Fertigungsgruppe zur Maschine |
Zeiterfassung, Maschinen, Journal, Maschinenliste |
| ER mit WE |
er_eingangsrechnung_alle_mit_WE |
Eingangsrechnungsjournal mit den zugehörigen Bestellungen aus den Wareneingängen. Vor allem um ER ohne BS zu finden |
Eingangsrechnung, Journal, Alle, Variante mit Wareneingängen |
| EK Anf Stkl Vergleich mit BS |
as_einkaufsangebot_nk |
Vergleich der Einkaufs Anfrage Stückliste mit den tatsächlichen Bestellungen. Die Basis ist die Projektbezeichnung von EkAfStkl und den Bestellungen. Diese müssen die gleichen Bezeichnungen haben |
Angebotsstückliste, unterer Reiter Einkaufsangebot, Menüpunkt Einkaufsangebot, Drucken |
| Ek Anf Stkl Bestellinfo |
as_vergleich_bs |
Druck der durch Preise optimieren ermittelten Bestellwerte |
Angebotsstückliste, unterer Reiter Einkaufsangebot, Menüpunkt Einkaufsangebot, Vergleich |
| ABC Verbrauchsanalyse |
ww_hitliste_jahresbedarf_abc |
Analyse der Artikelverbrauche nach der Pareto Regel |
Artikel, Journal, Hitliste |
| Formelstückliste |
stk_gesamtkalkulation_formel |
Berücksichtigen der Formeln aus der Formelstückliste |
Stückliste, Formelstückliste auswählen, Bearbeiten, Konfigurieren |
Formelstückliste aus Angebot |
stk_gesamtkalkulation_formel_vk |
Errechnen eines Angebotes anhand einer Formelstückliste |
Angebot, Stückliste |
9 - XSL-Dateien
Verwendung / Arbeiten mit XSL-Dateien
Ergänzend zu den Formularen werden im Kieselstein ERP auch XSL Dateien verwendet.
Diese dienen der Steuerung der EMail-Vorlagen Texte und der Anpassung der Exportformate an die verschiedenen Finanzbuchhaltungsprogramme.
Nun ist das XSL faktisch eine Art Programmiersprache, womit sich eine weite Möglichkeit für die Anpassung der Ergebnisse ergibt.
Eine schnelle Übersicht findet man z.B. unter https://www.w3.org/People/maxf/XSLideMaker/tut.pdf
Vielleicht hilft auch https://www.softwaretestinghelp.com/xslt-tutorial/ dem einen oder anderen weiter. Gefunden habe ich auch: https://www.tutorialspoint.com/xslt/index.htm
Komische Zeichen in EMails
Erscheinen in deinen versandten EMails komische Zeichen, z.B.

So ist die EMail-Vorlage mit einem Standard Editor bearbeitet worden, wodurch die notwendige Codedefinition verschwindet. Leider ist es so, dass man diesen Fehler nur sehr mühsam findet. Mir ist derzeit nur ein verlässlicher Weg bekannt, mit dem festgestellt werden kann, ob die Datei richtig eingestellt ist.
Lasse dir die Datei mit einem File-Viewer anzeigen der auch Hexdaten darstellen kann. In Windowssystemen nutze ich dazu den im Totalcommander integrierten Fileviewer und schalte mit der Ziffer 3 auf die Hexdarstellung um. Hier sieht man den Unterschied.
| Ansicht |
Inhalt |
| Normale Darstellung |
 |
| Hex-Darstellung |
hier sieht man deutlich, dass in einer richtig codierten Datei am Anfang noch drei Steuerzeichen sind. Diese codieren die Datei im UTF-8-BOM Format. Leider werden diese Informationen von den allermeisten Editoren entfernt. |
Daher dürfen diese Dateien (in Windowssystemen) nur mit dem Notepad++ bearbeitet werden. Hier wird diese Information erzeugt / hinzugefügt. Siehe dazu auch:

UTF-8-BOM
Es müssen die EMail-XSL Vorlagen in UTF-8-BOM codiert sein.
Wichtig: Wenn man Texte von anderen Vorlagen importiert, oder “falsche” Vorlagen korrigiert, so kommt es auch im Notepad++ immer wieder vor, dass die Kodierung automatisch passend zu den gerade importierten Zeichen umgeschaltet wird. D.h. es muss unbedingt vor der Verwendung geprüft werden, ob die Kodierung noch immer auf UTF-8-BOM steht.
Es kommt sonst immer wieder vor, dass gerade unsere deutschsprachigen Umlaute falsch dargestellt werden, oder dass beim Versuch die Rechnung per EMail zu senden, eine Fehlermeldung kommt.
Sieht man im Server Log nach, so findet man:
2024-04-16 16:51:16,582 ERROR [stderr] (default task-3) [Fatal Error] :17:12: Invalid byte 1 of 1-byte UTF-8 sequence.
2024-04-16 16:51:16,583 ERROR [stderr] (default task-3) System-ID unbekannt; Zeilennummer17; Spaltennummer12; org.xml.sax.SAXParseException; lineNumber: 17; columnNumber: 12; Invalid byte 1 of 1-byte UTF-8 sequence.
Sonderzeichen in den EMail-Vorlagen definieren
Da, insbesondere in den Firmen-Namen immer wieder auch Sonderzeichen enthalten sind, müssen diese entsprechend in den XSL-Vorlagen codiert übergeben werden, da das eigentliche Sonderzeichen eine besondere Bedeutung hat. D.h. diese Zeichen sind wie gewünscht zu kodieren:
| Zielzeichen |
Codierung |
| & |
& |
| Leerzeichen |
  |
Siehe dazu gerne auch https://www.htmlhelp.com/de/reference/html40/entities/special.html, Spalte Entität, bzw. Darstellung im Browser.
Anmerkung: Das Backslash im Source ist nur, damit dies als Text ausgegeben wird und nicht interpretiert wird.
Kostenstellen Subdirectory wird bei XSL nicht unterstützt
Die mögliche Steuerung der Formularvorlagen über die zusätzliche Subdirectory Funktion in den Kostenstellen wird bei den mail.xsl Vorlagen nicht unterstützt.
Verwendung der Vorlagen
Siehe dazu auch.
In den standard Reportvorlagen findest du unter allgemein auch XSL Vorlagen für den EMail-Textvorschlag für den EMail-Versand. Die Grundidee hinter diesen Vorlagen ist, dass es eine allgemeine Vorlage für alle Formulare gibt und dass man zusätzlich diese Vorlage je Report durch eine spezielle Definition übersteuern kann.
Zusätzlich können noch spezielle Übersteuerungen vorgenommen werden.
| Vorlage |
Bedeutung / Verwendung |
| mail.xsl |
Die Vorlage für den EMail-Text aller Formulare |
| mail_html.xsl |
Wenn in deiner Installation der HTML EMail Versand (Zusatzfunktionsberechtigung EMAIL_CLIENT) aktiviert ist und der Parameter HTML_SIGNATUR_MAILVERSAND definiert ist. |
| mail_signatur.xsl |
Umfassende html Vorlage mit Korrekturen und allen Firmendaten Hier siehst du auch die Verwendung von Bedingungen und ähnliches |
| absender_vorlage.xsl |
Übersteuerung des Absenders, sodass z.B. die Ausgangsrechnung immer von buchhaltung@ versandt wird |
| anhang_vorlage.xsl |
Übersteuerung des Namens des Anhangs |
| betreff_vorlage |
Übersteuerung des Betreffs siehe |
Weitere Details, insbesondere die zur Verfügung stehenden Parameter, siehe bitte innerhalb der jeweiligen Dateien.
Wie bei einer Neuinstallation vorgehen
Wenn in deiner Kieselstein ERP Installation noch keine EMail-Definitionen vorgenommen wurden, so würde ich die mail_signatur.xsl aus dem Standard (LW\dist\wildfly-26.1.2.Final\kieselstein\reports\allgemein\mail_signatur.xsl) nach dem Anwender kopieren (LW\data\reports\allgemein) und von mail_signatur.xsl auf mail.xsl umbenennen.
Passe dann diese Vorlage entsprechend deinen Wünschen an.
Hierfür kannst du auch System, Pflege, Beleg Pflege, Allgemein, XSL Vorlage aendern verwenden.

Einrichten der Mahnungstexte.
Da man meist zumindest die Texte der Sammelmahnung auch entsprechend gestalten will, hier meine persönliche Vorgehensweise.
- Ich richte mir einen Mahnungslauf, der nur eine Mahnung in der gewünschten Stufe beinhaltet.
- Nun schalte ich den EMail Versand ab. System, Automatik, den Haken bei Mailversand herausnehmen (im Detail)
- nun gehe ich in den Mahnungslauf und klicke auf EMail Versand
- Nun in System, Versandauftrag, Refresh
- Wie sieht der Text aus
- diesen gegebenenfalls anpassen und
- zurück zum Mahnungslauf
- durch Klick auf den Radiergummi den letzte Mahnungsversand löschen (bei offen steht wieder 1)
- wieder beim Mahnungs-EMail Versand beginnen
Solange bis dein Text passt. Achte dabei auf die unterschiedlichen Formatierungen für html oder normalen EMail Text.
Denke daran, danach den EMail Versand in System, Automatik, Mailversand wieder zu aktivieren.
Anmerkungen
- finanz_mahnung_betreff.xsl kann nicht verwendet werden, da das Betreff errechnet wird
- finanz_sammelmahnung_betreff.xsl kann nicht verwendet werden, da das Betreff errechnet wird
Einfache XSL Vorlage
Für einfache EMail Vorlagen kannst du auf die apply-templates verzichten, sodass deine XSL Vorlage z.B. für die Finanz Sammelmahnung wie folgt aussieht:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:preserve-space elements="*"/>
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="mail">
Liebe(r) <xsl:value-of select="/mail/partner_name2"/> <xsl:value-of select="/mail/partner_name1"/>,
leider muss ich dir diese Zahlungserinnerung senden.
Überweise doch bitte den im Anhang ausgewiesenen offenen Betrag in den nächsten Tagen.
Mit lieben Grüßen
Kieselstein die Open Source ERP-Software für erfolgreiche Unternehmer
</xsl:template>
</xsl:stylesheet>
Der Vorteil dieses Beispiels ist, dass du dir aus partner_name2 den Vornamen des Rechnungsempfängers holst, womit eine persönlichere Anrede möglich ist.
10 - Besonderheiten
Hinweise zu besonderen Formular Verhalten und ähnlichem
Kostenstellenspezifische Kopf- und Fußzeilen
Hier ist darauf zu achten, dass auch die Dateien ausdruckmedium.j* mit in die jeweiligen Subreports einkopiert werden müssen.
Solltest du in der Druckvorschau, in der Dokumentenablage übereinander gedruckte Informationen, meist in Kombination mit Speichern unter, finden

so hilft das Einkopieren der beiden Dateien.
Hinweis: Die Pfad Definition findest du unter System, Mandant, Kostenstellen, Subdirectory.