Scripting Formularobjekte adressieren

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Möchte man Objekte in einem Formular ansprechen, dann muss die Laufzeitumgebung konkret wissen, welches Objekt man meint. Um diese Objekte (Variablen, Teilformulare, Seiten, Textfelder etc.) anzusprechen, gibt es verschiedene Möglichkeiten.

Ausdruck "this" / "$"

Eigenes Objekt

Am einfachsten ist es, wenn ein Objekt angesprochen wird, in dem das Coding sich befindet. Es wird in Java-Script eine Selbstreferenz mit "this" erzeugt.

if(this.rawValue==null)  //Java-Script
  this.presence = "hidden";

oder in Form-Calc

if $ == Null  //Form-Calc (oder $.rawValue)
 $.presence = "hidden"

Diese Schreibweise ist sehr komfortabel, schnell und funktioniert auch, wenn ein Objekt umbenannt oder verschoben wird oder wenn das Coding kopiert und an anderer Stelle (bzw. in einem anderen Formular) eingefügt wird. Diese Schreibweise sollte man daher nach Möglichkeit immer verwenden.

Übergeordnetes Objekt

Sehr komfortabel ist es das Objekt anzusprechen, was in der Hierarchie übergeordnet ist. Meist wird dies ein Teilformular sein. Dies kann mit dem Zusatz "parent" bezeichnet werden. Man muß nicht den Namen des übergeordneten Objektes angeben.

Hier wird z. B. das übergeordnete Teilformular (mit allen Objekten, die darunter liegen) ausgeblendet.

this.parent.presence = "hidden";  //Java-Script

oder

$.parent.presence = "hidden"     //Form-Calc

Man kann auch mehrere Stufen in der Hierarchie nach oben gehen. Die Hierarchie ist immer eindeutig. Ein untergeordnetes Objekt kann immer nur ein direkt übergeordnetes Objekt haben.

this.parent.parent. ...

Sehr interessant ist auch, dass man mit "parent" zum übergeordneten Objekt navigieren kann und in Bezug auf dieses Objekt auch wieder nach unten in der Hierarchie.

this.parent.unterteilformular2.textfeld2.rawValue = ...;

Zum Beispiel

if ($.parent.parent.Ueberschriften.X5.rawValue == null) then  //Form-Calc
 $.presence = "hidden"
endif

xfa.resolveNode (Objekt absolut ansprechen)

Mit dem Befehl "xfa.resolveNode" kann man auch Objekte im Formular direkt ansprechen, ohne die Hierarchiebeziehung des Objektes im Hierarchiebaum zu kennen. Das Objekt (z. B. Teilformular oder Textfeld) muss einen eindeutigen Namen im Hierarchiebaum haben, der nicht mehrfach vorkommt.

Hier wird das Textfeld "TextField1" mit einem Wert versorgt.

xfa.resolveNode("TextField1").rawValue = "Hello";

Von dieser Möglichkeit sollte man aus Performancegründen jedoch sparsam (oder gar nicht) gebrauchen. Während der Laufzeit muss der Hierarchiebaum durchsucht werden, um das Objekt in der Hierarchie zu finden. Dies kostet wertvolle Performance. Gerade bei großen und komplexen Formularen sollte xfa.resolveNode daher nicht genutzt werden.

xfa.record (Kontextobjekt)

Manchmal will man eine Variable direkt im Kontext ansprechen.

Z. B. hier eine boolesche Variable, die anzeigt, ob eine Krankenkassenseite ausgegeben werden soll oder nicht. Sie ist nur zur Steuerung nötig und ansonsten wird diese Variable nicht im Formular ausgegen. Insofern ist sie nicht im LiveCycle Designer nötig.

Über den Befehl "xfa.record.<variable>.value" lässt sich eine Variable im Kontext auslesen. Zu beachten ist hier, dass man die Variable im Kontext nicht mit "<variable>.rawValue" anspricht, sondern mit "<variable>.value".

Hier ein Beispiel mit JavaScript.

if (xfa.record.GV_KRANKENKASSE.value == "X")
{
  this.presence = "visible";
}
else
{
  this.presence = "hidden";
}

Man muss hier allerdings vorsichtig sein, dass das Kontextobjekt wirklich existiert und auch nicht nur durch Bedingungen ausgeschaltet wird. Sonst funktioniert das Coding in der Routine nicht mehr.

Es wäre also keine gute Idee dies zu tun:

Scriptdebugging7.jpg


Dann sollte man besser das Scripting umstellen und nach der gesetzten booleschen Variable abfragen. Dann braucht man an die Variable im Kontext keine Bedingung auf sich selbst einfügen.

SOM-Ausdruck

Oftmals möchte man jedoch auch Objekte ansprechen, die nicht im selben Ereignisobjekt sich befinden. Man hat dann die Wahl, entweder einen absoluten (kompletten) Pfad einzugeben oder einen relativen Pfad in Bezug zum Objekt, in dem der geschriebene Code sich befindet.

Der SOM-Ausdruck bezeichnet den Pfad zum Objekt in der Formularhierarchie. Der SOM-Ausdruck kann absolut (komplett) angegeben werden oder relativ. Die einzelnen Objekte im SOM-Ausdruck werden mit einem "." getrennt.

Absolute SOM-Ausdrücke

Der komplette hierarchische Pfad zum Objekt wird angegeben.

Seite.Teilformular1.Teilformular11.Teilformular111.Textfeld.rawValue = "Test";

Relative SOM-Ausdrücke

Ausgehend vom Objekt mit dem Coding wird der Pfad relativ nach unten angegeben. Hier befindet sich das Objekt "Textfeld" im Teilformular, in dem Coding ist.

Textfeld.rawValue = "Test";

Abwägung absolute und relative SOM-Ausdrücke

Eine absolute Pfadangabe hat mehrere Nachteile

  • Es ist mehr Schreibarbeit als die relative Angabe
  • Sobald innerhalb des Pfades ein Objekt umbenannt oder verschoben wird, wird das Coding nicht mehr funktionieren
  • Wenn Code von einem Formular zu einem anderen Formular oder oder innerhalb des Formulars kopiert wird, wird das Coding nicht funktionieren
  • Ein Fehler in der absoluten Pfadangabe ist schwerer zu entdecken als in der relativen Pfadangabe

Daher wird man in aller Regel die relative Pfadangaben wählen.

Web-Links

Literatur