Module Berichte Geschätzte Lektüre: 30 Minuten Ein LIMBAS Bericht stellt die Daten einer Tabelle oder einer Abfrage im PDF-, ODT- (OpenOffice) oder XML-Format dar. Die Berichtvorlage wird in LIMBAS mit dem Berichteditor entworfen und kann diverse Gestaltungselemente (z.B. Grafiken, Kopf- und Fußzeilen) enthalten. Berichteditor Beim Aufruf des Berichteditors erscheint eine nach Tabellen sortierte Auflistung der vorhandenen Berichtvorlagen mit der Möglichkeit weitere Berichte hinzuzufügen. ID: Eindeutige Identifikation der Berichtvorlage. Beim Hinzufügen einer neuen Berichtvorlage wird diese ID von LIMBAS selbst gesetzt. Durch Mausklick auf das Editier-Symbol lässt sich die entsprechende Berichtvorlage bearbeiten. löschen: Durch Mausklick auf das Papierkorb-Symbol wird die entsprechende Berichtvorlage nach Rückfrage gelöscht. Bericht: Name der Berichtvorlage für Tabelle: Tabelle, auf die die Berichtvorlage angewandt werden soll Bericht-Erweiterung: Bietet eine Auswahl an php-Dateien des EXTENSIONS Order. Dieses eigene Skript wird anstelle des IMBAS Berichts ausgeführt. Die komplette Rechtestruktur bleibt erhalten. Ablageordner: Für jeden neuen Bericht wird ein Ordner mit dem Namen des Berichts angelegt. Standardmäßig wird der Bericht in diesem Ordern abgelegt. Alternativ können auch Unterordner dieses Ordner als Ablageort über den Dateimanager hinzugefügt und als Ablageordner definiert werden. Es werden nur Unterordner des übergeordneten Hauptordners des jeweiligen Berichts zur Auswahl angezeigt. Es ist jedoch auch möglich die Ordner -ID direkt einzugeben was es ermöglicht jeden Ordner des Dateisystems auszuwählen. Ist der Ausgewählte Ordner ein Unterordner eines Tabellen-Feldes des Typs „Verknüpfung zu Dateisystem“ wird der erstellte Bericht zusätzlich in dieses Feld verknüpft. Ablagename: Vordefinierter Name beim Abspeichern des Berichts. Der Name kann mit Variablen wie die Datensatz-ID ergänzt werden. Z.B. [„Rechnung_$ID“] oder [„Bericht_$ID_“.$session[user_id].“_“.date()] Standardformat: Aktuell können Berichte als PDF, ODT oder XML generiert werden. Für ODT Berichte wird ein zusätzliches ODT Template benötigt. Open Office Template: Auswahl des ODT Templates aus dem Dateisystem. Berichtvorlage hinzufügen Name: siehe oben „Bericht“ Tabelle: siehe oben „für Tabelle“ kopieren: Name einer bereits vorhandenen Berichtvorlage, dessen Berichtelemente in der neuen Berichtvorlage übernommen werden. Bei Mausklick auf den Button „neuer Bericht“ lässt sich die neue Berichtvorlage bearbeiten. Berichtvorlage bearbeiten Auf der linken Seite des Berichteditors befindet sich die jeweils aktuelle Ansicht der Berichtvorlage. Eine gerade neu angelegte Berichtvorlage ist hier noch leer. Auf der rechten Seite des Berichteditors befindet sich die Werkzeugleiste mit folgender Unterteilung: Name der Berichtvorlage und der Tabelle, auf die die Berichtvorlage angewandt werden soll Koordinaten, Breite und Höhe des selektierten Berichtelements Globale Berichteinstellungen: Z-Satz/Größe: Der hier eingestellte Zeichensatz und die hier eingestellte Zeichengröße werden als Voreinstellung für Berichtelemente, die Text beinhalten und dem Bericht neu hinzugefügt werden, verwendet. Seitengröße (mm): Breite/Höhe definieren die Seitengröße des Berichts in Millimeter. Seitenränder (mm): In der Ansicht der Berichtvorlage werden entsprechend den Einstellungen „oben:“/“unten:“/“links:“/“rechts:“ Linien für den Seitenrand als Editierhilfe eingeblendet. Für die Generierung des Berichts haben diese keine Bedeutung. name: Proportionen erhalten: Ist diese Eigenschaft gesetzt, so können Höhe und Breite des selektierten Berichtelements nur so geändert werden, dass dabei die Proportionen erhalten bleiben. Ansonsten können Höhe und Breite des selektierten Berichtelements auch unabhängig voneinander geändert werden. Z-Index berücksichtigen: siehe zIndex Z-Index erneuern: siehe zIndex Sortierung: Diese Einstellung legt fest, wie die Seiten des Berichts generiert werden. Dies hat z.B. Auswirkungen darauf, welches Berichtelement bei sich überlappenden Elementen im Vorder- bzw. Hintergrund dargestellt wird. Z-Index: Die Berichtelemente werden in der Reihenfolge ihres zIndex-Wertes auf der Seite platziert. Überlappende Elemente mit höherem zIndex werden somit vor denen mit niedrigerem zIndex dargestellt. Bei identischen Werten ist es dem Zufall überlassen, welches Element im Vorder- bzw Hintergrund gezeigt wird. Y-Pos: Die Reihenfolge, in der die Berichtelemente auf der Seite platziert werden, wird durch die y-Koordinate der Berichtelemente bestimmt. Dabei wird das Element mit der niedrigsten y-Koordinate zuerst platziert. Bei sich überlappenden Berichtelementen wird daher das Element mit höherer y-Koordinate im Vordergrund sein. Bei identischen Werten ist es dem Zufall überlassen, welches Element im Vorder- bzw Hintergrund gezeigt wird. Buttons zum Hinzufügen von Berichtelementen: Wird der Mauszeiger für kurze Zeit auf einem Button belassen, so wird die Funktionalität des Berichtelements eingeblendet. Button „übernehmen“ zum Speichern der Berichtvorlage Tabelle mit Auflistung der verwendeten Berichtelementen: Die Tabelle zeigt für jedes in der Berichtvorlage verwendete Berichtelement die Element-Nr. den Typ des Berichtelements einen Hinweis auf den Inhalt des Berichtelements Hinzufügen eines Berichtelements Bei Mausklick auf einen Button zum Hinzufügen eines Berichtelements wird ein entsprechendes Element in der Ansicht in der oberen linken Ecke hinzugefügt, und zwar mit den für das jeweilige Element gültigen Default-Eigenschaften. Die Eigenschaften eines Berichtelements sind Typ-abhängig und lassen sich wie unten (Einstellen/Ändern der Eigenschaften eines Berichtelements) beschrieben ändern. Soll sich ein Element in einer Tabelle befinden, so muss diese zuerst angelegt werden. Vor dem Hinzufügen des inneren Berichtelements muss das entsprechende Tabellenfeld selektiert sein. Das erste innere Berichtelement wird dann in der oberen linken Ecke des Tabellenfeldes platziert, weitere folgen je nach Breite der Tabellenspalte rechts oder unterhalb. Die folgenden Elemente werden vom LIMBAS Berichteditor zur Platzierung auf einer benutzerdefinierten Berichtvorlage angeboten: Textblock DateninhalteBei Mausklick auf den Button für „Dateninhalte“ wird in der Werkzeugleiste unterhalb der Buttons ein Baum der Tabellenfelder eingeblendet. Erst bei Mausklick auf eines dieser Tabellenfelder wird das Berichtelement in der Ansicht der Berichtvorlage hinzugefügt. GraphikBei Mausklick auf den Button für „Graphik“ wird in der Werkzeugleiste unterhalb der Buttons ein Feld zur Eingabe einer Datei mit Pfad eingeblendet. Ist ein gültige Grafik-Datei eingetragen, so wird diese bei Mausklick auf „übernehmen“ in der Ansicht der Berichtvorlage hinzugefügt. Rechteck TabelleDie Tabelle ermöglicht die geordnete Platzierung von Berichtelementen „Textblock“, „Dateninhalt“, „Datum“ und/oder „Formel“ nebeneinander. Bei der Generierung des Berichts werden momentan nur die Tabellenspalten berücksichtigt, die in der ersten Zeile ein inneres Berichtelement haben. Dabei ist leerer „Textblock“ ausreichend. Ein Tabellenfeld kann mehrere innere Berichtelemente aufnehmen. Ist dies der Fall, werden bei der Generierung des Berichts die Eigenschaften des ersten Berichtelementes (links oben) auch für alle weiteren Elemente in diesem Tabellenfeld verwendet. Datum Seiten-NrBei Berichten für mehrere Datensätze fängt die Seiten-Nr für jeden Datensatz wieder mit „1“ an, dann fortlaufend bis zur letzten Seite des Datensatzes. Formel Unterformular Selektieren eines Berichtelements Es kann immer nur ein Berichtelement selektiert sein. Dieses erkennt man daran, dass es in der Tabelle mit den aktuell verwendeten Berichtelementen farblich hervorgehoben ist in der Ansicht der Berichtvorlage an der unteren rechten Ecke ein Symbol zum auf/zusammenziehen hat Das Selektieren eines Berichtelements ist somit möglich durch Mausklick auf den entsprechenden Eintrag in der Tabelle mit den aktuell verwendeten Berichtelementen Mausklick auf das entsprechende Element in der Ansicht der Berichtvorlage Einstellen/Ändern der Eigenschaften eines Berichtelements Beim Einstellen/Ändern der Eigenschaften eines Berichtelements ist zu beachten, dass bei der Generierung des Berichts die Elemente auf die folgenden Bereiche der Seite platziert werden: Hintergrund Kopfzeile eigentlicher Inhalt Fußzeile Dabei kann der Hintergrund den Platz der gesamten Seite nutzen. Kopfzeile, eigentlicher Inhalt und Fußzeile überlappen sich normalerweise nicht (Ausnahme durch Option „Fixiere Position“, siehe unten). Entsprechend den Einstellungen für „Hintergr“ und „versteckt“ (siehe unten) werden die Berichtselemente des Hintergrunds, der Kopfzeile und der Fußzeile auf allen Seiten, nur auf der ersten Seite, auf allen Folgeseiten, auf allen geraden Seiten oder allen ungeraden Seiten des Berichts eines Datensatzes dargestellt. Die Berichtelemente des eigentlichen Inhalts werden einmalig dargestellt. Sind nach Fertigstellung einer Seite noch weitere Berichtselemente im eigentlichen Inhalt zu platzieren, erfolgt nach der Fußzeile ein Seitenumbruch und eine weitere Seite wird dem Bericht hinzugefügt. Voraussetzung für das Einstellen/Ändern der Eigenschaften eines Berichtelements ist, dass dieses selektiert ist. Die Position lässt sich per Drag&Drop in der Ansicht der Berichtvorlage oder durch Eingabe der Koordinaten in der Werkzeugleiste ändern. Dabei entspricht X=0, Y=0 der oberen linken Ecke des Berichts. Handelt es sich um ein Berichtelement in einer Tabelle, so kann die Position nur durch Verschieben der ganzen Tabelle bzw. Ändern der Spaltenbreite verändert werden. Die X-/Y-Koordinaten werden für Elemente in einer Tabelle nicht gezeigt. Die Höhe und Breite lässt sich durch auf/zusammenziehen in der Ansicht der Berichtvorlage oder durch Eingabe entsprechender Werte (in Pixel) in der Werkzeugleiste ändern. Bei Berichtelementen mit Text wird die Höhe im generierten Bericht allerdings automatisch dem Text angepasst, so dass bei diesen Elementen der hier dafür eingestellte Wert nur für die Ansicht im Berichteditor verwendet wird. Die Breite einer Tabelle sowie eines Berichtelements in einer Tabelle lässt sich nur über die Breite der zugehörigen Tabellenspalte(n) anpassen. Dazu muss der linke oder rechte Rand eines verwendeten (!) Tabellenfeldes mit der Maus entsprechend verschoben werden. Beim Selektieren des Berichtelements öffnet sich ein Kontext-Menü, welches die Einstellung weiterer Eigenschaften ermöglicht. Folgende Menüpunkte/Anzeigen/Einstellmöglichkeiten befinden sich bei allen Berichtelementen im Kontext-Menü: Die Element-Nr. ist eine eindeutige Identifikation (positive ganze Zahl) für das Berichtelement. Beim Hinzufügen eines neuen Berichtelements wird diese nicht änderbare ID von LIMBAS selbst gesetzt. Der zIndex-Wert ist nur bei entsprechender Einstellung für Sortierung von Bedeutung. wird durch die Menüpunkte in den Vordergrund bzw. in den Hintergrund entsprechend verändert. wird bei gesetzter globaler Berichteinstellung Z-Index berücksichtigen beim Selektieren eines Berichtelements auf den in der Berichtvorlage aktuell höchsten Wert gesetzt. wird durch Z-Index erneuern allen Berichtelementen neu zugewiesen, und zwar so dass es keine Lücken bei den zIndex-Werten gibt. Die bisherige Reihenfolge wird beibehalten. Bei kopieren wird das Berichtelement mit den eingestellten Eigenschaften kopiert. Für den Rahmen der Berichtelemente läßt sich neben der Rahmenfarbe, der Art und der Dicke auch einstellen, welche Kanten (links, rechts, oben, unten) gerahmt werden. Transp. ermöglicht das Durchscheinen des Berichtelements im in Prozent eingestellten Grad. Durch entsprechende Einstellung bei Hintergr wird das Berichtelement auf den Seiten-Hintergrund platziert. Es wird dann je nach Einstellung auf allen Seiten, nur auf der ersten Seite, auf allen Folgeseiten, auf allen geraden Seiten oder allen ungeraden Seiten des Berichts eines Datensatzes dargestellt. Umbruch kann je nach Einstellung vor oder nach dem Berichtelement einen Seitenumbruch erzwingen. Relativ legt fest, dass der Abstand des Berichtelements zum unteren Rand des hier referenzierten Elements immer dem Abstand entspricht, wie es in der Ansicht der Berichtvorlage eingestellt ist. Dies kann sinnvoll sein, wenn das referenzierte Berichtelement variablen Text enthält und daher eine variable Höhe hat. Ist bei abhängig ein Berichtelement des Typs „Dateninhalt“ referenziert und ist dieses bei der Generierung des Berichts leer, so wird das eigentliche Berichtelement im generierten Bericht nicht hinzugefügt. Das Berichtelement wird je nach Einstellung bei versteckt auf allen Seiten, nur auf der ersten Seite, auf allen Folgeseiten, auf allen geraden Seiten oder allen ungeraden Seiten des Berichts eines Datensatzes dargestellt. Das „Verstecken“ eines Berichtelements macht nur Sinn für sich wiederholende Elemente der Kopf-/Fußzeile oder des Hintergrunds. Durch eine der Optionen Kopf oder Fuß wird das Berichtelement zur Kopf- bzw. Fußzeile hinzugefügt und wird nicht als Teil des eigentlichen Inhalts behandelt. Die Option Fixiere Position ist nur sinnvoll für Berichtelemente des eigentlich Inhalts. Bei gesetzter Option werden diese im generierten Bericht an genau der gleichen Position wie in der Berichtvorlage platziert und können den Bereich der Kopf- oder Fußzeile überlappen. Bei löschen wird das Berichtelement ohne weitere Rückfrage gelöscht. Folgende Menüpunkte/Anzeigen/Einstellmöglichkeiten befinden sich abhängig vom Typ des Berichtelements im Kontext-Menü: Bei Berichtelementen mit Text lässt sich der Font, die Größe, die Darstellung, die Fontfarbe und die Hintergrundfarbe des Textes einstellen. Weiter gibt es eine Einstellung für den Mindest-Abstand vom Rahmen zum Text. Ist die Option Liste beim Berichtelement „Dateninhalt“ gesetzt, bewirkt dies bei zugehörigen Tabellenfeldern vom Typ Verknüpfung, dass die Dateninhalte des jeweiligen Tabellenfeldes von allen verknüpften Datensätzen gelistet werden. Bei nicht gesetzter Option wird nur der erste verknüpfte Datensatz im Bericht berücksichtigt. bei allen anderen zugehörigen Tabellenfeld-Typen, dass die Werte aller Datensätze des zugehörigen Tabellenfeldes gelistet werden. Die bei Separator eingetragenen Zeichen haben zwei Verwendungszwecke: Wird (wie oben beschrieben) beim Berichtelement „Dateninhalt“ der Inhalt aus mehreren Datensätzen gelistet, werden die eingetragenen Zeichen als Trennzeichen verwendet. Falls es keine Eintragung gibt, wird ein Zeilenumbruch eingefügt. Falls in einem Tabellenfeld mehrere innere Berichtelemente vorhanden sind, werden die eingetragenen Zeichen im generierten Bericht zwischen diesen Elementen als Trennzeichen eingefügt. Falls es keine Eintragung gibt, wird in diesem Fall auch nichts eingefügt. Durch Setzen der HTML-Option wird der Text in den Berichtelementen „Textblock“ und „Formel“ als HTML interpretiert. Dabei ist zu beachten, dass hierdurch andere Einstellungen aus dem Kontextmenü überschrieben und somit ungültig werden. Wird bei beim Berichtelement „Dateninhalt“ das Häkchen für ersetzen gesetzt und sofort danach ein neues „Dateninhalt“-Berichtelement, das mit einem anderen Tabellenfeld verknüpft ist, erstellt, so wird das ursprüngliche Berichtelement gelöscht und dem neuen werden die Eigenschaften des ursprünglichen zugewiesen. Diese Funktionalität kann zusammen mit der Kopier-Funktion das Platzieren mehrerer „Dateninhalt“-Berichtelemente in dem Bericht erleichtern. Das Häkchen wird automatisch nach der folgenden Aktion gelöscht. Die Anzahl der Spalten und Zeilen des Berichtelements „Tabelle“ wird durch die Angaben im Kontext-Menü festgelegt. Durch Setzen von colspan bei einem Tabellenfeld kann sich dieses über mehrere Spalten hinweg erstrecken. Bild-Infos zeigen die entsprechenden Informationen einer Graphik-Datei an. proportional für Grafiken aus Dateninhalten Durch Setzen des tagmode für das erste Berichtelement innerhalb eines Tabellenfeldes kann der Text dieses Tabellenfeldes im generierten Bericht über selbst definierte Tags formatiert werden. Ansonsten werden die Eigenschaften vom ersten Berichtelement des Tabellenfeldes für den Text des gesamten Tabellenfeldes verwendet. Die Tags werden in der Datei ./dependent/EXTENSIONS/system/report_tab_tags entsprechend folgendem Beispiel definiert: <exampleTag> mit Schriftart Arial, italic, Textgröße 11, und Textfarbe : $pdf->SetTagStyle(„exampleTag“,“arial“,“I“,11,“0,151,200″);Ein Tag kann dann im Text eines Textblocks, Dateninhalts oder einer Formel auf folgende Weise verwendet werden: Text ohne Tag, <exampleTag> dieser Text wird im generierten Bericht entsprechend der Tag-Definition dargestellt,</exampleTag> Text ohne Tag Unterberichte Über den Punkt Untermenü der Toolbox im Berichte-Editor können Unterberichte eingehängt werden. Dazu wählt man die Art des Unterberichts (einbetten oder einhängen) aus und den gewünschten Bericht. Einbetten – versucht den Unterbericht direkt in den Hauptbericht zu integrieren als ob er Teil des Hauptberichts ist. Dabei wird Kopf und Fuß des Hauptbericht beibehalten. Elemente des Unterberichts werden einzeln in den Hauptbericht geschrieben. Es wird nur die Y Position des Elements berücksichtigt. Die X Position ergibt sich durch die Positionierung der Elemente des Unterberichts. Ebenso sind Formatierungen des Elements wie z.B. Rahmen oder Breite und Höhe nur über den Unterbericht selbst möglich.Ist ein Unterbericht Teil einer Verknüpfung wird Limbas versuchen diese zu finden, aufzulösen und somit nur die verknüpften Datensätze in den Unterbricht zu schreiben. Um dies zu ermöglichen dürfen in einer Tabelle des Unterberichts die Listenelemente nicht mit dem „Liste“ Parameter versehen werden. Bei Unterberichten des Typs „Einhängen“ muß der Parameter „Liste“ gesetzt werden da ansonsten keine Verknüpfungs-Ergebnisse angezeigt werden. EigenschaftenEs können aber auch eigenen Parameter übergeben werden welche die Ergebnisse des Unterberichts erzeugen. get_gresult()Soll eine eigene Ergebnismenge für den Unterbericht benutzt werden kann dies durch Übergabe eines Arrays mit den Gewünschten IDs geschehen. Einhängen – erzeugt zuerst einen unabhängigen Bericht welcher dann in den Hauptbericht wie ein Bild eingehängt wird. Dies geschieht mittels fpdi. Formatierung sowie Kopf und Fuß können je nach Größe des Unterberichts variieren. Es wird die X und Y Position sowie die Größe des Elements berücksichtigt. Der Unterbericht wird dementsprechend verkleinert oder vergrößert. Dynamische Filter oder Parameter sind derzeit nicht möglich. Beispiel Parameter Parameter $filter["anzahl"][$gtabid] = "all"; $filter["nolimit"][$gtabid] = 1; $filter["order"][$gtabid][0] = array($gtabid,12,'DESC'); $gsr[$gtabid][12][0] = 'Meier'; Ergebnismenge return array(1,2,3,4,5); Html-Templates Beschrieben unter Html-Templates. Voraussetzung hierfür ist ein Bericht des Formats tcpdf. Es können eigene CSS-Klassen übergeben werden um das generierte Html eines Dateninhalts zu stylen: ${->Kunde->Name[class=border-red]} Diese Klassen müssen in einer css-Datei unter EXTENSIONS/css definiert sein. Die Datei muss im Berichtseditor oben rechts bei „css Datei“ eingetragen sein. Damit werden die Dateninhalte durch ein span-Element mit der angegebenen Klasse umschlossen. Falls statt einem span ein anderes Element (z.B. div) gewünscht ist, kann dies auch übergeben werden: ${->Kunde->Name[class=border-red][element=div]} Template-Gruppen Oft teilt ein großer Teil der Briefe das gleiche Layout und nur ein kleiner Teil wird ausgetauscht, z.B. Text-Inhalt oder wessen Unterschrift unten im Brief platziert wird. Für jeden unterschiedlichen Brief müsste ein eigener Limbas-Bericht erstellt werden. Gruppen-Platzhalter im Wysiwyg-Editor ${{GruppenName}} bzw. <lmb type="group" name="GruppenName" /> Template-Gruppen vereinfachen dieses Szenario. Es wird nur ein (Grund-)Bericht angelegt, in welchem ein Template-Gruppen-Tag (doppelte geschweifte Klammern, siehe oben) vorkommt. Dieses Tag steht für einen von mehreren Datensätzen der Template-Tabelle (also Text/Html) die zu der angegebenen Gruppe zugewiesen wurden. Soll der Bericht gedruckt werden, wird das Gruppen-Tag erkannt und der Nutzer kann den gewünschten Datensatz der Gruppe auswählen. Ein Datensatz einer Gruppe kann dabei auch selbst wieder Gruppen-Tags enthalten. ${{GruppenName[desc=Beschreibung][id=eindeutige_id]}} bzw. <lmb type="group" name="GruppenName" title="Beschreibung" id="eindeutige_id" /> Hinter dem Gruppennamen kann eine leserliche Beschreibung des Gruppen-Tags angefügt werden. Diese wird anstelle des Gruppennamens im Druck-Menü angezeigt. Kommen in einem Bericht mehrere Tags der selben Gruppe vor, muss eine eindeutige ID pro Tag vergeben werden um eine korrekte Auflösung der Gruppen zu gewährleisten. Dynamische Daten Dynamische Daten-Platzhalter im Wysiwyg-Editor Sollen in einem Bericht anstelle von Inhalten aus der Datenbank lieber freie Texte angezeigt werden, die der Nutzer vor dem Drucken des Berichts noch eingeben kann, wird folgende Platzhalter-Syntax verwendet: ${"Beschreibung des Textes"} bzw. <lmb type="dynamicData" title="Beschreibung des Textes" /> Eingabe-Feld in der Berichtsvorschau Beim Drucken wird dann die Beschreibung mit einem Textfeld angezeigt. Der Wert der in das Textfeld eingetragen wird, erscheint im Bericht anstelle des Platzhalters. ${"Beschreibung"[type=text]} bzw. <lmb type="dynamicData" title="Beschreibung" data-type="text" /> Der Typ der Daten kann als Option mitgegeben werden. Neben dem Standard Text (text) kann auch die Eingabe einer Zahl (number) oder eines Datums (date) eingestellt werden. Die Syntax der eingegebenen Werte wird dadurch automatisch validiert. ${"Beschreibung"[type=select][select_id=42]} bzw. <lmb type="dynamicData" title="Beschreibung" data-type="select" data-select_id="42" /> Außerdem können mit dem Typ select Werte aus einem Limbas-Pool zur Auswahl gestellt werden. ${"Beschreibung"[type=extension][function=selectUser]} bzw. <lmb type="dynamicData" title="Beschreibung" data-type="extension" data-function="selectUser" /> Das System kann beliebig erweitert werden. In diesem Beispiel wird die Funktion report_selectUser (gespeichert in einer ext_report.inc Datei) aufgerufen. Die Funktion ist dann dafür zuständig, den Kontextmenü-Eintrag darzustellen. Am einfachsten geht das mit den pop_*-Funktionen aus der limbas_src/lib/context.lib, z.B. pop_input2 für ein Textfeld oder pop_select für ein Selectfeld. Möchte man freies Html anzeigen, kann folgendes Schema verwendet werden: function report_name($name, $desc, $options) { pop_left(); // echo ... pop_right(); } Die Funktion muss 3 Parameter empfangen: $name Der erste Parameter ist der Name des input/select, den die Funktion darstellen soll. Stellt die Funktion kein input/select dar, sollte ein <input type="hidden" name="$name"> verwendet werden. $desc Der zweite Parameter ist die Beschreibung, die der Nutzer im Platzhalter angibt. Sie sollte dargestellt werden damit klar ist, um welchen Tag es sich handelt. $options Der dritte Parameter ist ein assoziatives Array aller Optionen des Platzhalters. So kann die Erweiterung flexibel gestaltet werden. Seitenumbruch Aus dem Html heraus kann man so einen Seitenumbruch erzwingen: <br pagebreak="true"> Da der Wysiwyg-Editor ihm unbekannte Attribute wie „pagebreak“ rausfiltert, ist es einfacher in den Erweiterungen eine Template-Funktion zu erstellen und diese dann aus dem Template-Element aufzurufen: function report_pagebreak() { return '<br pagebreak="true">'; } beliebiges Html ${=pagebreak()} beliebiges Html auf neuer Seite Hintergrundbild Aus dem Template heraus kann ein Hintergrundbild für den Bericht gesetzt werden. Es wird auf jeder Seite des Berichts im Hintergrund sein. Der erste Parameter ist entweder die Limbas Datei-ID oder ein Pfad im Limbas DMS. Es werden Bilder und PDFs unterstützt: ${=background(42)} ${=background("öffentlicher Ordner/Dokumente/Berichtsvorlage.png")} ${=background("öffentlicher Ordner/Dokumente/Berichtsvorlage.pdf")} Es folgen 4 optionale Parameter (x, y, width, height) zur Positionierung und Größe. X und Y geben die Position des Bildes ab der oberen linken Ecke des Berichts an. Wenn einer nicht angegeben wird (-1), wird automatisch der Abstand zum Rand genommen, welcher im Limbas-Bericht eingestellt ist. Möchte man das Bild ohne Abstände seitenfüllend anzeigen, kann man x und y auf 0 setzen. Width und Height geben die Breite/Höhe des Bildes an. Wenn hier ein Parameter nicht angegeben wird (-1), wird er so berechnet, dass das Bild zentriert auf der Seite steht. ${=background(42)} // zentriert auf Seite mit Abstand zum Rand ${=background(42, 0, 0)} // füllt Seite komplett ${=background(42, 0, -1, -1, 200)} // links und rechts bündig mit Seite, Abstand oben, Höhe 200 ${=background(42, 200, 400)} // kleines Kästchen in der Mitte der Seite Ist bei dem Limbas-Bericht ein Abstand (page margin) gesetzt, kann ein Bild leider nicht auf die volle Breite skaliert werden. Es muss dann ein PDF als Hintergrund gewählt werden. Diagramme Ein Diagramm kann über die Werkzeugleiste und dem entsprechendem Diagrammsymbol eingebunden werden. Dabei muß vor dem Einfügen das Diagramm aus der Auswahlliste ausgewählt werden. Diagramme werden grundsätzlich aus dem gesamten Ergebnis der zugrundeliegenden Abfrage erstellt. Soll das Diagramm nach dem zu erstellenden Bericht gefiltert werden können die Filter über in die Parameter im Kontextmenü eingetragen werden. Es ist dabei möglich die Parameter $extension, $gsr und $filter zu übergeben. Sie haben die gleiche Struktur wie die get_gresult Funktion. Beispiel Parameter Das Beispiel filtert die Abfrage des Diagramms mit der ID 11 durch das Feld mit der ID 2 und dem Wert der Datensatz $ID mit dem der Bericht aufgerufen wurde sowie das Feld der ID 2 mit dem festen Wert ‚2019‘. siehe auch $gsr oder $extension $gsr[11][1][0] = $ID; $gsr[11][2][0] = '2019'; oder $extension['where'][0] = "MYID = $ID AND YEAR = '2019'"; Formeln & Funktionen Berichte können mit eigenen Funktionen oder Berechnungen erweitert werden. Ebenso kann direkt mit Hilfe der fpdf-Funktionen auf den Bericht Einfluss genommen werden. Umgesetzt werden kann dies mit Hilfe des Formel-Elements welches PHP Code enthalten kann. Formel-Elemente können als Einzelelemente oder auch in Tabellen genutzt werden. Styledefinitionen 0 = font-family; 1 = font-style; 2 = font-variant; 3 = font-size; 4 = font-weight; 5 = word-spacing; 6 = letter-spacing; 7 = text-decoration; 8 = text-transform; 9 = color; 10 = text-shadow; 11 = line-height; 12 = text-align; 13 = (border) 14 = border-style; 15 = border-color; 16 = border-width; 17 = border-left; 18 = border-right; 19 = border-top; 20 = border-bottom; 21 = background-color; 22 = cellpadding; 23 = vertical-align; 24 = opacity; Zusatz-Style 25 = line-reverse; 26 = prop (proportional); 27 = head; 28 = foot; 29 = hidden; 30 = report_tab_rows; 31 = report_tab_cells; 32 = background; 33 = list; 34 = pagebreak; 35 = lock pagebreak; 36 = relativepos; 37 = colspan; 38 = rowspan; 39 = display if element; 40 = seperator of multible table-row elements; 41 = tagmode; 42 = html; 43 = writing-mode auf Variablen zugreifen Auf Inhalte von Elementen im Bericht (auch versteckten) kann über das Formel-Element zugegriffen werden. Einzelelement: $glob_el[elid][number] elid: Die eindeutige Element-ID. Ist über das Kontextmenü als erster Punkt „Element“ bei klick auf ein Element ersichtlich. number: Die Element-Nummer. Aufsteigende Nummer beginnend mit „0“. Falls mehrere Werte vorhanden (Aus Verknüpfung) kann hier die Reihennummer gewählt werden, ansonsten immer „0“. Tabellenelement: $glob_rowel[elid][$ROWNR] elid: Die eindeutige Element-ID. Ist über das Kontextmenü als erster Punkt „Element“ bei klick auf ein Element ersichtlich. $ROWNR: Die Tabellen-Zeile. Aufsteigende Nummer beginnend mit „0“. Es kann direkt die Variable „$ROWNR“ genutzt werden um auf Elemente der Gleichen Zeile zuzugreifen. Elementstyle bearbeiten: $report['style'][$report['arg_result'][elid]][styleid] = 1; elid: Die eindeutige Element-ID. Ist über das Kontextmenü als erster Punkt „Element“ bei klick auf ein Element ersichtlich. styleid: Die Style-Nummer. Die Nummer des Styles, den man verändern möchte. Siehe oben. Funktionen Die Rückgabe von Werten über Formel-Element wird durch „return“ oder durch die Variable „$arg_result“ definiert. Es können auch eigene Funktionen aufgerufen werden. Beispiele Beispiel 1 – freie Inhalte Ein Rechnungsbericht hat unter anderem die Elemente (Name, Vorname und Anrede) für die Adresszeile. Im Bericht soll eine spezifische Anrede genutzt werden. Die Elemente haben die folgenden IDs : Name:1; Vorname:2; Anrede:3. Es wird ein neues Formel-Element mit folgendem Inhalt hinzugefügt: if($glob_el[3][0] == 'Frau'){ $arg_result = "Sehr geehrte Frau ".$glob_el[2][0]; }elseif($glob_el[3][0] == 'Herr'){ $arg_result = "Sehr geehrter Herr ".$glob_el[2][0]; }else{ $arg_result = "Sehr geehrte Damen und Herren"; } Beispiel 2 – Häckchen einbinden Boolean-Felder werden standardmäßig als 1 oder 0 dargestellt. Mit einem Trick können auch Häckchen angezeigt werden.Dazu muß in den Limbas Zeichensatzeinstellungen ein „Dingbats / Symbol“ Font intalliert werden. Dieser Font wird dann als Font für das Booleanfeld ausgewählt. Um das richtige Zeichen für das Häckchen auszuählen muß im Erweiterungsfenster des Kontextmenüs (edit) das Zeichen über eine Variable definiert werden. Für den „Webdings“ Zeichensatz ist das „a“ für ein Häckchen und „r“ für ein X. Für „Zapf Dingbats“ ist „3“ oder „4“ für ein Häckchen und „5“ oder „6“ für ein X. Es kann jeweils ein Zeichen für ja und nein gesetzt werden. $dingbats_char_on = "a"; $dingbats_char_off = "r"; Beide Variablen können auch in der Berichsterweiterung (ext_report.inc) global gesetzt werden. $GLOBALS["dingbats_char_on"] = "4"; Beispiel 3 – Rechnen Berechnung eines Wertes über eine eigene Funktion. Es kann das ganze Elemnt-Array „$glob_el“ übergeben werden. Die Funktion „getMyExtZF()“ kann über die Skript-Erweiterungen hinzugefügt werden. return getMyExtZF($glob_el); Die Funktion getMyExtZF summiert dann als Beispiel die Inhalte des Feldes der ID 1: getMyExtZF($glob_el){ return array_sum($glob_el[1]); } Beispiel 4 – Rechnen in Tabellenzeile Berechnung des Bruttowertes von Rechnungspositionen einer Berichts-Tabelle. Es existiert ein Tabellenelement des Nettowertes mit der Element-ID 12 in der gleichen Zeile wie das Formelelement $arg_result = ($glob_rowel[12][$ROWNR]*1.19); Beispiel 5 – Summieren in Tabelle Berechnung der Summe von Rechnungspositionen einer Berichts-Tabelle. $arg_result = number_format(array_sum($glob_rowel[12]),'2',',','.')." €"; Beispiel 6 – Tabellenzeile ausblenden Tabellen-Zeile bei Bedingung nicht anzeigen: if($glob_rowel[4][$ROWNR] > 100){ $arg_result="#HIDEROW"; } Beispiel 7 – Tabellenzellen formatieren Eine Tabellenzelle kann auf zwei Arten formatiert werden. Die einfachste Art ist den Inhalt der Zelle mit eigenen HTML TAGs zu ergänzen die im Vorfeld definiert werden müssen. Das Beispiel verwendet das Formelelement und erweitert den Inhalt der Zelle um ein einschließendes „<com1>“ TAG. Für das Zellenelement muß der „tagmode“ aktiv sein! Der Typ des Zelleninhalts sollte TEXT und nicht Zahl sein damit die Tags korrekt interpretiert werden können. Insbesondere wenn keine Tags vorhanden sind würde ein trim() langen. $pdf->SetTagStyle("com1","arial","I",11,"0,151,200"); $pdf->SetTagStyle("bold1","arial","B",11,"0,151,200"); $pdf->SetTagStyle("del1","arial","BI",11,"0,151,200"); $arg_result = "hallo <com1>".$glob_rowel[12][$ROWNR]."</com1>, <bold1>this is bold</bold1> "; Eine weitere Möglichkeit besteht in dem Überschreiben der Style Definition der Zelle. Dies gilt allerdings nur für die gesamte Zelle und nicht für Teile wie im obigen Beispiel. Das Arrayelement [21] bezeichnet im folgenden Beispiel den Style der ID 21 also die Hintergrundfarbe. Dieses Beispiel berechnet zuerst den aktuellen Zeilenindex. Danach wird für jede Spalte (in diesem Fall giebt es 2 Spalten) eine neue intergrundfarbe gesetzt. Zusätzlich wird die aktuelle Zeile geprüft und anhand des Zeilenindex die Farbe ausgewählt.Der erste Schlüssel des Arrays „$cell_style“ ist die Spaltennummer beginnend mit 1. Der zweite Schlüssel des Arrays „$cell_style“ ist die Elementnummer inerhalb einer Zelle, also bei einem Element in einer Zelle die [1]. Der dritte Schlüssel des Arrays „$cell_style“ ist die Reihennummer berechnet durch „$row = count($cell_value[$bzm3][$bzm4])“ Der vierte Schlüssel des Arrays „$cell_style“ ist die Stylenummer. (siehe Styledefinitionen) $row = count($cell_value[$bzm3][$bzm4]); for($column=1;$column<=2;$column++){ if($row == 0 OR $row == 2 OR $row == 4){ $cell_style[$column][1][$row][21] = 'FFFFD2'; }elseif($rownr != 0){ $cell_style[$column][1][$row][21] = 'E1E1F0'; } } Beispiel 8 – abwechselnde Hintergrundfarbe pro Zeile In der entsprechenden Zeile muß in eine beliebige Zelle eine Formel hinzugefügt werden welche die Farbe der einzelnen Zellen entsprechend anpasst. if(($ROWNR-$current_row) % 2 != 0){ for($mE=1; $mE <=$report_tab_cells;$mE++) $cell_style[$mE][1][$ROWNR-$current_row][21] = 'F3F3F3'; } Beispiel 9 – Tabelleninhalte filtern und sortieren Das Ergebnis einer Tabelle eines Berichts kann zusätzlich gefiltert werden. Dazu wird über das Array „$extensions“ zusätzliche Parameter an den SQL Aufruf gegeben. Diese Array wird wird für das erste Element der Zeile einer Tabelle mit den Datenbankeinträgen, also die Zeile die sich als Liste mit den Datenbankinhalten füllt in das Erweiterungstextfeld geschrieben. Das Erweiterungstextfeld ist über das Kontextmenü im Punkt Edit aufrufbar. Das folgende Beispiel sortiert die SQL Abfrage zusätzlich nach Name. $extension["select"][0] = "ADDRESSES.NAME"; $extension["where"][0] = "ADDRESSES.NAME = 'Hans'"; $extension["where"][1] = "CUSTOMER.NAME = ADDRESSES.NAME"; $extension["from"][0] = "ADDRESSES"; $extension["order"][0] = "ADDRESSES.NAME DESC"; siehe auch Abfrage Erweiterungen Beispiel 10 – PDF anhängen Eine Seite eines weiteres PDF Dokuments an Position X/Y anhängen. Sollen alle Seiten angehängt werden kann als $page ‚all‘ übergeben werden. append_pdf($pdf,$file='path to file',$page=1,$posx=0,$posy=0); Beispiel 11 – Bericht anhängen Einen weiteren Bericht mit der Bericht-ID 6 anhängen. Kopf und Fuß werden vom ersten Bericht übernommen und in den Folgeberichten ignoriert append_report(6,$ID); Beispiel 12 – Unterbericht als Extension einbinden Die einfachste Art einen Unterbericht einzubinden geschieht über die Funktion „append_subReport()“ im Formelelement. Die Größe und Rahmen des Berichts richtet sich nach der Positionierung und Formatieren des Formelelements im Bericht. Durch das Setzen der Höhe oder Breite auf true wird der Unterbericht entweder auf die Y oder X Achse, ansonsten auf die absolute Höhe und Breite des Formelelements skaliert. Das Beispiel bindet einen Bericht der ID 14 mit variabler Breite und fester Höhe ein. $report_id = 14; $h=true; append_subReport($pdf,$report,$ID,$el,$report_id,$h,$w); Eine Alternative dazu ist die direkte Verwendung der Funktion zur Einbindung von Grafiken welche auch PDFs unterstützt. Die Erstellung des Unterberichts kann über LIMBAS oder eine eigene Erweiterung erfolgen. Ebenso können Statische PDFs eingebunden werden. Dabei enthält die hier verwendete Variable $report[„tab_size“][$el] den Pfad der einzubindenden PDF Datei. $report_id = 14; $report_rename = "temp1.pdf"; $subreportfile = generate_pdf($report_id,$ID,$report_output,$report_rename); $report["tab_size"][$el] = $subreportfile; $report["height"][$el] = 0; print_bild($pdf,$ID,$report,$el); return; Beispiel 13 – Diagramme als Extension einbinden Auf gleiche Weise werden Diagramme eingebunden. Diagramme werden in LIMBAS über ein Template erstellt. Dieses Template muss eine Grafik mit dem Namen „USER/“.$session[‚user_id‘].“/temp/chart_[$chart_id].png“ generieren wobei $chart_id die Giagramm-ID ist. Die Größe und Rahmen des Diagramms richtet sich nach der Positionierung und Formatieren des Formelelements im Bericht. Durch das Setzen der Höhe oder Breite auf true wird der Unterbericht entweder auf die Y oder X Achse, ansonsten auf die absolute Höhe und Breite des Formelelements skaliert. Das Beispiel bindet eine Diagramm der ID 12 mit variabler Höhe und fester Breite ein. $chart_id = 12; $w=true; append_subChart($pdf,$report,$ID,$el,$chart_id,$h,$w); Eine Alternative dazu ist die direkte Verwendung der Funktion zur Einbindung von Grafiken. Die Erstellung der Grafik kann über ein Diagramm Template oder eine eigene Erweiterung erfolgen. require_once('EXTENSIONS/generateMyChart.php'); # eigenes Template $mychartfile = printMyChart(); # eigene Funktion if(file_exists($mychart)){ $prv = array( $mychartfile, $report["posx"][$el], $report["posy"][$el], $report["width"][$el], $report["height"][$el], $report["style"][$el], 'bild'); $pdf->print_element($pdf->printcell($prv)); } Beispiel 14 – Externe Datenquelle Es ist möglich für Berichts-Tabellen eine externe Datenquelle anstatt einer Limbas Datenbank-Tabelle anzugeben. Dazu müssen als Platzhalter für die gesamte Zeile Elemente von Typ ‚Formel‘ in die entsprechenden Tabellenzellen hinzugefügt werden. Wichtig ist das diese Elemente den Parameter „Liste“ aktiviert haben. Hat das Element diesen Parameter nicht wird es als normale Formel interpretiert. Das erste Formelelement von Links beinhaltet den Namen der Funktion aus welcher die Daten kommen sollen. (z.B. <myExt_getMyData>) Diese kann als Erweiterung in dem Erweiterungsscript „ext_reports.inc“ erstellt werden. Den Funktionsnamen nur als Text ohne () oder Semikolon angeben. Übergabewerte werden automatisch mit übergeben. Die Werte werden aufsteigend von Links nach Rechts interpretiert. Dabei ist es gleichgültig an welcher Stelle in der Tabellenzeile sie sich befinden. Die Funktion muß ein Array mit folgender Struktur zurückgeben. Array ( [0] => Array ( [0] => line-1-0 [1] => line-2-0 [2] => line-3-0 ) [1] => Array ( [0] => line-1-1 [1] => line-2-1 [2] => line-3-1 ) [2] => Array ( [0] => line-1-2 [1] => line-2-2 [2] => line-3-2 ) ) Folgende Funktion würde in unserem Beispiel aufgerufen: myExt_getMyData($ID,$report_id,$report_tab,$report,$report_tab_cells,$bzm2,$rowid) Übergabewerte: $ID $report_id $report_tab $report $report_tab_cells $bzm2 $rowid OpenOffice Eine weitere Alternative, Berichte mit LIMBAS zu generieren, ist das Berichtsmodul für .odt Dokumente Mit dieser Erweiterung lässt sich ein OpenOffice-Dokument aus einer schon vorhandenen PDF-Vorlage erstellen. Dazu wird der Bericht zuerst als XML geschrieben, womit dann letztendlich die Vorlage ergänzt wird.Um einen .odt Dokument zu generieren, benötigen wir eine Vorlage, die selbst ein .odt Dokument ist. Wir definieren lediglich die Platzhalter, die später ersetzt werden sollen. Zur Übersicht können wir uns den Bericht als XML ausgeben lassen und die Namen mit den Platzhaltern vergleichen. Danach speichern wir es im LIMBAS-Dateimanager in einem beliebigen Verzeichnis und wählen es im Admin-Bereich der Berichtsübersicht als Office-Vorlage aus. Bei Änderungen am Template kann das Template direkt im Dateimanager ausgewechlselt werden.Es müssen alle Felder die im Template benötigt werden auch in der Limbas-Berichtvorlage vorhanden werden. Dabei wird die Positionierung und Formatierung der Elemente nicht berücksichtigt, wohl aber Verknüpfungen oder Listen. Es kann auch auch ein als PDF vorgesehener Bericht als Berichtvorlage genutzt werden und so zwischen dem PDF und odt Format gewechselt werden.Zu beachten ist das die Vorlagen weitestgehend eigenhändig und weniger mit copy&paste aus anderen Dokumenten gefüllt werden. Ansonsten besteht die Gefahr das das Dokument nicht mehr von Limbas generiert werden kann. Beispiel Template Platzhalter: ${zeit_von} - ${zeit_bis} Land: ${land} Ort: ${ort} PLZ: ${plz} ${positionen:name} ${positionen:preis} # für Tabellenausgaben Hier die zugehörige XML-Ausgabe: <report name=“Chronik“> <item id=“1“> <text name=“zeit_von“>17.10.1977</text> <text name=“zeit_bis“>22.10.1977</text> <text name=“land“>Schweiz</text> <text name=“ort“/> <text name=“plz“>12356</text> </item> </report>