Hinweise zur Anweisung 'get' mit DL/I
Im Kontext von DL/I ruft die EGL-Anweisung 'get' ein einzelnes Segment in einer DL/I-Datenbank ab.
Die Anweisung schließt die Option 'forUpdate' ein, mit der Sie die gespeicherten Daten zu einem späteren Zeitpunkt in Ihrem Code ersetzen oder löschen können. Sie können diese Anweisung auch verwenden, um eine Gruppe von DL/I-Segmenten abzurufen und den Inhalt jedes nachfolgenden Segments in den nächsten DLISegment-Datensatz einer dynamischen Feldgruppe zu stellen.
Die Anweisung 'get' generiert eine DL/I-Anweisung 'get unique' (GU). Die Anweisung 'get...forUpdate' generiert eine DL/I-Anweisung GHU.
- Zum Lesen eines Segments, um mit den Daten aus dem Segment zu arbeiten, beispielsweise um einen Bericht oder eine Rechnung zu drucken.
- Zum temporären Blockieren (Halten) eines Segments (in Kombination mit der Option 'forUpdate'), um die EGL-Schlüsselwörter 'delete' oder 'replace' zu verwenden, um ein Segment zu entfernen oder zu aktualisieren. In den meisten Fällen brauchen Sie keine Anweisung 'get' auszuführen, bevor Sie einen Datensatz hinzufügen (add).
Ein Beispiel zur Verwendung der Anweisung 'get...forUpdate' mit DL/I finden Sie unter Hinweise zur Anweisung 'delete' mit DL/I.
get myCustomer, myLocation, myOrder;
EGL
generiert aus dieser Anweisung den folgenden DL/I-Pseudocode:GU STSCCST*D (STQCCNO = :myCustomer.customerNo)
STSCLOC*D (STQCLNO = :myLocation.locationNo)
STPCORD
Wenn Sie eine dynamische Feldgruppe aus DLISegment-Datensätzen als Objekt der Anweisung 'get' angeben, generieren Sie einen DL/I-Aufruf GU (get unique) für den ersten Datensatz in der Feldgruppe und einen Aufruf GN (get next) für jeden nachfolgenden Datensatz in der Feldgruppe. Wenn für die Feldgruppe keine Anzahl an Elementen angegeben ist, generiert die Anweisung so lange GN-Aufrufe, bis das Ende der DL/I-Datei erreicht ist oder bis ein Fehlercode auftritt.
Syntax

- Positionsoption
- Die Positionsoptionen 'next' und 'next inParent' sind mit der Anweisung 'get' in DL/I gültig. Weitere Informationen finden Sie unter 'Positionsoptionen' in diesem Thema.
- DLISegment-Variable
- Name der DLISegment-Variablen, die dem Segment entspricht, das Sie aus der Datenbank lesen wollen.
- forUpdate
- Option, die es Ihnen ermöglicht, zu einem späteren Zeitpunkt eine EGL-Anweisung 'replace' oder 'delete' für die Daten zu verwenden, die aus der Datei oder Datenbank abgerufen wurden.
- Die Option 'forUpdate' sperrt den Datensatz, sodass er von anderen Programmen erst dann geändert werden kann, nachdem eine Festschreibung (Commit) erfolgt ist. Weitere Informationen zur Commitverarbeitung finden Sie unter Logische Arbeitseinheit (LUW).
- usingPCB PCB-Name
- Option zum Angeben des Namens eines Programmkommunikationsblocks (PCB) gemäß Definition in Ihrem PSB-Datensatz (Programmspezifikationsblock), um diesen PCB anstelle des standardmäßigen PCB zu verwenden.
- with #dli{ DL/I-Anweisung }
- Option zur Verwendung einer expliziten DL/I-Anweisung GU oder GHU. Weitere Informationen finden Sie unter Direktive '#dli'. Zwischen '#dli' und der linken geschweiften Klammer darf kein Leerzeichen stehen.
- Dynamische_DLI-Feldgruppe
- Name einer dynamischen Feldgruppe, die aus DLISegment-Datensätzen besteht.
Positionsoptionen
Die Anweisung 'get next' generiert eine DL/I-Anweisung GN. Die Anweisung 'get next...forUpdate' generiert eine DL/I-Anweisung GHN. Die Anweisung liest das Segment, das unmittelbar auf das aktuelle Segment in der hierarchischen Reihenfolge folgt. Hierarchische Reihenfolge bedeutet, dass der Datenbankmanager beim Stammsegment beginnt und dann den Lesevorgang entlang der Hierarchie von oben nach unten so lange fortsetzt wie möglich, indem das erste untergeordnete Segment des ersten untergeordneten Segments gelesen wird usw., bis die unterste Ebene der Hierarchie erreicht wird. Anschließend wird der Lesevorgang nach oben fortgesetzt, bis ein paralleles untergeordnetes Element gefunden wird, das bisher noch nicht gelesen wurde. Dieses Segment wird dann mit allen untergeordneten Segmenten gelesen.
- Der Datenbankmanager liest zunächst das Stammsegment: Kundenname (customerName) und Kundenadresse (customerAddr).
- Der Datenbankmanager liest anschließend das erste Standortsegment (Location) für diesen Kunden, das erste Bestellsegment (Order) und alle Artikelsegmente (Item) für diese Bestellung.
- Wenn weitere Order-Segmente vorliegen, liest der Datenbankmanager das nächste Order-Segment und alle Item-Segmente für diese Bestellung. Wenn keine weiteren Order-Segmente für diesen Standort mehr vorliegen, geht es mit Schritt 4 weiter.
- Wenn weitere Location-Segmente vorliegen, liest der Datenbankmanager das nächste Location-Segment, das erste Order-Segment für diesen Standort und alle Item-Segmente für diese Bestellung. Dann geht es zurück zu Schritt 3. Wenn keine weiteren Location-Segmente mehr vorliegen, geht es weiter mit Schritt 5.
- Wenn weitere Customer-Segmente vorliegen, liest der Datenbankmanager das nächste Customer-Segment. Es geht zurück zu Schritt 2. Wenn keine weiteren Customer-Segmente vorliegen, hat der Manager die gesamte Datei gelesen.
DL/I unterstützt auch die Verwendung von Pfadaufrufen in get next-Anweisungen. Dies bedeutet, dass Sie übergeordnete Segmente für alle Segmentebenen zwischen dem Segment auf der niedrigsten Ebene und dem Stammelement lesen können.
// Definition von DLISegment-Datensätzen mithilfe der Eigenschaft 'hostVarQualifier'
Record CustomerRecordPart type DLISegment
{ segmentName="STSCCST", keyItem="customerNo", hostVarQualifier="myCustomer" }
...
end
Record LocationRecordPart type DLISegment
{ segmentName="STSCLOC", keyItem="locationNo", hostVarQualifier="myLocation" }
...
end
Record OrderRecordPart type DLISegment
{ segmentName="STPCORD", keyItem="orderDateNo", hostVarQualifier="myOrder" }
...
end
//Erstellung von Variablen für die Datensätze
myCustomer CustomerRecord;
myLocation LocationRecord;
myOrder OrderRecord;
//Erstellung eines Segmentsucharguments
myCustomer.customerNo = "005001";
myLocation.locationNo = "000022";
myOrder.orderDateNo = "20050730A003";
set myOrder position;
//Bestellungen (Orders) in einer Schleife durchlaufen
while (myOrder not noRecordFound)
try
get next myOrder;
onException
myErrorHandler(2);
end // Ende des try-Blocks
end // Ende von 'while'
GU STSCCST (STQCCNO = :myCustomer.customerNo)
STSCLOC (STQCLNO = :myLocation.locationNo)
STPCORD (STQCODN = :myOrder.orderDateNo)
Nach dem ersten Durchlaufen der Schleife verwendet EGL einen Aufruf GN.
- 'set record position' setzt ein Flag, um anzugeben, dass EGL die erste Anweisung 'get next' für den DLISegment-Datensatz in eine Anweisung 'get' (Aufruf GU) konvertieren soll.
- Wenn die nächste E/A-Anweisung für den DLISegment-Datensatz keine Anweisung 'get next' ist, wird die Anweisung 'set record position' ignoriert, und das Flag wird zurückgesetzt.
- Wenn die Anweisung 'get next' die Direktive '#dli' angibt, wird die Anweisung 'set record position' ignoriert, und das Flag wird zurückgesetzt.
Wenn Sie eine dynamische Feldgruppe aus DLISegment-Datensätzen als Objekt der Anweisung 'get next' angeben, generieren Sie einen DL/I-Aufruf GN (get next) für jeden Datensatz in der Feldgruppe. Wenn für die Feldgruppe keine Anzahl an Elementen angegeben ist, generiert die Anweisung so lange GN-Aufrufe, bis das Ende der DL/I-Datenbank erreicht ist oder bis ein Fehlercode auftritt. Um in dieser Situation ein besser vorhersehbares Verhalten zu erreichen, verwenden Sie die Anweisung 'get next inParent'.
Die Anweisung 'get next inParent' generiert eine DL/I-Anweisung GNP (wenn kein Änderungswert 'forUpdate' vorliegt) bzw. eine Anweisung GHNP (wenn ein Änderungswert 'forUpdate' vorliegt). Die Anweisung liest das nächste untergeordnete Segment, das dasselbe übergeordnete Segment aufweist wie das Segment an der aktuellen Datenbankposition. Sie können den Änderungswert 'next inParent' auch verwenden, um eine Gruppe von DL/I-Segmenten für eine dynamische Feldgruppe abzurufen.
Beispiel
emp.empnum = 1; // Legt den Schlüssel im Datensatz 'emp' (Mitarbeiter) fest
try
get emp forUpdate;
onException(dex DLIException)
myErrorHandler(dex); // beendet das Programm
end
emp.empname = emp.empname + " Smith";
try
replace emp;
onException(dex DLIException)
myErrorHandler(dex);
end
Kompatibilität
| Plattform | Problem |
|---|---|
| CICS für z/OS | Die Position für 'get' geht in den folgenden Fällen verloren:
|