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

- 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.
- Lesen der ersten Datenzeile aus der Datei.
- 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.
- 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.
- Erstellen eines neuen Feldgruppenelements (eines CSV-Datensatzes; CSVRecord).
- Verwenden der Anweisung 'get next' zum Lesen des nächsten Datensatzes.
- Konvertieren der Zeichenfolgen in der Zeile und Speichern dieser Zeichenfolgen in den Datensatzfeldern (wie oben).
- 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 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
- 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'.
- 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.
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.
| 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 | -- |
| 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 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.
- 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 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.
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.
| 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 |
| 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 |
| 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
- 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 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 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 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.
Beispiel
myCustomer CustomerRecord; // Datensatzariable erstellen
myCustomer.customerNumber = 1001; // Schlüssel in Datensatzvariablen setzen
try
get myCustomer;
onException(fileErr FileIOException)
myErrorHandler(fileErr); // beendet das Programm
end