Datensätze lesen und schreiben

Das Akronym CRUD bezieht sich auf die Basisfunktionen für die Ein-/Ausgabe, die Sie normalerweise für Datensätze in einer Datei ausführen. In der folgenden Tabelle sind die CRUD-Funktionen und die EGL-Schlüsselwörter angegeben, die diese Funktionen bereitstellen:

Tabelle 1. CRUD-Funktionen in EGL
CRUD-Funktion EGL-Schlüsselwort
Create (= Erstellen) add
Read (= Lesen) get
Update (= Aktualisieren) replace
Delete (= Löschen) delete

EGL passt darüber hinaus die Art der Ausführung dieser Funktionen an den jeweiligen Dateityp an, mit dem Sie gerade arbeiten. Falls Sie beispielsweise eine Anweisung get next für eine SQL-Datenbank schreiben, generiert EGL eine Reihe von SQL-Anweisungen, um die entsprechende Zeile in einer SQL-Ergebnismenge zu suchen und aus ihr abzurufen. Wird dieselbe EGL-Anweisung für eine sequenzielle Datei generiert, wird einfach der nächste Datensatz in der Datei gelesen.

EGL setzt diese Tasks mit Hilfe von Stereotypen um. Ein Stereotyp ist ein allgemeines Muster, mit dem Sie ein einzelnes Element kennzeichnen können. Wenn Sie einen Stereotyp auf einen Datensatz anwenden, teilen Sie EGL mit, wie Ein-/Ausgabefunktionen ausgeführt werden sollen, an denen dieser Datensatz beteiligt ist. Weitere Informationen zu Stereotypen finden Sie unter Einführung in Datensatzabschnitte sowie in den Abschnitten für bestimmte Stereotypen der EGL-Sprachreferenz.

Verarbeitungszyklus für die Ein-/Ausgabe

Bei einer bestehenden Datenbank (in der Regel durch einen Datenbankadministrator erstellt) umfasst die reguläre Verarbeitung normalerweise die Funktionen für Erstellung (Create), Lesevorgänge (Read), Aktualisierung (Update) und Löschvorgänge (Delete), die kurz auch als 'CRUD-Funktionen' bezeichnet werden. Spezifischere Beispiele enthalten die Abschnitte über bestimmte Datenzugriffstechnologien. Das folgende allgemeine Szenario ist nur deshalb möglich, weil EGL die Implementierungsdetails so effizient für den Benutzer verdeckt.

Definieren Sie zunächst einen Datensatz. Dies muss außerhalb aller anderen Abschnitte erfolgen:
package com.companyb.customer

Record CustomerRecord type Stereotype
  customerNumber INT;
  customerName STRING;
  customerBalance MONEY;
end

Die Details des Datensatzes und seine Eigenschaften variieren abhängig davon, wie Sie ihn einsetzen wollen.

Deklarieren Sie anschließend im Hauptteil des Programms eine Variable, die auf diesem Datensatzabschnitt basiert:
myCustomer CustomerRecord;
Damit in diesem Beispiel vorhandene Kundenstammdaten (CustomerRecord) gefunden werden können, benötigen Sie einen eindeutigen Bestandteil der Informationen zum Datensatz. In der Regel ist dies eine Art von ID-Nummer, die häufig als Schlüssel für die Datei verwendet wird. Ein Schlüssel ist ein Datenteil, mit dessen Hilfe eine Datei indexiert wird, damit nicht jeder Datensatz angezeigt werden muss, um den gewünschten Datensatz zu finden. Angenommen, Sie haben separat eine Funktion namens getCustomer() geschrieben, die den Benutzer für eine Kundennummer abfragt und diese Nummer zurückgibt:
myCustomer.customerNumber = getCustomer();
Um die Informationen zu lesen, die mit der angeforderten Nummer übereinstimmen, definieren Sie einfach den folgenden Code:
get myCustomer forUpdate;

EGL generiert den entsprechenden Code, um die Daten aus der Datei oder der Datenbank zu lesen, und stellt anschließend die Informationen in Ihre Datensatzvariable. Das Schlüsselwort forUpdate weist EGL an, eine Sperre für die Daten zu setzen, damit Sie die Möglichkeit erhalten, die Daten zu ersetzen oder zu löschen.

Anschließend können Sie die Informationen für den Benutzer mit der Option bereitstellen, die Daten zu ändern. Angenommen, Sie haben separat eine Funktion namens showCustomer() geschrieben, die den Wert –1 zurückgibt, falls der Benutzer den Datensatz löschen will, oder den Wert 0, falls der Datensatz nicht geändert wird, oder den Wert 1, falls der Benutzer Änderungen am Datensatz vorgenommen hat:
case (showCustomer(myCustomer))
  when (-1)
    delete myCustomer;
  when (1)
    replace myCustomer;
end
Falls Sie Fehler behandeln (siehe Fehler behandeln), können Sie die von der Funktion getCustomer() zurückgegebene Zahl noch weiter verarbeiten. Angenommen, Sie haben separat eine Funktion namens getReply() geschrieben, die den Wert TRUE oder FALSE abhängig davon zurückgibt, ob der Benutzer die ausgegebene Frage mit Y (für 'Ja') oder N (für 'Nein') beantwortet:
set myCustomer empty;            // all fields blank or 0
myCustomer.customerNumber = getCustomer();   // sets cust #
  
try
  get myCustomer forUpdate;
onException (ex AnyException)      // couldn't get the record
  if(myCustomer is noRecordFound)  // because customer # not on file
    if(getReply("Soll dieser Kunde hinzugefügt werden?  (y/n)") == TRUE)
      showCustomer(myCustomer);    // let user fill in remaining fields
      add myCustomer;
    end
  else
    myErrorHandler(ex);
end

Mit diesen wenigen Codezeilen haben Sie den Kern eines Kundendateiserviceprogramms erstellt, das Sie mit einer SQL-Datenbank oder einer eigenen indexierten VSAM-Datei verwenden können. Der einzige Unterschied zwischen VSAM und SQL besteht bei Ihrem Programm in dem Stereotyp, den Sie auf die Definition der Kundenstammdaten anwenden.


Feedback