Scripting Bedingter Seitenumbruch

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

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.

BedingterSeitenumbruch11.jpg

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

BedingterSeitenumbruch2.jpg


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.

BedingterSeitenumbruch3.jpg

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.

BedingterSeitenumbruch5.jpg


Dann klickt man Unter den Reitern "Objekt - Paginierung" auf "bearbeiten".

BedingterSeitenumbruch4.jpg


Ein leeres Fenster öffnet sich. Mit dem "+" fügt man eine neue Bedingung hinzu.

BedingterSeitenumbruch6.jpg


JavaScript wird als Sprache ausgewählt.

BedingterSeitenumbruch7.jpg

Mit der Schaltfläche BedingterSeitenumbruch8.jpg ö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)

BedingterSeitenumbruch12.jpg

Der Umbruch wird auf "Nach" gestellt.

Angenommen es gibt 3 Datensätze und die Tabelle wird durchlaufen

  1. this.instanceManager.count = 3, this.instanceIndex+1 = 1 ==> Bedingung erfüllt: Neue Seite
  2. this.instanceManager.count = 3, this.instanceIndex+1 = 2 ==> Bedingung erfüllt: Neue Seite
  3. 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.

BedingterSeitenumbruch9.jpg

Als Folge soll dann ein Umbruch vor der Seite auf den nächsten Inhaltsbereich erfolgen.

BedingterSeitenumbruch10.jpg

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.

Seitenumbruch11.JPG


Seitenumbruch12.JPG

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