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 Resourcen hungrig 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, aber 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 compiliert werden. D.h. wenn beim compilieren Fehlermeldungen wie z.B.
aufscheinen, so muss mit Jasperstudio compiliert 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 (Siehe Eigenschaften des Reports) der ganze Zeilen herausfiltert.

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 du 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 Summary 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

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

Arbeiten mit Formularen im iReport / JasperStudio

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 Hierachie der Verzeichnisstruktur können Sie unter “System -> Druckformulare” entnehmen.

Grundsätzliche Vorgangsweise beim Bearbeiten eines Reports

  1. 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)
  2. Bei bereits vorhandenem Anwenderreport: Backup des Anwenderreport-Verzeichnis erstellen.
  3. Textfelder (Felder oder Parameter) im iReport anpassen.
  4. Änderung speichern und mit “Build - Compilieren”. Damit werden ihre Änderungen im laufenden System übernommen.
  5. Ä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 das 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 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,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 mindest Abstand ist die Breite zweier Zeichen zu empfehlen. 

Bitte bedenken Sie auch, dass Barcodescanner üblicherweise eine maximale Erfassungsbreite von 70mm haben. D.h. mit einem Rand von wenigen Zeichen darf ein Barcode maximal 220Punkte 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 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.

Drucken des Pageheaders aus dem Summary heraus, wenn im Summary ein Seitenumbruch ist.

Dies ist im Konzept des JasperReports nicht direkt vorgesehen. Als Work Around 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 richtigen 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 eigentliche 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.

  1. Nur Drucken wenn String Leer ist:
    new Boolean($F{F_POSITION}!=null&&$F{F_POSITION}.trim().length()>0)
    F_POSITION ist hier der String

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

Bitte beachten Sie, dass in der Regel der Kieselstein ERP Client unter … zu finden ist.

Fehlermeldung unsupported version

Kommt beim Compilieren 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 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 häufig schwarzer 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.

Beispiel für einen Style

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?

A: 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. Speicher 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 den 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 Etikette 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 EMai-Adresses 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-ui-swing.jar / lpclientpc.jar gesetzt werden, welches du üblicherweise unter c:\kieselstein\client\lib\kieselstein-ui-swing.jar 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 16GB 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.

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 / compilieren eingeschaltet sein.
Hauptmenüleiste, Window, Preferences

General, Workspace, Build

Build und Sichern

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 6Punkt sowieso als nicht geschrieben gelten, benötige ich diese Funktion nicht.
Kompatibilität

Kennzeichnen für Jasperstudio wird instabil

Wenn das automatische Sichern vor dem Compilieren nicht mehr geht, empfiehlt sich, das Jasper Studio neu zu starten, damit nicht deine Editierarbeit vergebens war.

Installation

herunterladen

https://sourceforge.net/projects/jasperstudio/files/latest/download

Achte darauf immer nur eine Version auf dem Rechner installiert zu haben. Die Version vom 29.5.2023, 6.20.5 scheint etwas weniger Resourcen hungrig zu sein.
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

2024-03-25 / 6.21.2

Es stehen die Vorgängerversionen nicht mehr zur Verfügung. JasperSoft stellt aktuell die 6.21.2 zur Verfügung.

Diese hat das gleiche Verhalten wie die Version 6.20.6. D.h. sie kann mit den Reports auf dem Root nicht umgehen. D.h. insbesondere bei der Bearbeitung von Report in Netzwerkumgebungen muss mindestens eine zusätzliche Ebene, also ein Ordner angesprochen werden. Sonst werden die Properties nicht ausgelesen.

Die Datei findest du unter https://community.jaspersoft.com/files/file/41-jaspersoft-community-edition/ Für den Download muss du dich entsprechend registrieren.

Hinweis: Auch für die Installation wird nun eine Registrierung verlangt.

2024-07-01 / 6.20.6

Die Version 6.20.6 steht offensichtlich auch nicht mehr zur Verfügung.

Das bedeutet im Endeffekt. Du musst dir für dein Betriebssystem eine gültige Version der 6.20.5 organisieren.

Wir arbeiten gerade an der Umstellung des Wildfly auf Java 11 und damit verbunden auch auf die Verwendung des aktuellen Jasper Studio 6.21.3.

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

  • 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-ui-swing.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 ejb.jar verwendet wird. Du findest diese an zwei Stellen:

  • In deinem Kieselstein ERP Client Verzeichnis. Also unter … ?:\kieselstein\client\lib\ejb-0.0.11-51-g63d591ac.jar
  • Es ist diese auch in deinem Kieselstein Deployverzeichnis zu finden. D.h. in der Datei ?:\kieselstein\dist\wildfly-12.0.0.Final\standalone\deployments\kieselstein-0.0.11-48-g92eacfec.ear kannst du mit einem Unzipper, wir machen dies direkt im Total Commander, rein gehen und findest hier

    die ejb Datei, in der alle von deinem Server unterstützen Helper enthalten sind.

Bitte beachte, dass die hier angeführten Versionsnummern zu deiner Serverinstallation passen müssen.

Verbinden der Reportdateien mit dem Projekt

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. ?:\kieselstein\dist\wildfly-12.0.0.Final\server\helium\report.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.

noch einstellen

Ich habe für mich noch folgende Einstellungen getroffen

Window, Preferences, Generell, 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.

Window, Preferences, Jaspersoft Studio, Report Designer, Toolbars

  • Elements Alignment ist sehr praktisch

Window, Preferences, Java, Compiler

Compiler compliance level -> habe ich auf 1.8 gestellt, da derzeit der Server nur in Java 8 compiliert ist

Window, Preferences, General


Alway run in background -> abschalten -> üblicherweise compiliere 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

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”

Fehler beim Compilieren finden

Auf den Tab-Problems, den Report suchen und Doppelklick

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.

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 compiliert 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 Hierachie 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’’’ anhacken. Der Haken bei keep.java kann entfernt werden.

Das Sie auf das Verzeichnis der Reports ein Schreibrecht haben müssen ist selbstverständlich.

Grundsätzliche Vorgangsweise beim Bearbeiten eines Reports

  1. Wenn nicht vorhanden, ein Verzeichnis für Anwenderreport anlegen, und Originalreports hineinkopieren.
  2. Bei bereits vorhandenem Anwenderreport: Backup des Anwenderreport-Verzeichnis erstellen.
  3. Textfelder (Felder oder Parameter) im iReport anpassen.
  4. Änderung speichern und mit “Build - Compilieren” werden ihre Änderungen im laufenden System übernommen.
  5. Ä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 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 das 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 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,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 mindest Abstand ist die Breite zweier Zeichen zu empfehlen. 

Bitte bedenken Sie auch, dass Barcodescanner üblicherweise eine maximale Erfassungsbreite von 70mm haben. D.h. mit einem Rand von wenigen Zeichen darf ein Barcode maximal 220Punkte 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.

Drucken des Pageheaders aus dem Summary heraus, wenn im Summary ein Seitenumbruch ist.

Dies ist im Konzept des JasperReports nicht direkt vorgesehen. Als Work Around 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 richtigen 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 eigentliche 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.

  1. Nur Drucken wenn String Leer ist:
    new Boolean($F{F_POSITION}!=null&&$F{F_POSITION}.trim().length()>0)
    F_POSITION ist hier der String

  2. 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”) ;

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

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

Wie in der Bearbeitung von Formularen vorgehen

Bereiche eines Formulares

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.

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)

kann man Formulare kopieren?

Das kommt darauf an!

Will man eine Reportvariante erstellen, so muss immer vom Original Formular 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 einen 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 original Felder in der Zieletiketten z.B. rechts raus, damit im eigentlichen Feld Platz wird.
  • Kopieren aller Felder in die Zieletikette
  • üblicherweise sind die Felder um 10x10Pixel 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 unbenennen
  • die überzähligen Felder löschen
  • compilieren. Hat man vergessen ein Feld umzubenennen kommt ein entsprechender Fehler.

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.

Sammlung von praktischen Sonderzeichen

Sonderzeichen Bedeutung
Interpunktion
· Middle Dot
ok Häckchen, ACHTUNG: Anzeige im Browser geht so nicht.
Ø Durchmesserzeichen, Alt+0216
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/.

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.

4 - Farbdefinitionen

Bewährte Farbdefinitionen

Bei der Erstellung von Formularen / Reports ist auch immer die Frage, wie kann man besondere Felder hervorheben. Hier ist mit zu bedenken, 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 zusammen getragen.

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]

Hintergrund Farben = Regenbogenfarben in Pasteltö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]

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 hintergrund rot [255,153,153]

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

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

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.

Datum in String konvertieren

  • (new SimpleDateFormat(“dd.MM.yyyy”, Locale.GERMAN)).format($P{P_ANGEBOTSGUELTIGKEIT}) Locale.ENGLISH
  • bei den Schreibweisen auf 24Std 12Std 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 verwandelt weden kann, 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 Vairable Datum, welche ein Date ist:
(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()36001000)).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
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 (siehe auch PJ 19324). Wenn hinten true, dann auch Sekunden

Zahlen in String konvertieren

  • String.format("%05d", $F{F_ARBEITSGANG})
    nur für integer

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.

Timestamp / Datum formatieren

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’

  1. Extract from a timestamp column: Use date() function: SELECT DATE(column_name) FROM table_name;
  2. 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 

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’;” )

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”

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

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)

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

Wochentage / Wochentagsnamen andrucken

  • com.lp.util.HelperReport.getWochentag($P{REPORT_LOCALE}, $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

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”/>
<sortField name=“F_UNTERARBEITSGANG”/>
<sortField name=“F_MATERIAL_LAGERORT”/>

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.

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.

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

Beachte: Ein goto innerhalb des Moduls, wird unterstützt, führt aber immer dazu, dass der soeben angezeigte Report verlassen wird.

Währung aus dem Mandantenobjekt holen

$P{P_MANDANT_OBJ}.getMandantDto().getWaehrungCNr()

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.

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

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.

Pfade mit einer Kostenstelle

Falls eine Kostenstelle vorhanden ist werden zuerst folgende Pfade durchsucht.

  1. {KIESELSTEIN_DATA}/reports/{modul}/{kostenstelle}/{mandant}/{locale}
  2. {KIESELSTEIN_DATA}/reports/{modul}/{kostenstelle}/{mandant}
  3. {KIESELSTEIN_DATA}/reports/{modul}/{kostenstelle}

Standard Pfade

Ansonsten werden folgende Pfade nach einem Report durchsucht.

  1. {KIESELSTEIN_DATA}/reports/{modul}/{mandant}/{locale_country}
  2. {KIESELSTEIN_DATA}/reports/{modul}/{mandant}/{locale}
  3. {KIESELSTEIN_DATA}/reports/{modul}/{mandant}
  4. {KIESELSTEIN_DATA}/reports/{modul}
  5. {KIESELSTEIN_DIST}/wildfly-X.X.X.Final/kieselstein/reports/{modul}/{locale_country}
  6. {KIESELSTEIN_DIST}/wildfly-X.X.X.Final/kieselstein/reports/{modul}/{locale}
  7. {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.

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.

Ü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 Datum’s 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 260Pixel und 265Pixel 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 Reportvararianten 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 aktuelle Version ausgerollt.
So wie für alle Reports und Auswertungen. Die richtige Verwendung und die Prüfung der dargestellten Werte liegt 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 Paretto 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:

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 weider vor, dass gerade unsere deutschsprachigen Umlaut 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
& &amp;

Siehe dazu gerne auch https://www.htmlhelp.com/de/reference/html40/entities/special.html, Spalte Entität, bzw. Darstellung im Browser

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.

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.

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