Scripting Bedingter Seitenumbruch
Siehe JavaScript und FormCalc Scripting im LiveCycle Designer.
Oft soll in einem Formular ein Seitenumbruch ausgelöst werden, wenn in einem Loop ein neuer Datensatz aufgerufen wird, auch wenn der Inhaltsbereich (MAIN) noch nicht komplett gefüllt ist. Dieser Loop kann über ein Teilformular gehen oder über ein Tabellenobjekt.
Ausgangsstellung
Hier gibt es ein Teilformular "ObjektTab", über den eine Ausgabe von Objekten erfolgt. Jedes neue Objekt soll auf einer neuen Seite ausgegeben werden.
Reiter Paginierung
Platzieren: Nach vorherigem
Standardmäßig wird der Platz im Inhaltsbereich (traditionell MAIN-Bereich) einer Seite weiter genutzt, solange Platz ist. Diese Einstellung wird auf der Palette "Objekt" und dem Reiter "Paginierung" vorgenommen. Hier ist die Standardeinstellung
- "Platzieren: Nach vorherigem" und
- "Nach: Übergeordnet weiter füllen".
Platzieren: Nächster Inhaltsbereich
Der Lösung kommt man näher, wenn man "Gehe zum nächsten Inhaltsbereich" wählt. Dies bewirkt, dass nach jedem komplett abgearbeiten Teilformular "ObjektTab" eine neue Ausgabeseite erzeugt wird.
Angenommen die Tabelle unter "ObjektTab" hat 4 Datensätze, dann wird nach dem Datensatz ein neuer Inhaltsbereich geöffnet. Das passt für die ersten 3 Datensätze, allerdings nicht für den letzten Datensatz der Tabelle. Hier erhält man eine leere Ausgabeseite, die lediglich aus den Masterdaten besteht. Diese Vorgehensweise ist also keine Lösung.
Wenn man "Platzieren: Nächster Inhaltsbereich" wählt, dann verschiebt sich das Problem auf die erste Ausgabeseite. Dann hat man hier als erste Seite eine Seite, die lediglich aus den Masterdaten besteht.
Lösung mit Scripting bedingtem Seitenumbruch
Daher muss man hier mit bedingten Seitenumbrüchen arbeiten. Dafür hat der Adobe LiveCycle Designer schon vorgedacht und stellt einen Assistenten bereit.
Zunächst setzt man die Markierung auf das Teilformular, über das geloopt wird.
Dann klickt man Unter den Reitern "Objekt - Paginierung" auf "bearbeiten".
Ein leeres Fenster öffnet sich. Mit dem "+" fügt man eine neue Bedingung hinzu.
JavaScript wird als Sprache ausgewählt.
Mit der Schaltfläche öffnet sich ein Fenster, wo man eine Variable auswählen kann, auf die geprüft wird.
Lösung 1: Bedingter Seitenumbruch (Prüfung auf Zahl Datensätze)
Eleganter als die zweite Lösung, wo auf ein Feld der Tabelle abgeprüft wird, ist es noch mit einem Script
this.instanceManager.count>this.instanceIndex+1
- this.instanceManager.count = Anzahl der Datensätze in der Tabelle
- this.instanceIndex = Aktueller Index der Schleife (Zählung beginnt bei 0)
Der Umbruch wird auf "Nach" gestellt.
Angenommen es gibt 3 Datensätze und die Tabelle wird durchlaufen
- this.instanceManager.count = 3, this.instanceIndex+1 = 1 ==> Bedingung erfüllt: Neue Seite
- this.instanceManager.count = 3, this.instanceIndex+1 = 2 ==> Bedingung erfüllt: Neue Seite
- this.instanceManager.count = 3, this.instanceIndex+1 = 3 ==> Bedingung nicht erfüllt: Keine neue Seite
Somit wird vermieden, dass beim letzten Datensatz der Tabelle eine schließende leere Seite erzeugt wird.
Lösung 2: Bedingter Seitenumbruch (Prüfung auf Feld Tabelle)
Hier wird auf ein Feld der Tabelle abgeprüft. In diesem Feld VLD05. Mit dem Assistenten kann das Feld ausgewählt werden.
Als Folge soll dann ein Umbruch vor der Seite auf den nächsten Inhaltsbereich erfolgen.
Es wurde ein Coding erzeugt
if (this.resolveNode("ObjektTab[-1].FLD05") != null) { this.resolveNode("ObjektTab[-1].FLD05").rawValue != ObjektTab.FLD05.rawValue }
Hier ist allerdings noch ein Fehler im generierten Code, da der Assistent nicht beachtet, dass das Feld FLD05 nicht direkt unter dem Teilformular "ObjektTab" sich befindet, sondern ein weiteres Teilformular "Objekt", unter dem dann das Feld FLD05 gespeichert ist. Der Code muss also um das Teilformular "Objekt" ergänzt werden.
if (this.resolveNode("ObjektTab[-1].Objekt.FLD05") != null) { this.resolveNode("ObjektTab[-1].Objekt.FLD05").rawValue != ObjektTab.Objekt.FLD05.rawValue }
Nicht vor dem ersten Datensatz soll die Bedingung greifen(if (this.resolveNode("ObjektTab[-1].Objekt.FLD05") != null), aber vor jedem weiteren Datensatz, wo der Wert "Objekt.FLD05" ungleich ist zum vorherigen Datensatz "Objekt.FLD05".
Dann funktioniert der Seitenumbruch wie gewünscht.
Es sollte allerdings die Lösung 1. bevorzugt werden. Das Coding ist kürzer und, besser verständlich und unabhängig von einzelnen Feldern der Tabelle.
Dokumentation Scripting
Man sollte im Formular einen Hinweis darauf geben, dass hier mit dem Assistenten Scripting für den bedingten Seitenumbruch eingefügt wurde. Sonst ist diese Codingstelle schwer zu finden, sofern ein Entwickler diese Stelle nicht selbst programmiert hat.
Mit dem Präfix "scr" verweist man auf Scriptingcode in dem Teilformular und im Teilformular wird der Kommentar dann in JavaScript oder FormCalc mit den führenden Zeichen "//" eingefügt.
//Bedingter Seitenumbruch durch JavaScript-Coding unter Reiter "Objekt - Paginierung", mit Schaltfläche "Bearbeiten" //siehe https://www.berater-wiki.de/Scripting_Bedingter_Seitenumbruch#L.C3.B6sung_1:_Bedingter_Seitenumbruch //this.instanceManager.count>this.instanceIndex+1 //this.instanceManager.count = Anzahl der Datensätze in der Tabelle //this.instanceIndex = Aktueller Index der Schleife (Zählung beginnt bei 0)
Web-Links
Literatur
- Adobe LiveCycle® Designer ES2 und SAP Interactive Forms: Scripting für Nicht-Programmierer, S. 131ff., von Ulrich Bähr