SET-Werteblöcke

Ein SET-Werteblock ist ein Codebereich, in dem Sie Eigenschafts-, Feld- oder Variablenwerte festlegen können. Hintergrundinformationen zu Eigenschaften finden Sie in der Übersicht zu EGL-Eigenschaften.

Sie können einen SET-Werteblock einschließen, wenn Sie eine der folgenden Aktionen ausführen:

In den letzten beiden Fällen können Sie Feldern ausschließlich Werte zuordnen.

Normalerweise stellen Programmierer einen einzelnen SET-Werteblock an den Anfang des Abschnittsinhalt. Sie können jedoch auch für jede zugeordnete Eigenschaft und jeden zugeordneten Wert einen eigenen SET-Werteblock definieren und diese Blöcke über den Abschnitt verteilen, solange Sie die Regeln für Gültigkeitsbereiche beachten (siehe Gültigkeitsbereich). So aktiviert beispielsweise der SET-Werteblock im folgenden Beispiel die Programmeigenschaft 'handleHardIOErrors':
program hello
	myString STRING = "Hello, Cleveland";
	{handleHardIOErrors = YES}   // Dies funktioniert
	...
end
Wenn Sie das Semikolon verschieben, gibt das Programm einen Gültigkeitsfehler aus:
program hello
	myString STRING = "Hello, Cleveland"
	{handleHardIOErrors = YES};   // Dieser Teil gehört zur Deklaration von 'myString'
	...
end

Das Problem besteht darin, dass 'handleHardIOErrors' sich nun im Gültigkeitsbereich der Zeichenfolge "Hello, Cleveland" befindet. In einer Zeichenfolge gibt es keine zu setzenden Felder, schon gar kein Feld namens 'handleHardIOErrors', sodass EGL den Ausdruck nicht auflösen kann.

Ein SET-Werteblock hat die folgenden zusätzlichen Effekte: Die folgende Anweisung erstellt eine nullfähige Variable, deren Anfangswert ungleich null (in diesem Fall 0) ist:
myInt INT?{};
Das folgende Beispiel ergibt eine Nullwertausnahmebedingung:
myList Dictionary;   // myList = null
myList.x = 23;       // ungültiger Verweis
Der folgende Code initialisiert hingegen eine neue Wörterverzeichnisvariable, bevor der Versuch einer Zuordnung unternommen wird:
myList2 Dictionary;   // myList2 = null
myList2{ x = 23 };    // 'myList2' hat nun einen Schlüssel (x) mit dem Wert 23
Sie können SET-Werteblöcke verwenden, um Werte in strukturierten Datensatzvariablen zu initialisieren. Ein Beispiel:
package com.companyb.customer;

Record StructuredRecordA
10 fullCheckNum NUM(25);
  15 bankNum NUM(9);
  15 acctNum NUM(10);
  15 checkNum NUM(6);
end

program calculate type BasicProgram

  function main()
    myRec1 StructuredRecordA 
      {fullCheckNum = 9531008501602141091001484};
    writeStdOut(myRec1.bankNum);  // 953100850
    writeStdErr(myRec1.checkNum); // 1484
  end
end
Durch Festlegen des Felds auf Ausgangsebene werden auch die Felder der Unterstruktur festgelegt. Sie können auch die Felder der Unterstruktur einzeln festlegen, wie im folgenden Beispiel:
  myRec2 StructuredRecordA {checkNum = 1485};
  writeStdOut(myRec2.fullCheckNum); // 1485

Wenn Sie mehrere Zuordnungen zu demselben Feld oder derselben Eigenschaft in einem SET-Werteblock vornehmen, wird die letzte Zuordnung wirksam. Diese Regel gilt auch für Felder komplexer Eigenschaften, die unter 'SET-Werteblöcke in komplexen Eigenschaften' in diesem Thema beschrieben werden.

SET-Werteblöcke für elementare Situationen

Die folgenden Regeln gelten in den elementarsten Fällen:
  • Jeder SET-Werteblock beginnt mit einer linken geschweiften Klammer ({), enthält keine oder mehrere durch Kommata getrennte Einträge und endet mit einer rechten geschweiften Klammer (}).
  • Jeder Eintrag hat eines der folgenden beiden Formate:
    • Ein Name/Wert-Paar wie beispielsweise 'inputRequired = yes'.
    • Eine Serie positionsgebundener Werte (aufeinanderfolgende Werte, die aufeinanderfolgenden Elementen einer Feldgruppe zugeordnet sind).

In jedem Fall befindet sich der SET-Werteblock in dem Gültigkeitsbereich der Abschnitte, Variablen oder Felder, die geändert werden. Die Syntaxvariationen lassen sich am besten anhand von Beispielen veranschaulichen.

Das erste Beispiel zeigt eine Variable eines Basiselementtyps mit zwei Eigenschaften ('inputRequired' und 'align'):
   // Der Gültigkeitsbereich ist 'myVariable'
   myVariable INT
   {
      inputRequired = yes,
      align = left
   };
Das nächste Beispiel zeigt die Definition eines Datenelementabschnitts (DataItem):
  // Der Gültigkeitsbereich ist 'optionEntry'
  DataItem optionEntry INT
  {
      inputRequired = yes,
      align = left
  };
  end
Das nächste Beispiel zeigt eine Variablendeklaration, in der der vorherige Abschnitt als Typ verwendet wird und anschließend eine der Eigenschaften überschrieben wird:
  // Der Gültigkeitsbereich ist 'menu1Option'
  menu1Option optionEntry
  {
      inputRequired = no
   };
Bei den ersten beiden Zuordnungsanweisungen wird kein SET-Werteblock verwendet:
  myRecord02.myContent01 = "abc";
  myRecord02.myContent02 = "xyz";
Diese abgekürzte Zuordnungsanweisung ist äquivalent zu den vorherigen beiden Anweisungen:
  myRecord02
  {
      myContent01="abc",
      myContent02="xyz"
   };

Die abgekürzte Zuordnungsanweisung ist nicht für Felder in einem strukturierten Datensatz verfügbar und kann nicht zum Festlegen von Eigenschaften verwendet werden.

SET-Werteblöcke für Felder in Datensätzen

Wenn Sie Werte für ein Feld in einer Datensatzvariablen zuordnen, müssen Sie den Gültigkeitsbereich wie folgt auf das entsprechende Feld eingrenzen.

Betrachten Sie die folgenden Datensatzdefinitionen:
  record myBasicRecord03 type basicRecord
    myInt04 INT;
  end

  record myBasicRecord02 type basicRecord
    myInt03 INT;
    myRec03 myBasicRecord03;
  end

  record myBasicRecord type basicRecord  
    myInt01 INT;
    myInt02 INT;
    myRec02 myBasicRecord02;
 end
Anhand der folgenden Schritte können Sie einen Eigenschaftswert für ein beliebiges Feld zuordnen:
  • Erstellen Sie einen SET-Werteblock für den Datensatz.
  • Betten Sie eine Serie von Feldnamen ein, um den Gültigkeitsbereich einzuschränken.
  • Erstellen Sie einen feldspezifischen SET-Werteblock.

Die Syntax für das Zuordnen eines Eigenschaftswerts kann eines der in den folgenden Beispielen gezeigten Formate annehmen, die für das Feld 'myInt04' gelten:

  // Punktsyntax
  myRecB myBasicRecord 
  { 
    myRec02.myRec03.myInt04{ align = left } 
  };

  // Syntax mit eckigen Klammern
  // Diese Syntax wirkt sich nicht auf
  // Felder in festgelegten Strukturen aus.
  myRecC myBasicRecord 
  { 
    myRec02["myRec03"]["myInt04"]{ align = left } 
  };

  // Syntax mit geschweiften Klammern 
  myRecA myBasicRecord 
  { 
    myRec02 {myRec03 { myInt04 { align = left }}}
  };
Verwenden Sie auch in komplexen Fällen ein Komma, um die Einträge in einem SET-Werteblock voneinander zu trennen. Hierbei müssen Sie die Ebene berücksichtigen, auf der ein bestimmter Block verschachtelt ist:
  // Punktsyntax
  myRecB myBasicRecord 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02.myRec03.myInt04{ align = left }, 
    myRec02.myInt03 = 6
  };

  // Syntax mit eckigen Klammern
  myRecC myBasicRecord 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02["myRec03"]["myInt04"]{ align = left }, 
    myRec02["myInt03"] = 6
  };

  // Syntax mit geschweiften Klammern; 
  // Die Verwaltung dieses Formats ist jedoch viel schwieriger
  myRecA myBasicRecord 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02 
      {
        myRec03 
          { myInt04 
            { action = label5 }},
        myInt03 = 6
      }
  };

Verwendung von 'this' in SET-Werteblöcken

In einer Variablendeklaration oder Zuordnungsanweisung können Sie einen Container (wie beispielsweise einen SQL-Datensatz) verwenden, der ein Feld (wie beispielsweise keyItems) enthält, das denselben Namen wie eine Datensatzeigenschaft hat. Um auf Ihr Feld und nicht auf die Eigenschaft zu verweisen, verwenden Sie das Schlüsselwort 'this', das als Gültigkeitsbereich die Deklaration festlegt, in der sich der SET-Werteblock befindet.

Betrachten Sie die folgende Datensatzdefinition:
  Record ExampleRecord type SQLRecord
    { tableNames = [["myTable"]],
      keyItems = [myKey] }
    myKey CHAR(10);
    myOtherKey CHAR(10);
    keyItems CHAR(60);
  end 
Die folgende Satzdeklaration definiert zunächst einen Wert für die Eigenschaft 'keyItems' und anschließend einen Wert für das Feld desselben Namens:
  myRecord ExampleRecord 
  { 
     keyItems = [myOtherKey],
     this.keyItems = "abc"
  };

Ein Beispiel für eine Feldgruppendeklaration finden Sie unter 'Zusätzliche Beispiele für SET-Werteblöcke'.

SET-Werteblöcke in komplexen Eigenschaften

EGL umfasst eine Reihe von komplexen Eigenschaften, deren Namen konventionsgemäß mit dem Zeichen '@' beginnen. Komplexe Eigenschaften verfügen über eigene (als Eigenschaftsfelder bezeichnete) Eigenschaften mit Werten, die in einem untergeordneten SET-Werteblock zugeordnet sind. Das folgende Beispiel zeigt die komplexe Eigenschaft @xml, die in Servicevariablendeklarationen verwendet wird:
  myService ExampleServicePart 
  { @xml
    {name="myService",
     namespace="http://www.customerpackage.companyb.commy.useful.service"}
  };

Zusätzliche Beispiele für SET-Werteblöcke

In den Beispielen werden die folgenden Datensatzdefinitionen verwendet:
  Record Point
    x INT;
    y INT;
  end

  Record Rectangle
    topLeft Point;
    bottomRight Point;
  end
Der folgende Code ist gültig:
  Function test()
    screen Rectangle
    {
      topLeft{x=1, y=1},
      bottomRight{x=80, y=24}
    };
  
    // Ändern Sie x, y im Code mit einer Anweisung, die 
    // äquivalent ist zu folgendem Code:
    //   screen.topLeft.x = 1;
    //   screen.topLeft.y = 2;
    screen.topLeft{x=1, y=2};
  end
Initialisieren Sie als Nächstes eine dynamische Feldgruppe aus Point-Elementen in derselben Funktion:
  pts Point[2]
  {
    this[1]{x=1, y=2},
    this[2]{x=2, y=3}
  };
Legen Sie den Wert jedes nun in der Feldgruppe enthaltenen Elements fest und setzen Sie anschließend das erste Element auf einen anderen Wert:
  pts{ x=1, y=1 };
  pts[1]{x=10, y=20};

Außerhalb eines SET-Werteblocks hat das Schlüsselwort 'this' eine andere Bedeutung (siehe Schlüsselwort "this"). In jedem Fall ist die Verwendung von 'pts[1]' hier nicht mehrdeutig, sodass eine solche Unterscheidung nicht erforderlich ist.

Betrachten Sie nun eine weitere dynamische Feldgruppe des Typs 'Point':
  points Point[];
Die folgenden beiden Zuordnungen lösen Ausnahmebedingungen vom Typ 'NullValueExceptions' aus, weil die Feldgruppe nicht initialisiert ist. Feldgruppen haben anfängliche Nullwerte, da es sich bei Ihnen um Verweistypen handelt (siehe Referenzvariablen):
  points{x=1, y=1};
  points[1]{x=10, y=20};
Nach der Initialisierung der Feldgruppe können Sie ihr Elemente hinzufügen und anschließend eine einzelne Anweisung verwenden, um Werte in allen Elementen festzulegen:
  points{};
  points.resize(2);
  points{x=1, y=1};

Feedback