Notation Eine Scriptvariable wird mit V[varname] bezeichnet, wobei varname ein frei wählbarer Name ist. Für den Namen gilt:

  • Nur Buchstaben, Ziffern und den Unterstrich "_" oder Bindestrich "-" verwenden und mit einem Buchstaben oder einer Ziffer beginnen lassen
  • Der Variablennamen unterscheidet Gross- und Kleinbuchstaben, d.h. V[X8] ist ungleich V[x8]

Tipp: Eine konsistente Namensgebung für die Variablen ist hilfreich. Zum Beispiel immer nur Kleinbuchstaben, bei Bedarf durch "_"  getrennt, etwa V[previous_account]. Oder mit Gross- und Kleinbuchstaben:
V[PreviousAccount]. Es ist günstig, alle zu einer bestimmten Transaktion gehörenden Variablen mit dem Transaktionscode oder einer entsprechenden Kennung für mehrere Transaktionen beginnen zu lassen, z.B. V[VA01_PreviousAccount] oder [VA_PreviousAccount].

Inhalt der Variablen Der Wert einer Variablen ist immer ein String. Der Wert wird eingesetzt, wenn in einer Scriptzeile ein Ausdruck &V[varname] erkannt wird. Erst nach Ersetzung aller Variablen wird die Anweisung interpretiert.
Systemvariablen Einige Variablen sind schon systemseitig vordefiniert. Ihr Name beginnt mit einem Unterstrich gefolgt von Kleinbuchstaben. Beispiele:

V[_user]
V[_client]
V[_transaction]
V[_host]
V[_database]

Sie finden eine ausführliche Liste der Systemvariablen in der Dokumentation: Systemvariablen.

Gültigkeit Die Variablen sind global innerhalb eines SAP GUI Modus gültig. Sie sind also sichtbar und behalten ihren Wert in allen anderen Scripten, die im gleichen Modus verarbeitet werden. Wenn der Benutzer eine neue SAP GUI Session beginnt,  z.B. durch direkte Eingabe des OK-Codes /OVA01, dann steht in dem neuen Modus ein neues Set von Variablen zur Verfügung.

Falls es einmal nötig sein sollte, Werte modusübergreifend zur Verfügung zu haben, können Sie mit Langtextvariablen und den Optionen toSharedText sowie fromSharedText der CopyText-Anweisung arbeiten. Häufiger kommt es vor, dass Parameter eines mit "/O..." aufgerufenen InputScripts im neuen Modus benötigt werden. Die Parameterübergabe in den neuen Modus erfolgt automatisch. Analog ist auch die Rückgabe von Werte aus einem aufgerufenen Modus möglich, siehe Anweisung "ReturnValues".

Zusätzlich kann Process verwendet werden, um Skripte modularer und strukturierter zu gestalten. Dabei ist es wichtig zu beachten, dass die Variablen innerhalb von Process-Skripten in einem lokalen Namensraum liegen. Beim Verlassen des Skripts werden diese Variablen freigegeben, sodass beispielsweise das aufrufende Skript keinen Zugriff mehr darauf hat. Es wird daher empfohlen, wenn möglich mit lokalen Variablen zu arbeiten, da so das Risiko verringert wird, unbeabsichtigt andere Variablen zu überschreiben. 

Variablen zuweisen Durch "Set" weisen Sie einer Variable einen Wert zu. Beispiel:

GuiXT

Set V[MM_init] "X"

Um einer Variablen den Wert einer anderen Variablen zuzuweisen, arbeiten Sie mit der &V[...]-Notation. Beispiel:

GuiXT

Set V[MM_nr2]  "&V[MM_nr1]"

Die Schreibweise

GuiXT

Set V[MM_nr2] &V[MM_nr1]    // !! nicht empfehlenswert !!

ist nicht zu empfehlen, denn falls der Wert der Variablen V[MM_nr1] ein Leerzeichen enthält, wird nur der erste Teil des Strings zugewiesen und der restliche Teil als Option zum Set-Befehl interpretiert. Unproblematisch ist das Weglassen nur bei Zahlenwerten, z.B.

GuiXT

Set V[i] 1
...
Set V[i] &V[i] + 1
Wert einer Variablen abfragen Mit "if" können Sie abfragen, ob eine Variable einen bestimmten Wert hat. Beispiel:

GuiXT

if V[MM_init=X]
....
endif

Vorsicht: Die Gleichheit wird hier sehr locker interpretiert :

  • Gross-/Kleinschreibung wird ignoriert
  • Ein Wert der nur aus Nullen "0000" besteht wird wie eine leere Zeichenreihe behandelt

Der Grund hierfür ist, dass die Variablen sehr häufig zum Vergleich eingegebener Werte benutzt werden, und hier müsste man sonst die automatische Umsetzung in Grossbuchstaben in der SAP-Anwendung bei zahlreichen Feldern sowie die Sonderbehandlung von 000..0 im Script berücksichtigen.

Sie können aber durch die Option -strict bei if erreichen, dass auf exakte Gleichheit geprüft wird:

GuiXT

if V[FI_mwskz=V0]  -strict
...
endif

Wenn Sie im Vergleich "<" oder ">" statt "=" verwenden, interpretiert GuiXT beide Ausdrücke als Zahlenwerte und vergleicht dann. In folgendem Beispiel fragen wir ab, ob die Variable k einen Wert <100 hat:

GuiXT

if V[k<100]
...
endif
Kurzform für Abfrage, ob Variable nicht leer ist Für die häufig vorkommende Abfrage, ob eine Variable nicht leer ist, können Sie die Notation

GuiXT

if V[varname]
....
endif

verwenden.

Zwei Variablen vergleichen Zum Vergleich zweier Variablen verwenden Sie statt eines festen Vergleichswerts den Ausdruck &V[varname]. Beispiel:

GuiXT

if V[konto1=&V[konto2]]
...
endif

Bitte beachten: zwei schliessende Klammen am Ende und keine "..." verwenden.

Generisches Rücksetzen einer Menge von Variablen Wenn Sie bei "Set" hinter den Variablennamen einen * setzen, erhalten alle Variablen, die mit dem angegebenen Namensteil beginnen, den angegebenen Wert. Das ist praktisch zum Zurücksetzen einer Menge von Variablen, meist wenn eine neue Transaktion beginnt, was Sie über die Systemvariable V[_transactionid] abfragen können. Beispiel:
GuiXT
if not V[_transactionid=&V[MM_transactionid]]
    Set V[MM_*] ""

    Set V[MM_transactionid] "&V[_transactionid]"
endif
Variablen konkatenieren Bei "Set" und jeder anderen Anweisung können Sie mehrere Variablenwerte durch Hintereinanderschreiben zusammenfügen. Beispiel:

GuiXT

Set V[MM01_text] "&V[M01_text1]&V[MM01_text2]"

Dazwischen können sich auch konstante Strings befinden. Beispiel:

GuiXT
Set V[id] "&V[a]-&V[b]-&V[c]"
Teilstrings abgreifen Sie können aus einer Variablen Teilstrings entnehmen. Die Notation ist dabei jeweils, dass Sie in runden Klammern dahinter die erste und die letzte gewünschte Position angeben, durch Bindestrich oder Komma getrennt. Beispiel:

GuiXT

Set V[x] "00113100"
Set V[y] "&V[x](5-6)"

Jetzt hat V[y] den Wert "31". Ebenso bei

GuiXT

Set V[x] "00113100"
Set V[y] "&V[x](5,6)"

Es gibt zwischen den beiden Notationen einen Bedeutungsunterschied, der sich nur in Unicodesystemen bemerkbar macht. GuiXT arbeitet intern dann mit der UTF8-Codierung, und dort belegen manche Zeichen, zum Beispiel Umlaute ä,ö,ü, mehr als 1 Byte. Während (4-6) die Bytes 4 bis 6 abgreift, bezieht sich (4,6) auf die Zeichen 4 bis 6. Beispiel:

GuiXT

Set V[x] "München"
Set V[y] "&V[x](4-6)"

Jetzt hat V[y] den Wert "nch". Dagegen bei 

GuiXT

Set V[x] "München"
Set V[y] "&V[x](4,6)"

den Wert "che". Da in Variablen auch Strukturen abgelegt werden können, deren Komponenten aus binären oder gepackten Zahlen bestehen, kann nicht generell die Zeichen-Interpretation verwendet werden.

Länge eines Strings in Bytes oder in Zeichen Die Option -stringLength bei Set liefert die Länge einer Zeichenreihe in Bytes, während -charCount die Anzahl der darin enthaltenen Zeichen liefert. In Unicode-Systemen können die beiden Werte unterschiedlich sein.

Beispiel:

GuiXT
Set V[leng] "München&quot -stringLength

GuiXT

Set V[count] "München" -charCount 

V[leng] ist 7 in nicht-Unicodesystemen und 8 in Unicodesystemen, da 'ü' in UTF8 zwei Bytes belegt. Dagegen ist V[count] immer 7.

Tipp: Verwenden Sie -stringLength in Verbindung mit der Teilstringnotation (i-k) und -charCount in Verbindung mit der Teilstringnotation (i,k); siehe Beispiel im nächsten Abschnitt.

Teilstrings mit variablen Positionen Die Positionsangaben für Teilstrings können variabel sein, also zum Beispiel (&V[i],&V[k]) statt (5,8), wobei V[i] und V[k] die gewünschten Positionen als Ziffern enthalten. In dem folgenden Beispiel löschen wir in einem gegebenen String alle Punkte; wir verwenden Rechenoperationen für Variablen (siehe unten). Der String V[in] wird Zeichen für Zeichen auf '.' untersucht und dabei der Ausgabestring V[out] aufgebaut.

GuiXT

// zum Testen
Set V[in] "12.580.720.4"

Set V[out] ""
Set V[charcount] "&V[in]" -charCount
Set V[k] 1
label next_char

if V[k>&V[charcount]]
  goto done
endif

Set V[char] "&V[in](&V[k],&V[k])"

if not V[char=.]
  Set V[out] "&V[out]&V[char]"
endif

Set V[k] &V[k] + 1

goto next_char

Komponenten aus SAP-Strukturen abgreifen Beim Aufruf von Funktionsbausteinen erhalten Sie häufig Informationen als SAP-Struktur, aus der Sie die einzelnen Komponenten entnehmen müssen. Hier ist das Arbeiten mit festen Offsets und Längen sehr fehleranfällig. GuiXT unterstützt die symbolische Notation über eine SAP Dictionary-Struktur. Sie nennen hinter der Variablen in runden Klammen die SAP Dictionary-Struktur und dann, durch Bindestrich abgetrennt, den Namen der Komponente. Als Beispiel lesen wir die Adressdaten zu einer Kundennummer und greifen den Ort ab:

GuiXT

Call "BAPI_CUSTOMER_GETDETAIL2" _
    in.CUSTOMERNO="0000002000" _ 
    out.CUSTOMERADDRESS="addr"
Set V[city] "&V[addr](BAPICUSTOMER_04-CITY)"

Erläuterung: Der Funktionsbaustein "BAPI_CUSTOMER_GETDETAIL2" besitzt einen Export-Parameter "CUSTOMERADDRESS". Dieser wird in unsere Variable V[addr] gestellt. Laut SAP Funktionsbibliothek ist die Dictionary-Struktur des Parameters "CUSTOMERADDRES" "BAPICUSTOMER_04", und dort befindet sich der Ort in der Komponente "CITY".

Häufig liefern Funktionsbausteine auch Tabellen zurück, bei denen jede Zeile eine SAP-Struktur besitzt, auf die wir mit der symbolischen Notation zugreifen können.

Bei Verwenden von  VersionNumber werden die Strukturinformation im GuiXT Cache (lokale Dateien) gespeichert, sodass das relativ aufwändige Lesen aus dem SAP Repository nur bei Ändern der VersionNumber anfällt.

Alternativ kann auch das OpenCall-Interface genutzt werden. Damit werden die Konversionen automatisch für externe und interne Formate in beide Richtungen durchgeführt, sodass die oben genannten Schritte sowie die in Abschnitt 15 nicht mehr notwendig sind.

Komponenten in SAP Strukturen setzen Analog können Sie in einer Variable Teilstrings setzen.  Dabei können Sie mit festen Offsets und Längen arbeiten oder mit symbolischen Namen laut SAP-Dictionary. Als Beispiel lesen wir alle Kunden mit Nummern zwischen 1 und 50 über den Funktionsbaustein BAPI_CUSTOMER_GETLIST, der als Eingabe eine Tabelle erwartet, in der jede Zeile ein Kundennummernintervall enthält.

GuiXT

Set V[line](BAPICUSTOMER_IDRANGE-SIGN) "I"
Set V[line](BAPICUSTOMER_IDRANGE-OPTION) "BT"
Set V[line](BAPICUSTOMER_IDRANGE-LOW) "0000000001"
Set V[line](BAPICUSTOMER_IDRANGE-HIGH) "0000000050"
CopyText fromString="line" toText="idrange"
Call "BAPI_CUSTOMER_GETLIST" table.IDRANGE="idrange" table.ADDRESSDATA="adrtab"
                        
BerechnugenDie Set Anweisung unterstützt die Grundoperatoren + , -, *, /. Alle Operanden werden zunächst in Zahlen umgewandelt. Das Ergebnis wird dann wieder in einem Stringformat gespeichert. Das Ergebnis wird, falls nicht ganzzahlig, auf 2 Dezimalstellen kaufmännisch gerundet ausgegeben; dabei können Sie eine andere Anzahl von Dezimalstellen setzen (decimals=) sowie weitere Optionen, siehe Set-Anweisung.

GuiXT

Set V[meineVariable] Wert1 + Wert2
Set V[meineVariable] Wert1 - Wert2
Set V[meineVariable] Wert1 * Wert2
Set V[meineVariable] Wert1 / Wert2

Die Rechnungen erfolgen intern über doppeltgenaue Gleitpunktzahlen.

Beispiel 1

GuiXT

Set V[x]  2  / 3 decimals=5

Resultat: 0,66667

Datumsangaben Bei der Umwandlung in Zahlen werden Datumsangaben wie z.B. "01.06.2014" erkannt und automatisch in Tagen berechnet. Das Ergebnis wird wieder als Datum in gleichem Format ausgegeben, falls von einem Datum Zahlen addiert oder subtrahiert wurden.

Beispiel 1:

GuiXT

Set V[x]  "01.06.2014" - 1

Resultat: "31.05.2014"

Beispiel 2:

GuiXT

Set V[x]  "01.06.2014" -  "01.01.2014"

Resultat: "151"

Beispiel 3:

Die folgende Datumsrechnung prüft, ob ein gegebenes Datum V[date] ein Sonntag ist. Dazu wird ein beliebiger Sonntag, z.B. der 31.12.2000, von dem Datum subtrahiert und dann berechnet, ob die Differenz durch 7 teilbar ist:

GuiXT

Set V[x] "&V[date]" -
"31.12.2000"
Set V[y] &V[x] / 7 decimals=0
Set V[y] &V[y] * 7
if V[x=&V[y]]
  Message "Sonntag&quot
endif
&nbsp

Variablen im Namen einer Variablen Sie können in einem Variablennamen den Inhalt anderer Variablen verwenden. Beispiel:

GuiXT

Set V[name] "x"
Set V[&V[name]] "10"

Hierdurch wird V[x] auf "10" gesetzt.

Meist benutzt man diese Möglichkeit für einen fortlaufenden Index. Als Beispiel übertragen wir aus den angezeigten Zeilen einer Erfassungstabelle "Alle Positionen" die Spalte "Material" in fortlaufend nummerierte Variablen:

GuiXT

Set V[i] 
label start
Set V[VA_material_&V[i]]  "&cell[Alle Positionen,Material,&V[i]]"
    
if not V[VA_material_&V[i]]
  goto end
endif               
    
Set V[i] &V[i] + 1
goto start                            
label end
Feldtexte aus dem SAP Data Dictionary Mit der Notation &ddic[xxx] erhalten Sie den Feldtext zum SAP-Feld xxx in der Anmeldesprache des Benutzers. Wenn Sie eine Länge mitgeben, wird ein passender Kurztext aus dem Data Dictionary  entnommen. Beispiele:

"&ddic[BSEG-BSCHL]"   Buchungsschlüssel
"&ddic[BSEG-BSCHL] (1-15)"   Buchungsschl.
"&ddic[BSEG-BSCHL] (1-10)"   Bschl

Bei Verwenden von  VersionNumber werden die gelesenen Texte im GuiXT Cache (lokale Dateien) gespeichert, sodass das relativ aufwändige Lesen aus dem SAP Repository nur bei Ändern der VersionNumber anfällt.

Umgebungsvariablen Den Wert einer Windows Umgebungsvariablen erhalten Sie über die Notation "&%[xxx]" wobei xxx der Name der Umgebungsvariable ist.

Wenn Sie zum Beispiel eine temporäre Datei generieren wollen, kann es sinnvoll sein, den Ordner aus der Umgebungsvariable TEMP zu entnehmen:

GuiXT
Set V[myFilename] "&%[TEMP]\guixtva01.txt"
Struktur-/TabellenvariablenStrukturvariablen dienen dazu, zusammengehörige Daten in einer festen, übersichtlichen Form zu speichern. Sie bestehen aus vordefinierten Feldern (Komponenten), auf die gezielt zugegriffen werden kann. Dadurch eignen sie sich besonders für einzelne Datensätze mit klarer Struktur.
GuiXT
CreateStructure V[person] name city
Set V[person.name] "Max Mustermann"
Set V[person.city] "Köln"

Tabellenvariablen werden verwendet, um mehrere Datensätze in Form von Zeilen und Spalten zu verwalten. Jede Zeile stellt dabei einen eigenen Datensatz dar. Sie eignen sich besonders, wenn wiederkehrende oder listenartige Daten verarbeitet werden sollen.

GuiXT

CreateTable V[persons] name city
Set V[persons.name.1] "Max Mustermann"
Set V[persons.city.1] "Köln"

Set V[persons.name.2] "Erika Musterfrau"
Set V[persons.city.2] "Berlin"

Eine genauere Erläuterung finden Sie hier.