Dateninitialisierung

EGL nimmt die Dateninitialisierung wie folgt vor:
  • 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"];
      end

      Diese 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
  • 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:
    Record ExampleRecord
      10 charField CHAR(24);
        15 hexField HEX(16);
        15 remainder CHAR(16);
    end
    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.

    Bei 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)
Anmerkung: Schleifenabhängigkeiten zwischen Bibliotheken verursachen Probleme bei der Initialisierung. Eine Schleifenabhängigkeit liegt dann vor, wenn zwei Bibliotheken Variablen enthalten, deren Anfangswerte von Variablen in der jeweils anderen Bibliothek abhängig sind. Beispiel:
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

Tabelle 2. Hinweise zur Kompatibilität für die Dateninitialisierung
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.