Hinweise zu 'get' für Datei-Ein-/Ausgabe

Im Kontext der Datei-Ein-/Ausgabe ohne Datenbankbezug werden mit der EGL-Anweisung 'get' Datensatzdaten aus einer Datei abgerufen.

Die abgerufenen Daten werden in die Satzvariable eingestellt, die Sie in der Anweisung angeben. Das genaue Verhalten der Anweisung hängt von der Art und Weise ab, wie Sie Ihre Datensatzvariable stereotypisiert haben.

Syntax

Syntaxdiagramm für die Anweisung 'get' bei Datei-Ein-/Ausgabe
Positionsoption
Bei relativen und seriellen Datensätzen, steht als positionsgebundenes Schlüsselwort nur 'next' zur Verfügung. Informationen hierzu finden Sie in den Abschnitten zu 'get next' für die jeweiligen Datensatzstereotypen in diesem Thema. Bei indexierten Datensätzen ist auch das Schlüsselwort 'previous' verfügbar. Informationen hierzu finden Sie unter ''get previous' bei indexierten Datensätzen' in diesem Thema.
Datensatzvariable
Name der Datensatzvariablen, in die die Daten kopiert werden.
forUpdate
Option zum Halten des Datensatzes für eine nachfolgende Löschoperation (delete) oder Ersetzungsoperation (replace).

CSV-Datensatz

Die einzigen Formate der Anweisung 'get', die Sie zum Angeben eines Datensatzes mit dem Stereotyp 'CSVRecord' verwenden können, sind 'get next' für einzelne Variablen und 'get' für Feldgruppen.

Wenn der aktuelle Datensatz der erste Datensatz ist, den Sie aus der Datei lesen, prüft EGL die Eigenschaft 'labels' für den Datensatz. Wenn die Eigenschaft keinen Nullwert aufweist, führt EGL die folgenden Aktionen aus:
  1. Lesen der ersten Datenzeile aus der Datei.
  2. Unterteilen der Zeile in Zeichenfolgen auf Basis des Werts der Eigenschaft 'delimiter' für den Datensatz. Wenn der Datensatz mehr Zeichenfolgen als Felder enthält, werden die überzähligen Zeichenfolgen von EGL ignoriert. Fehlende Felder bleiben null.
  3. Löschen des Inhalts der Feldgruppe mit Bezeichnungen und erneutes Füllen der Feldgruppe mit den Zeichenfolgen aus Schritt 2.

Anschließend liest EGL die nächste Zeile aus der Datei und unterteilt sie in einzelne Zeichenfolgen auf Basis des Werts der Eigenschaft 'delimiter'. Wenn der Datensatz mehr Zeichenfolgen als Felder enthält, werden die überzähligen Zeichenfolgen von EGL ignoriert.

Abschließend verwendet EGL die Zeichenfolgen zum Aktualisieren der Felder im Datensatz. EGL verwendet die vorhandenen Konvertierungsregeln zum Konvertieren der Zeichenfolgen in die entsprechenden Werte. EGL erwartet 'true' (wahr) und 'false' (falsch) als Werte für ein Feld vom Typ BOOLEAN; Groß-/Kleinschreibung wird ignoriert. Wenn einem bestimmten Feld keine Zeichenfolge entspricht, erhält das betreffende Feld einen Nullwert.

Sie können eine Feldgruppe aus Datensätzen mit der Anweisung 'get' angeben. Wenn die Feldgruppe einen Nullwert hat, erstellt EGL eine neue Feldgruppe. Wenn die Feldgruppe ungleich null ist, initialisiert EGL die Feldgruppe erneut als leer. Der ursprüngliche Wert der Eigenschaft 'maxSize' bleibt hierbei erhalten. Wenn in der Datei weitere Daten vorhanden sind und die Feldgruppe nicht voll ist, führt EGL die folgenden Aktionen aus:
  1. Erstellen eines neuen Feldgruppenelements (eines CSV-Datensatzes; CSVRecord).
  2. Verwenden der Anweisung 'get next' zum Lesen des nächsten Datensatzes.
  3. Konvertieren der Zeichenfolgen in der Zeile und Speichern dieser Zeichenfolgen in den Datensatzfeldern (wie oben).
  4. Anfügen des Datensatzes am Ende der Feldgruppe.

Der E/A-Fehlerstatus der Feldgruppe wird auf 'noRecordFound' (kein Datensatz gefunden) gesetzt, wenn die Datei leer ist (es wurden keine Zeilen gelesen, die Größe der Feldgruppe ist Null). Der E/A-Fehlerstatus wird auf 'endOfFile' (Dateiende) gesetzt, wenn die gesamte Datei in die Feldgruppe gelesen wurde.

Nach dem Lesen wird die Datei von EGL geschlossen.

Indexierter Datensatz

Wenn Sie eine Anweisung 'get' ausgeben, die auf einen Datensatz mit dem Stereotyp 'IndexedRecord' verweist, wird anhand des Schlüsselwerts im Datensatz festgelegt, welcher Datensatz aus der Datei abgerufen wird.

Wenn Sie einen indexierten Datensatz ersetzen oder löschen wollen, müssen Sie den Datensatz zunächst mithilfe einer Anweisung 'get' lesen, in der die Option 'forUpdate' angegeben ist. Verwenden Sie anschließend die Anweisung 'replace' oder 'delete' ohne intervenierende E/A-Operation für dieselbe Datei. Nach dem Absetzen der Anweisung 'get' wirkt sich die nächste E/A-Operation wie folgt auf dieselbe Datei aus:
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'replace' handelt, wird der Datensatz in der Datei geändert.
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'delete' handelt, wird der Datensatz in der Datei für Löschen markiert.
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'get' handelt, die die Option 'forUpdate' einschließt, ist eine nachfolgende Anweisung 'replace' oder 'delete' für den neu gelesenen Dateidatensatz gültig.
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'get' (ohne Option 'forUpdate') oder um eine Anweisung 'close' für dieselbe Datei handelt, wird der Dateidatensatz ohne Änderung freigegeben.

Die Anweisung 'get' (mit der Option 'forUpdate') verhindert, dass der Datensatz von anderen Programmen geändert wird. Weitere Informationen finden Sie unter 'Kompatibilität' in diesem Thema.

Anweisung 'get next' bei indexierten Datensätzen

Eine Anweisung 'get next', in der ein indexierter Datensatz angegeben ist, liest den nächsten Datensatz aus der Datei auf Basis der aktuellen Dateiposition, die von einer der beiden folgenden Operationen festgelegt wird:
  • Von einer erfolgreichen Ein-/Ausgabe-Operation wie beispielsweise einer Anweisung 'get', einer weiteren Anweisung 'get next' oder einer Anweisung 'get previous'.
  • Von einer Anweisung 'set' mit einem Änderungswert 'position'.
Es gelten die folgenden Regeln:
  • Wenn die Datei nicht offen ist, liest die Anweisung 'get next' einen Datensatz mit dem kleinsten Schlüsselwert in der Datei.
  • Jede nachfolgende Anweisung 'get next' liest einen Datensatz mit dem nächsthöheren Schlüsselwert bezogen auf die aktuelle Dateiposition. In diesem Thema wird auch die Situation mit doppelten Schlüsseln beschrieben.
  • Nachdem eine Anweisung 'get next' den Datensatz mit dem höchsten Schlüsselwert in der Datei gelesen hat, führt die nächste Anweisung 'get next' zum EGL-Fehlerwert 'endOfFile' (Dateiende).
  • Die aktuelle Dateiposition wird von folgenden Operationen beeinflusst:
    • Eine EGL-Anweisung 'set' mit einem Änderungswert 'position' erstellt eine Dateiposition auf Basis des gesetzten Werts, d. h. auf Basis des Schlüsselwerts in dem indexierten Datensatz, auf den die Anweisung 'set' verweist. Die nachfolgende Anweisung 'get next', die auf dieselbe Variable des indexierten Datensatzes verweist, liest den Dateidatensatz, der einen Schlüsselwert größer-gleich dem gesetzten Wert aufweist. Falls kein solcher Datensatz vorhanden ist, ergibt die Anweisung 'get next' 'endOfFile'.
    • Eine erfolgreiche E/A-Anweisung, die keine Anweisung 'get next' ist, erstellt eine neue Dateiposition, und die nachfolgende Anweisung 'get next' für denselben EGL-Datensatz liest den nächsten Dateidatensatz. Beispiel: Nachdem eine Anweisung 'get previous' einen Dateidatensatz gelesen hat, liest die Anweisung 'get next' entweder den Dateidatensatz mit dem nächsthöheren Schlüsselwert oder gibt 'endOfFile' zurück.
    • Gibt eine Anweisung 'get previous' 'endOfFile' zurück, ruft die nachfolgende Anweisung 'get next' den ersten Datensatz in der Datei ab.
    • Nach einer nicht erfolgreichen Anweisung 'get', 'get next' oder 'get previous' ist die Dateiposition nicht definiert und muss durch eine Anweisung 'set' mit einem Änderungswert 'position' oder von einer E/A-Operation außer 'get next' oder 'get previous' erneut erstellt werden.
  • Wenn Sie einen Alternativindex verwenden und sich in der Datei doppelte Schlüssel befinden, gelten die folgenden Regeln:
    • Ein Datensatz mit einem höherwertigen Schlüssel wird erst dann abgerufen, nachdem die get next-Anweisungen alle Datensätze mit demselben Schlüssel wie dem des zuletzt abgerufenen Datensatzes gelesen haben. Die Reihenfolge, in der Datensätze mit doppelten Schlüsseln abgerufen werden, ist die Reihenfolge, in der EGL die Datensätze zurückgibt.
    • Der EGL-Fehlerwert 'duplicate' wird nicht gesetzt, wenn Ihr Programm den letzten Datensatz einer Gruppe von Datensätzen mit demselben Schlüssel abruft.
    • Wenn eine Anweisung 'get next' auf eine erfolgreiche E/A-Operation (außer 'get next') folgt, übergeht die Anweisung 'get next' alle Datensätze mit doppeltem Schlüssel und ruft den Datensatz mit dem nächsthöheren Schlüssel ab.
Betrachten Sie eine Datei mit den folgenden Schlüsseln:
  1, 2, 2, 2, 3, 4

Jede der nachfolgenden Tabellen zeigt, welche Auswirkungen die Ausführung einer Folge von EGL-Anweisungen auf denselben indexierten Datensatz hat.

Tabelle 1. Auswirkungen der Anweisungen 'get' und 'get next' auf indexierte Datensätze
EGL-Anweisungen (in ihrer Reihenfolge) Schlüssel im indexierten Datensatz Schlüssel in dem von der Anweisung abgerufenen Dateidatensatz EGL-Fehlerwert
get 2 2 (erster von dreien) duplicate
get next Beliebig 3 --

Tabelle 2. Auswirkungen der Anweisungen 'set position' und 'get next' auf indexierte Datensätze
EGL-Anweisungen (in ihrer Reihenfolge) Schlüssel im indexierten Datensatz Schlüssel in dem von der Anweisung abgerufenen Dateidatensatz EGL-Fehlerwert
set position 2 kein Abruf --
get next Beliebig 2 (erster von dreien) duplicate
get next Beliebig 2 (zweiter) duplicate
get next Beliebig 2 (dritter) --
get next Beliebig 3 --

Anweisung 'get previous' bei indexierten Datensätzen

Wenn eine Anweisung 'get previous' für einen indexierten Datensatz ausgeführt wird, hängt das Ergebnis von der aktuellen Dateiposition ab, wie bei der Anweisung 'get next' auch. Für indexierte Datensätze gelten die folgenden Regeln:
  • Wenn die Datei nicht offen ist, liest die Anweisung 'get previous' einen Datensatz mit dem höchsten Schlüsselwert in der Datei.
  • Jede nachfolgende Anweisung 'get previous' liest einen Datensatz mit dem nächstniedrigeren Schlüsselwert bezogen auf die aktuelle Dateiposition. Die Situation mit doppelten Schlüsseln wird weiter unten beschrieben.
  • Nachdem eine Anweisung 'get previous' den Datensatz mit dem niedrigsten Schlüsselwert in der Datei gelesen hat, führt die nächste Anweisung 'get previous' zum EGL-Fehlerwert 'endOfFile' (Dateiende).
  • Die aktuelle Dateiposition wird von folgenden Operationen beeinflusst:
    • Eine EGL-Anweisung 'set' mit einem Änderungswert 'position' erstellt eine Dateiposition auf Basis des gesetzten Werts, d. h. auf Basis des Schlüsselwerts in dem indexierten Datensatz, auf den die Anweisung 'set' verweist. Eine nachfolgende Anweisung 'get previous', die auf denselben indexierten Datensatz verweist, liest den Dateidatensatz, der einen Schlüsselwert kleiner-gleich dem gesetzten Wert aufweist. Falls kein solcher Datensatz vorhanden ist, ergibt die Anweisung 'get previous' 'endOfFile'.
      Wenn der gesetzte Wert mit dem hexadezimalen Wert 'FF' gefüllt wird, führt eine Anweisung 'set position' zu folgendem Ergebnis:
      • Die Anweisung 'set' erstellt eine Dateiposition nach dem letzten Datensatz in der Datei.
      • Wenn die nächste E/A-Operation eine Anweisung 'get previous' ist, ruft der generierte Code den letzten Datensatz in der Datei ab.
    • Eine erfolgreiche E/A-Anweisung, die keine Anweisung 'get previous' ist, erstellt eine neue Dateiposition, und eine nachfolgende Anweisung 'get previous', die dieselbe EGL-Datensatzvariable referenziert, versucht, einen Datensatz in Bezug auf die neue Position zu lokalisieren.
    • Gibt eine Anweisung 'get next' 'endOfFile' zurück, ruft die nachfolgende Anweisung 'get previous' den letzten Datensatz in der Datei ab.
    • Nach einer nicht erfolgreichen Anweisung 'get', 'get next' oder 'get previous' ist die Dateiposition nicht definiert und muss durch eine Anweisung 'set position' oder von einer E/A-Operation außer 'get next' oder 'get previous' erneut erstellt werden.
  • Wenn Sie einen Alternativindex verwenden und sich in der Datei doppelte Schlüssel befinden, gelten die folgenden Regeln:
    • Ein Datensatz mit einem niedrigerwertigen Schlüssel wird erst dann abgerufen, nachdem die get previous-Anweisungen alle Datensätze mit demselben Schlüssel wie dem des zuletzt abgerufenen Datensatzes gelesen haben. Die Reihenfolge, in der Datensätze mit doppelten Schlüsseln abgerufen werden, ist die Reihenfolge, in der EGL die Datensätze zurückgibt.
    • Der EGL-Fehlerwert 'duplicate' wird nicht gesetzt, wenn Ihr Programm den letzten Datensatz einer Gruppe von Datensätzen mit demselben Schlüssel abruft.
    • Wenn eine Anweisung 'get previous' auf eine erfolgreiche E/A-Operation (außer 'get previous') folgt, übergeht die Anweisung 'get previous' alle Datensätze mit doppeltem Schlüssel und ruft den Datensatz mit dem nächstniedrigeren Schlüssel ab.
Betrachten Sie eine Datei mit den folgenden Schlüsseln in einem Alternativindex:
  1, 2, 2, 2, 3, 4

Jede der nachfolgenden Tabellen zeigt, welche Auswirkungen die Ausführung einer Folge von EGL-Anweisungen auf denselben indexierten Datensatz hat.

Tabelle 3. Auswirkungen der Anweisungen 'get' und 'get previous' auf indexierte Datensätze
EGL-Anweisungen (in ihrer Reihenfolge) Schlüssel im indexierten Datensatz Schlüssel in dem von der Anweisung abgerufenen Dateidatensatz EGL-Fehlerwert
get 3 3 --
get previous Beliebig 2 (erster von dreien) duplicate
get previous Beliebig 2 (zweiter) duplicate
get previous Beliebig 2 (dritter) --
get previous Beliebig 1 --
get previous Beliebig -- endOfFile

Tabelle 4. Auswirkungen der Anweisungen 'set position' und 'get previous' auf indexierte Datensätze
EGL-Anweisungen (in ihrer Reihenfolge) Schlüssel im indexierten Datensatz Schlüssel in dem von der Anweisung abgerufenen Dateidatensatz EGL-Fehlerwert
set position 2 -- --
get next Beliebig 2 (erster) duplicate
get next Beliebig 2 (zweiter) duplicate
get previous Beliebig 1 --
get previous Beliebig -- endOfFile

Tabelle 5. Auswirkungen der Anweisungen 'set position' und 'get previous' auf indexierte Datensätze
EGL-Anweisungen (in ihrer Reihenfolge) Schlüssel im indexierten Datensatz Schlüssel in dem von der Anweisung abgerufenen Dateidatensatz EGL-Fehlerwert
set position 1 -- --
get previous Beliebig 1 --
get previous Beliebig -- endOfFile

Anweisung 'get' bei relativen Datensätzen

Wenn Sie eine Anweisung 'get' mit einer Variablen für einen relativen Datensatz verwenden, wird anhand des Datensatznummernfelds, das dem Datensatz zugeordnet ist, festgelegt, welcher Datensatz aus der Datei abgerufen wird. Das Datensatznummernfeld muss für alle Funktionen verfügbar sein, die den Datensatz verwenden. Folgende Felder sind möglich:
  • Ein Feld in demselben Datensatz.
  • Ein Feld in einem Datensatz, der für das Programm global oder für die Funktion, die die Anweisung 'get' ausführt, lokal ist.
  • Eine Variable, die für das Programm global oder für die Funktion, die die Anweisung 'get' ausführt, lokal ist.
Wenn Sie einen relativen Datensatz ersetzen oder löschen wollen, müssen Sie eine Anweisung 'get' mit der Option 'forUpdate' für den Datensatz ausgeben und anschließend die Anweisung 'replace' oder 'delete' ohne intervenierende E/A-Operation für dieselbe Datei ausgeben. Nach dem Absetzen der Anweisung 'get' wirkt sich die nächste E/A-Operation wie folgt auf dieselbe Datei aus:
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'replace' handelt, wird der Datensatz in der Datei geändert.
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'delete' handelt, wird der Datensatz in der Datei für Löschen markiert.
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'get' handelt, die die Option 'forUpdate' einschließt, ist eine nachfolgende Anweisung 'replace' oder 'delete' für den neu gelesenen Dateidatensatz gültig.
  • Wenn es sich bei der nächsten E/A-Operation für denselben EGL-Datensatz um eine Anweisung 'get' (ohne Option 'forUpdate') oder um eine Anweisung 'close' für dieselbe Datei handelt, wird die Datei oder der Datensatz ohne Änderung freigegeben.

Anweisung 'get next' bei relativen Datensätzen

Wenn Sie eine Anweisung 'get next' mit einem relativen Datensatz verwenden, hängt das Ergebnis von der aktuellen Dateiposition ab, die von einer erfolgreichen Ein-/Ausgabe-Operation wie beispielsweise einer Anweisung 'get' oder einer weiteren Anweisung 'get next' gesetzt wird. Es gelten die folgenden Regeln:
  • Wenn die Datei nicht offen ist, liest die Anweisung 'get next' den ersten Datensatz in der Datei.
  • Jede nachfolgende Anweisung 'get next' liest einen Datensatz mit dem nächsthöheren Datensatznummernwert bezogen auf die aktuelle Dateiposition.
  • Eine Anweisung 'get next' gibt nicht 'noRecordFound' zurück, wenn der nächste Datensatz gelöscht wurde. Stattdessen übergeht 'get next' gelöschte Datensätze und ruft den nächsten Datensatz in der Datei ab.
  • Die aktuelle Dateiposition wird von folgenden Operationen beeinflusst:
    • Eine erfolgreiche E/A-Anweisung, die keine Anweisung 'get next' ist, erstellt eine neue Dateiposition, und eine nachfolgende Anweisung 'get next', die denselben EGL-Datensatz referenziert, versucht, einen Datensatz auf Basis der neuen Dateiposition zu lokalisieren.
    • Nach einer nicht erfolgreichen Anweisung 'get' oder 'get next' ist die Dateiposition nicht definiert und muss durch eine E/A-Operation, die keine Anweisung 'get next' ist, erneut erstellt werden.
  • Nachdem eine Anweisung 'get next' den letzten Datensatz der Datei gelesen hat, führt die nächste Anweisung 'get next' zu den EGL-Fehlerwerten 'endOfFile' und 'noRecordFound'.

Anweisung 'get next' bei seriellen Datensätzen

Die Anweisung 'get' ist für serielle Datensätze nicht verfügbar.

Wenn eine Anweisung 'get next' für einen seriellen Datensatz ausgeführt wird, hängt das Ergebnis von der aktuellen Dateiposition ab, die von einer weiteren Anweisung 'get next' festgelegt wird. Es gelten die folgenden Regeln:
  • Wenn die Datei nicht offen ist, liest die Anweisung 'get next' den ersten Datensatz in der Datei.
  • Jede nachfolgende Anweisung 'get next' liest den nächsten Datensatz.
  • Nachdem eine Anweisung 'get next' den letzten Datensatz gelesen hat, führt die nachfolgende Anweisung 'get next' zum EGL-Fehlerwert 'endOfFile'.
  • Sobald das Programm den Operationsmodus für die Datei ändert (von Schreiben in Lesen bzw. von Lesen in Schreiben), wird die Datei von EGL geschlossen und erneut geöffnet. So schließt EGL beispielsweise die Datei, wenn Sie eine Anweisung 'add' verwenden, um Daten in einen seriellen Datensatz zu schreiben, und anschließend eine Anweisung 'get next' ausgeben, um Daten aus derselben Datei zu lesen. Eine Anweisung 'add', die auf eine Anweisung 'get next' folgt, fügt einen Datensatz am Anfang der Datei hinzu. Eine Anweisung 'get next', die auf eine Anweisung 'add' folgt, liest den ersten Datensatz in der Datei. Zu diesem Verhalten kommt es auch, wenn sich die Anweisungen 'get next' und 'add' in unterschiedlichen Programmen befinden und eines dieser Programme das andere aufruft.
Sie sollten vermeiden, eine Datei in mehreren Programmen gleichzeitig geöffnet zu haben.

Beispiel

Das folgende Beispiel zeigt, wie ein Datensatz aus einer indexierten Datei gelesen wird:
  myCustomer CustomerRecord;          // Datensatzariable erstellen
  myCustomer.customerNumber = 1001;   // Schlüssel in Datensatzvariablen setzen

  try
    get myCustomer;
  onException(fileErr FileIOException)
    myErrorHandler(fileErr);  // beendet das Programm
  end

Feedback