SDF-Kommando-Strings können in S-Variablen vom Typ Struktur oder Liste gemäß ganz bestimmter Regeln konvertiert werden. Genauso ist es umgekehrt möglich, S-Variablen vom Typ Struktur oder Liste in SDF-Strings zu konvertieren.
Die Konvertierung eines SDF-Kommando-Strings in eine S-Variable wird mit dem Operanden *STRING-TO-VARIABLE(...) im Kommando SET-VARIABLE eingestellt (siehe "SET-VARIABLE Variablen einen Wert zuweisen "), die umgekehrte Konvertierung mit der vordefinierten Funktion VARIABLE-TO-STRING( ) (siehe "VARIABLE-TO-STRING( ) Variable konvertieren ").
Hinweis
Die Angabe von Stellungsoperanden bei SET-VARIABLE ist für die Konvertierung nicht möglich. Sie führt zu Fehlermeldungen.
Konvertierungsregeln
SDF-Kommando-Strings zu S-Variablen konvertieren
Operanden werden in Strukturelemente konvertiert.
Einfache Operandenwerte werden in einfache Strukturelement-Werte konvertiert.
SDF-Listen werden in Listenvariablen konvertiert.
Die Konvertierung erfolgt unabhängig von SDF-Datentypen.
Standardmäßig (VALUE-TYPE = *STD) gilt Folgendes: Wenn im Eingabe-String ein Integer-Wert gefunden wird, wird für die Variable als Datentyp Integer abgespeichert. Wenn im String TRUE oder FALSE gefunden wird (in Groß- oder Kleinbuchstaben), wird für die Variable als Datentyp Boolean abgespeichert. In allen anderen Fällen wird für die Variable als Datentyp String abgespeichert.
Bei Angabe VALUE-TYPE = *STRING wird wertunabhängig für die Variable als Datentyp String abgespeichert.Kommando-/Anweisungsnamen werden in Werte von Elementen mit dem reservierten Namen SYSOPER konvertiert.
Struktureinleitende Werte werden in Werte von Elementen mit dem reservierten Namen SYSSTRUC konvertiert.
Operanden in SDF-Strukturen werden in Strukturelement-Namen der 2. Ordnung konvertiert. Diese Elemente werden an den Element-Namen angehängt, der aus der Konvertierung des Operanden resultiert, der wiederum die Struktur bezeichnet.
S-Variablen zu SDF-Kommando-Strings konvertieren
S-Variablen vom Typ String werden in Zeichenketten ähnlich der &-Ersetzung konvertiert. Integer-Werte werden automatisch in Strings konvertiert. Boolean-Werte werden in die String-Werte TRUE bzw. FALSE konvertiert.
So muss eine S-Variable folgendermaßen initialisiert werden, wenn der Wert bei der Konvertierung einer S-Variablen zu einem SDF-String ein Wert vom Typ C-String ist:
/SET-VARIABLE DATA.OPER = 'C''mychain'''
Damit wird der String-Wert 'C''mychain'''
in der Variable DATA.OPER gespeichert und bei der Konvertierung in folgende SDF-Syntax umgewandelt:
OPER = C'mychain'
Das führt dazu, dass der Wert C
'mychain
' mit dem SDF-Datentyp <C-String> gemäß dem Operanden OPER spezifiziert wird.
Zusammenfassung
SDF-Syntax-String | S-Variablen-Aggregat (Name DATA) |
OPER = value | DATA.OPER = 'value' |
operation oper1 = val1 | DATA.SYSOPER = 'operation' |
oper = struc (oper1 = val1) | DATA.OPER.SYSSTRUC = 'struc' |
oper = (val1,val2,val3) | DATA.OPER#1 = 'val1' |
Ausnahmen
Nur die externe Form von SDF-Strings wird nach diesen Regeln zerlegt. Die Basisdaten, die verarbeitet werden, sind die Zeichenketten. Weder semantische Informationen noch interne SDF-Syntax-Deskriptoren werden konvertiert in S-Variable gespeichert: z.B. wenn OPER = A (OP1=VAL1) in eine S-Variable gespeichert wird, wird darin nicht angezeigt, ob A ein Schlüsselwort (keyword), ein Name (name) oder ein Dateiname (filename) ist.
Einschränkungen bei der String-Eingabe
Der SDF-String FROM=(file,*LIB(LIB=lib,EL=elem)) kann nicht in eine S-Variable übersetzt werden, weil SDF-P keine heterogenen Listen unterstützt.
Beispiele (für Einschränkungen)
Beispiel 1
FROM=(file,*LIB(LIB=lib,EL=elem)) wird konvertiert in:
A.FROM#1.SYSSTRUC = 'file' A.FROM#2.SYSSTRUC = '*LIB' A.FROM#2.LIB = 'lib' A.FROM#2.EL = 'elem'
Solche Variablenaggregate sind möglich für Listen dynamischer Strukturen. Jedoch muss das erste Listenelement als SYSSTRUC-Element konvertiert werden, das nicht übereinstimmt mit der aktuellen Struktur des SDF-Strings. A.FROM#1 = 'file' ist nicht möglich.
Beispiel 2
OP = (a,b,c) wird konvertiert in:
A.OP#1 = 'a' A.OP#2 = 'b' A.OP#3 = 'c'
Dagegen wird OP = (a,b,c(OPR=d)) konvertiert in:
A.OP#1.SYSSTRUC = 'a' A.OP#2.SYSSTRUC = 'b' A.OP#3.SYSSTRUC = 'c' A.OP#3.OPR = 'd'
Hinweis
Die Konvertierung eines einzelnen Wertes ist von der Struktur des Eingabe-Strings abhängig und kann deshalb zurückgewiesen werden (außer bei VALUE-TYPE= *STRING).
Beispiel 3
Die SDF-Strings FCB-TYPE=ISAM und FCB-TYPE=ISAM(KEY-POS=5,KEY-LEN=8) führt zu zwei verschiedenen Strukturen in SDF-P:
DATA.FCB-TYPE = 'ISAM'
und
DATA.FCB-TYPE.SYSSTRUC = 'ISAM' DATA.FCB-TYPE.KEY-LEN = 8 DATA.FCB-TYPE.KEY-POS = 5
Dabei können in S-Prozeduren die zwei Variablenstrukturen durch die vordefinierte Funktion VARIABLE-ATTRIBUTE(..., ATTRIBUTE = *TYPE) sortiert werden. So sind z.B. bei VARIABLE-ATTRIBUTE('DATA.FCB-TYPE', ATTRIBUTE = *TYPE) die Ergebnisse:
*STRUCTURE, wenn der Operandenwert eine Struktur ist.
in den anderen Fällen *ANY oder *STRING
Beispiel 4
Die Strings OPER=A(OP1=X,OP2=Y) und OPER=B(OP1=X,OP2=Y) erzeugen dieselben Strukturelemente, allerdings hat OP1 in beiden Fällen unterschiedliche Bedeutung:
DATA.OPER.SYSSTRUC = 'A' DATA.OPER.OP1 = 'X' DATA.OPER.OP2 = 'Y' DATA.OPER.SYSSTRUC = 'B' DATA.OPER.OP1 = 'X' DATA.OPER.OP2 = 'Y'