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.
- Definieren eines Abschnitts
- Deklarieren einer Variablen
- Erstellen eines Abschnitts mit dem Operator 'new'
- Codieren eines speziellen Formats einer Anweisung vom Typ 'call', 'transfer' oder 'show' (nur Eigenschaften)
- Codieren eines speziellen Formats einer Zuordnungsanweisung (nur Werte)
- Codierung einer Anweisung vom Typ 'openUI', wie unter "openUI" beschrieben (nur Werte)
In den letzten beiden Fällen können Sie Feldern ausschließlich Werte zuordnen.
program hello
myString STRING = "Hello, Cleveland";
{handleHardIOErrors = YES} // Dies funktioniert
...
end
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 Geltungsbereich 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.
- Er inaktiviert das Null-Flag für Variablen, die Nullwerte enthalten dürfen.
- Er initialisiert einen neuen Abschnitt für eine Nullreferenzvariable.
myInt INT?{};
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
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
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
- 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 im Geltungsbereich der Abschnitte, Variablen oder Felder, die geändert werden. Die Syntaxvariationen lassen sich am besten anhand von Beispielen veranschaulichen.
// Der Geltungsbereich ist 'myVariable'
myVariable INT
{
inputRequired = yes,
align = left
};
// Der Geltungsbereich ist 'optionEntry'
DataItem optionEntry INT
{
inputRequired = yes,
align = left
};
end
// Der Geltungsbereich ist 'menu1Option'
menu1Option optionEntry
{
inputRequired = no
};
myRecord02.myContent01 = "abc";
myRecord02.myContent02 = "xyz";
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 Geltungsbereich wie folgt auf das entsprechende Feld eingrenzen.
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
- Erstellen Sie einen SET-Werteblock für den Datensatz.
- Betten Sie eine Serie von Feldnamen ein, um den Geltungsbereich 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 }}}
};
// 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 Geltungsbereich die Deklaration festlegt, in der sich der SET-Werteblock befindet.
Record ExampleRecord type SQLRecord
{ tableNames = [["myTable"]],
keyItems = [myKey] }
myKey CHAR(10);
myOtherKey CHAR(10);
keyItems CHAR(60);
end
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
myService ExampleServicePart
{ @xml
{name="myService",
namespace="http://www.customerpackage.companyb.commy.useful.service"}
};
Zusätzliche Beispiele für SET-Werteblöcke
Record Point
x INT;
y INT;
end
Record Rectangle
topLeft Point;
bottomRight Point;
end
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
pts Point[2]
{
this[1]{x=1, y=2},
this[2]{x=2, y=3}
};
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.
points Point[];
points{x=1, y=1};
points[1]{x=10, y=20};
points{};
points.resize(2);
points{x=1, y=1};