Anders als Arrays und Listen, die eine Anzahl von Werten gleichen Typs unter einem Variablennamen vereinigen, ermöglicht eine Variable vom Typ STRUCTURE eine Zusammenfassung mehrerer Elemente beliebigen Typs, von denen jedes durch einen eigenen Namen gekennzeichnet ist. Diese Elementnamen werden, durch einen Punkt getrennt, an den Namen der Strukturvariablen angehängt, um die einzelnen Elemente anzusprechen:
/DECL-VAR EINKAUF(TYPE=*STRUCTURE) /EINKAUF.LEITER = 'H. Haegar' /EINKAUF.ANZ-MITARBEITER = 17 /EINKAUF.UMSATZ = 99000
Die Strukturelemente können ihrerseits wieder Arrays oder Listen und auch vom Typ STRUCTURE sein:
/DECL-ELEM EINKAUF.PERSONAL(TYPE=*STRUCTURE),MULT-ELEM=*LIST /EINKAUF.PERSONAL#1.NAME = 'S. Glueckspilz' /EINKAUF.PERSONAL#1.PERS-NR = 13 /EINKAUF.PERSONAL#2.NAME = 'D. Harry' /EINKAUF.PERSONAL#2.PERS-NR = 17
Das folgende Beispiel zeigt, wie eine Liste von Strukturen als eine einfache Datenbank benutzt werden kann. Zur Erzeugung der Elemente und zur Zuweisung von Werten wird hier eine spezielle Form des SET-VARIABLE-Kommandos benutzt, die einen String im Format einer SDF-Kommando-Unterstruktur erwartet und daraus einzelne Wertzuweisungen generiert. Mit FOR-Schleifen werden die Einträge der „Datenbank“ der Reihe nach abgearbeitet, um dem Benutzer die Eingabealternativen zu präsentieren und danach den gewünschten Eintrag zu selektieren.
/DECL-VAR JOB-START(TYPE=*STRUCT),MULT-ELEM=*LIST /DECL-VAR JOB(TYPE=STRUCT) / /&* Liste der Jobdefinitionen aufbauen /JOB-START=*STR-TO-VAR('PAR(NAME=CTL,CPU=60,FILE=E.CONTROL)'), - / WRITE-MODE=*EXTEND /JOB-START=*STR-TO-VAR('PAR(NAME=DB,CPU=999,FILE=$AV.DB-START)'), - / WRITE-MODE=*EXTEND /"... beliebig viele weitere Jobdefinitionen nach Bedarf ..." / /&* alle definierten Jobs anzeigen /TEXT = ' Auswahl:' /FOR JOB=*LIST(JOB-START) / TEXT = TEXT // ' ' // JOB.NAME /END-FOR /WRITE-TEXT '&TEXT' / /&* Auswahl durch den Benutzer /READ-VAR JNAM,PROMPT=' Welchen Job haettens'' denn gern?' / /&* passenden Job in der Liste suchen und starten /FOR JOB=*LIST(JOB-START) / IF (UPPER-CASE(JNAM) == UPPER-CASE(JOB.NAME)) / ENTER-JOB &(JOB.FILE),CPU-LIMIT=&(JOB.CPU) / END-IF /END-FOR
Strukturen, deren Elemente während des Prozedurablaufs nach Belieben erzeugt (und auch gelöscht) werden können, werden als „dynamische Strukturen“ bezeichnet. Im Gegensatz hierzu kann der Aufbau einer Struktur auch zum Zeitpunkt der Deklaration bereits vollständig definiert werden durch ein Strukturlayout, das die Namen und Typen aller Elemente festlegt. Die folgenden Kommandos erzeugen ein Layout mit dem Namen ABTEILUNG, das anschließend dazu benutzt wird, eine Variable (als „statische Struktur“) zu deklarieren:
/BEGIN-STRUCTURE ABTEILUNG / DECLARE-ELEMENT LEITER(TYPE=*STRING) / DECLARE-ELEMENT ANZ-MITARB(TYPE=*INTEGER) / DECLARE-ELEMENT UMSATZ(TYPE=*INTEGER) /END-STRUCTURE ABTEILUNG /DECL-VAR MEDIZIN(TYPE=*STRUCT(DEFINITION=ABTEILUNG)) /MEDIZIN.LEITER = 'Dr. Zook' /MEDIZIN.ANZ-MITARB = 2; MEDIZIN.UMSATZ = 99001
Mit SET-VARIABLE lassen sich auch ganze Strukturen einander zuweisen; durch den Operanden WRITE-MODE lässt sich einstellen, ob nicht angesprochene Elemente der Zielstruktur erhalten bleiben. Wenn die Zielstruktur statisch angelegt ist, bleiben bei der Zuweisung diejenigen Elemente der Quellstruktur unberücksichtigt, die in der Zielvariablen nicht enthalten sind.
Einige Systemkommandos können wahlweise ihre Ausgaben in Strukturvariablen leiten. Beispielsweise kann durch das Kommando SHOW-FILE-ATTRIBUTES eine Struktur ausgegeben werden, deren Elemente sämtliche Kataloginformationen einer Datei enthalten. Diese Informationen können dann in einer S-Prozedur durch direkte Zugriffe auf Elemente dieser Struktur unmittelbar weiterverarbeitet werden (Näheres hierzu im Abschnitt„Strukturierte Ausgaben in S-Variablen“ (Strukturierte Ausgaben in S-Variablen )).