Dateninitialisierung
- Normalerweise können Sie in allen folgenden Fällen
einen Initialisierungsoperator (ein Gleichheitszeichen, gefolgt
von einem Literal) codieren:
- Wenn Sie einen strukturierten Datensatzabschnitt (für ein beliebiges Feld der untersten Ebene) definieren:
Record ExampleRecord type basicRecord 10 myField CHAR(5); 20 myField01 CHAR(1) = "1"; 20 myField02 CHAR(1) = "2"; 20 myArray01 CHAR(1)[3] = ["a", "b", "c"]; // Der folgende Eintrag ordnet dem ersten Element "z" // und (in Java-Code) dem Rest Leerzeichen zu. 20 myArray02 CHAR(1)[3] = ["z"]; endDiese Regel gilt auch für Formularfelder. In einer Datentabelle (DataTable) können Sie keinen Initialisierungsoperator angeben.
- Wenn Sie eine Variable auf der Basis eines Primitive-Datentyps deklarieren:
Record ExampleRecord type basicRecord myRecField INT = 2; end Program myProgram (myField03 INT = 3) myField04 STRING = "EGL"; function main() // myRecord.myRecField = 2 myRecord ExampleRecord; end end - Wenn Sie einen Datensatz definieren, der wiederum einen anderen Datensatz definiert
(der Initialisierungsoperator wirkt sich nicht zum Zeitpunkt der Deklaration aus,
sondern wird dann verwendet, wenn Ihr Code eine Anweisung set record initial aufruft):
Record partA 10 aa char(4) = "abcd"; end Record partB 10 bb char(4) = "1234"; end Program Example A partA; B partB { redefines="A" }; function main() // Jede der folgenden Anweisungen schreibt "abcd". writeStdOut( A.aa ); writeStdOut( B.bb ); // Stellt den Speicherbereich auf die Definition von Datensatz partB ein. set B initial; // Jede der folgenden Anweisungen schreibt "1234". writeStdOut( A.aa ); writeStdOut( B.bb ); end end
- Wenn Sie einen strukturierten Datensatzabschnitt (für ein beliebiges Feld der untersten Ebene) definieren:
- EGL initialisiert in den folgenden Fällen auch den Speicher mit voreingestellten Werten
(diese Werte werden weiter unten beschrieben):
- Ihre Logik ruft verschiedene Varianten der Anweisung set auf; siehe set.
- Sie stellen die Eigenschaft initialized einer Variablen auf YES ein. Dies ist eine Eigenschaft von Variablen und nicht von Datensatzfeldern. (Die Eigenschaft ist im Prinzip veraltet.)
- Sie generieren einen Abschnitt für Java™, einschließlich Bibliotheken, Services und aller Handlertypen.
In einem strukturierten Datensatz werden nur die Strukturfelder der untersten Ebene initialisiert. Ein Beispiel:
Der Speicherbereich für hexField wird mit binären Nullen initialisiert, wie dies HEX-Variablen entspricht. Das Feld remainder wird mit Leerzeichen initialisiert. Zwei HEX-Zeichen werden für ein einzelnes Byte benötigt, d. h., eine HEX(16)-Variable belegt nur acht Bytes.Record ExampleRecord 10 charField CHAR(24); 15 hexField HEX(16); 15 remainder CHAR(16); endBei einer Feldgruppe wird jedes Element der Feldgruppe einzeln initialisiert.
Datensätze oder Felder, die als Programm- oder Funktionsargumente empfangen werden, werden nie automatisch initialisiert.
Nullfähige Variablen (also solche, die Nullwerte enthalten dürfen) sind ein Sonderfall. Diejenigen, die mit dem Typerweiterungszeichen "?" erstellt wurden, werden auf null initialisiert.
Nullfähige Variablen (also solche, die Nullwerte enthalten dürfen) sind ein Sonderfall. Diejenigen, die mit dem Typerweiterungszeichen "?" erstellt wurden, werden auf null initialisiert. Diejenigen, die durch die Eigenschaft i4glItemsNullable gesteuert werden, haben andere Anfangswerte. Siehe i4glItemsNullable.
Die folgende Tabelle zeigt die Werte für die automatische Initialisierung für verschiedene Typen:Tabelle 1. Werte, die bei der Initialisierung automatisch zugeordnet werden Typ Initialisierungswert ANY Null BIN (und die ganzzahligen Typen), HEX, FLOAT, SMALLFLOAT Binäre Nullen BLOB, CLOB Zurücksetzung mit lobLib.freeBlob() oder lobLib.freeClob() BOOLEAN Falsch (False) CHAR, MBCHAR Einzelbyteleerzeichen DATE, TIME, TIMESTAMP Wert der Systemuhr (für die Bytezahl, die bei TIMESTAMP für die Maske erforderlich ist) DBCHAR Doppelbyteleerzeichen DECIMAL, MONEY, NUM, NUMC, PACF Numerische Nullen INTERVAL Numerische Nullen (für die Bytezahl, die für die Maske erforderlich ist), mit vorangestelltem Pluszeichen STRING "" (eine Nullzeichenfolge) UNICODE Unicode-Leerzeichen (die hexadezimal jeweils mit 0020 angegeben werden)
library lib1
a int = 1;
b int = lib2.c;
end
library lib2
c int = 2;
d int = lib1.a;
end
Wenn ein Programm versucht, lib1 oder lib2 zu verwenden, löst EGL eine Ausnahmebedingung aus.
Kompatibilität
| Plattform | Problem |
|---|---|
| COBOL-Generierung | Ein EGL-generiertes COBOL-Programm initialisiert alle Datensätze. Die Felder in den Datensätzen werden auf der Basis des COBOL-Datentyps initialisiert. Anschließend werden die Variablen nach EGL-Typ initialisiert, wie dies in der Tabelle oben beschrieben ist. Dabei wird die COBOL-Anweisung INITIALIZE außer Kraft gesetzt. Anmerkung: Wenn Sie ein COBOL-Programm generieren, das eine Variable des Typs
NUM mit einer Variable des Typs CHAR vergleicht, müssen Sie sicherstellen, dass
Ihr Code die Felder initialisiert. Andernfalls kann der Vergleich dazu führen, dass
das Programm mit einer Abbruchnachricht fehlschlägt. Wenn dies geschieht, wird kein Code zur Ausnahmebehandlung ausgeführt. Eine ähnliche COBOL-spezifische Warnung gilt für Felder in lokalen Datensätzen.
|
| JavaScript-Generierung | Die folgenden Typen werden nicht unterstützt: ArrayDictionary, BIN (mit Dezimalstellen), BLOB, CHAR, CLOB, DBCHAR, HEX, INTERVAL, MBCHAR, NUMC, STRING (mit einer Größenbegrenzung), PACF, UNICODE und strukturierte Datensatzabschnitte. |