[MULTI-FETCH-clause]
[RECORDS ] [IN ] [FILE ]
view-name
|
||||||||||||||
[PASSWORD= operand2]
|
||||||||||||||
[CIPHER= operand3]
|
||||||||||||||
[WITH
REPOSITION ]
|
||||||||||||||
[sequence/range-specification] | ||||||||||||||
[STARTING WITH
ISN= operand4]
|
||||||||||||||
[[IN ]
SHARED HOLD [MODE =option]]
|
||||||||||||||
[SKIP [RECORDS ] IN
HOLD ] |
||||||||||||||
[WHERE
logical-condition]
|
||||||||||||||
statement | ||||||||||||||
END-READ
|
(structured mode only) | |||||||||||||
LOOP |
(reporting mode only) |
Dieses Dokument behandelt folgende Themen:
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Verwandte Statements: ACCEPT/REJECT
|
AT BREAK
|
AT START OF DATA
|
AT END OF DATA
|
BACKOUT TRANSACTION
|
BEFORE BREAK PROCESSING
|
GET TRANSACTION DATA
|
DELETE
|
END TRANSACTION
|
FIND
|
HISTOGRAM
|
GET
|
GET SAME
|
LIMIT
|
PASSW
|
PERFORM BREAK PROCESSING
| READLOB
| RETRY
|
STORE
|
UPDATE
Gehört zur Funktionsgruppe: Datenbankzugriffe und Datenbankänderungen
Das Statement READ
dient dazu, Datensätze von der Datenbank
zu lesen. Die Datensätze können in physischer Reihenfolge, in der Reihenfolge
der Adabas-ISNs oder in der Reihenfolge der Werte eines Deskriptorfeldes
gelesen werden. Das READ
-Statement initiiert eine
Verarbeitungsschleife.
Siehe auch folgende Abschnitte im Leitfaden zur Programmierung.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | N | P | I | B * | ja | nein | ||||||||||||
operand2 | C | S | A | ja | nein | |||||||||||||||
operand3 | C | S | N | ja | nein | |||||||||||||||
operand4 | C | S | N | P | I | B * | ja | nein |
* Format B von
operand1
und
operand4
kann mit einer Länge von
kleiner gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung | ||
---|---|---|---|
operand1
|
Anzahl der zu lesenden Datensätze:
Sie können die Anzahl der Datensätze, die mit dem
Beispiel: READ (5) IN EMPLOYEES ... MOVE 10 TO CNT(N2) READ (CNT) EMPLOYEES ... Das angegebene Limit hat für dieses Statement Vorrang vor einem mit
einem Ist mit dem Profil-/Session-Parameter
Anmerkungen:
|
||
ALL
|
ALL-Option:
Um hervorzuheben, dass alle Datensätze gelesen werden
sollen, können Sie optional das Schlüsselwort Wenn Sie |
||
MULTI-FETCH-clause
|
Siehe MULTI-FETCH-Klausel. | ||
view-name
|
View-Name:
Als view-name geben Sie den Namen eines
Views an, der entweder in einem Im Reporting Mode ist view-name der Name
eines DDM, falls kein |
||
PASSWORD=operand2
|
PASSWORD- und CIPHER-Klauseln
Diese Klauseln gelten nur für Zugriffe auf Adabas- oder VSAM-Datenbanken. Mit Entire System Server können sie nicht verwendet werden. Die Die Weitere Informationen hierzu siehe Statements
|
||
WITH REPOSITION |
WITH REPOSITION-Option:
Diese Option macht das |
||
sequence/range-specification
|
Reihenfolge-/Bereichsangabe:
Diese Option gibt Lese-Reihefolge und -umfang an. Siehe Lesereihenfolge und -umfang. |
||
STARTING WITH
ISN=operand4
|
STARTING WITH ISN-Klausel:
Diese Klausel gilt nur für Adabas- und VSAM-Datenbanken. Zugriff auf Adabas
Diese Klausel kann in Verbindung mit einem
Logische Reihenfolge
Auch wenn das Die Klausel Alle Datensätze mit einem Deskriptorwert, der mit dem Startwert
identisch ist, und mit einer ISN, die kleiner gleich (größer
gleich für ein absteigendes
Physische Reihenfolge
Die Datensätze werden in der Reihenfolge zurückgegeben, in der sie
physisch gespeichert sind. Wenn eine Zugriff auf VSAM
Diese Klausel kann nur in physischer Reihenfolge verwendet werden.
Der angegebene Wert (operand4) steht für eine VSAM
RBA (relative Byte-Adresse von ESDS) oder RRN (relative Datensatznummer von
RRDS), die als Startwert für die Verwendung
Diese Klausel kann zum Repositionieren innerhalb einer
Die Klause kann auch hilfreich sein in einer verteilten Client/Server-Anwendung, in der das Lesen der Datensätze von einem Server-Programm und die weitere Verarbeitung der Datensätze von einem Client-Programm durchgeführt werden, wobei die Datensätze nicht alle auf einmal, sondern stapelweise verarbeitet werden. Beispiel: Siehe Programm |
||
[[IN] SHARED HOLD
[MODE=option]] |
SHARED HOLD-Klausel:
Anmerkung: Mit dieser Option können Sie die zurzeit gelesenen Datensätze in einen "Shared Hold"-Status setzen. Ein Datensatz kann durch viele Benutzer gleichzeitig in den "Shared Hold"-Status gesetzt werden. Solange sich ein Datensatz im "Shared Hold"-Status befindet, ist er vor Änderungen geschützt, weil er nicht durch zeitgleich arbeitende Benutzer in einen "Exclusive Hold"-Status gesetzt werden kann. Dadurch wird die Datenkonsistenz für die Daten des Datensatzes sichergestellt, weil niemand den Datensatz ändern kann, während er sich in Verarbeitung befindet. Insbesondere wenn auf denselben Datensatz mit mehreren Statements
zugegriffen wird, um verschiedene MU-/PE-Ausprägungen zu lesen ( Obwohl ein solcher Hold-Status eine effiziente Art ist,
Leseabfolgen zu schützen, ist es dennoch eine grundlegende und wichtige
Angelegenheit, den Datensatz aus dieser sanften Sperre wieder freizugeben. Da
dies von individuellen Aspekten der Anwendung abhängt, besteht die Möglichkeit,
mit Hilfe der |
||
MODE-Option
|
Sperrzeitraum
|
Erläuterung
|
|
C |
Nur zum Zeitpunkt des Lesens des Datensatzes; | Stellt sicher, dass die zurzeit gelesene Version des Datensatzes durch den letzten Änderer festgeschrieben worden ist. Diese Option setzt nicht wirklich eine Sperre, sondern prüft nur, ob der Datensatz zum Zeitpunkt des Lesens nicht durch einen anderen Benutzer in einem "Exclusive Hold"-Status gehalten wird. | |
Q |
solange bis der nächste Datensatz in einer Abfolge gelesen ist; | Gibt den Datensatz aus dem "Shared
Hold"-Status frei, wenn
|
|
S |
bis die logische Transaktion beendet ist. | Gibt den Datensatz aus dem "Shared
Hold"-Status frei, wenn eine logische Transaktion mit einem
END TRANSACTION - oder
BACKOUT
TRANSACTION -Statement beendet wird.
|
|
MODE=Q und
MODE=S stellen sicher, dass der zurzeit gelesene Datensatz solange
nicht gleichzeitig durch andere Benutzer geändert werden kann, bis er wieder
aus dem Hold-Status freigegeben worden ist.
Falls die Siehe auch Beispiel 8 - SHARED HOLD-Klausel weiter unten |
|||
SKIP RECORD(S) IN
HOLD |
SKIP RECORDS IN HOLD-Klausel:
Anmerkung: Immer wenn ein im Hold befindlicher Datensatz gelesen werden soll,
kann ein Natural-Fehler NAT3145 (Adabas-Rückmeldeschlüssel Gewiss ist der Natural-Fehler NAT3145 die angemessene Reaktion, um eine einwandfreie Datenverarbeitung sicherzustellen, jedoch kann es gelegentlich von Nutzen sein, dass ein im Hold befindlicher Datensatz übersprungen werden kann. Wenn es in Ordnung ist, dass ein solcher Datensatz nicht bearbeitet
und die Schleifenverarbeitung fortgesetzt wird, sollte die Wenn die Wenn die Fehlersituation für einen Natural-Fehler NAT3145 eintrifft, dann
Die Siehe auch Beispiel 9 - SKIP RECORDS-Klausel weiter unten |
||
WHERE
logical-condition
|
WHERE-Klausel:
Mit der Näheres zu logischen Bedingungen und die Syntax finden Sie unter Logische Bedingungen im Leitfaden zur Programmierung. Ist über ein |
||
END-READ
|
Ende des READ-Statements:
Im Structured Mode muss das für Natural reservierte Schlüsselwort
Im Reporting Mode wird das Natural-Statement
|
||
LOOP |
Anmerkung:
Diese Klausel kann nur bei Adabas- oder
DB2-Datenbanken benutzt werden.
MULTI-FETCH
|
|
Ausführliche Informationen siehe Multi-Fetch-Klausel (Adabas) im Leitfaden zur Programmierung oder Multiple Row Processing (SQL) im Natural for DB2-Teil der Database Management System Interfaces-Dokumentation.
Anmerkung:
Diese Option ist nur beim Zugriff auf Adabas-, VSAM-
oder DL/I-Datenbanken möglich.
Mit dieser Option können Sie innerhalb der aktiven
READ
-Schleife auf einen anderen Startwert für die zu lesenden
Datensätze repositionieren. Die Verarbeitung des READ
-Statements
wird dann unter Verwendung des neuen Startwerts fortgesetzt.
Die Repositionierung kann auf zwei verschiedene Arten ausgelöst werden,
wenn Sie ein READ
-Statement in Zusammenhang mit der WITH
REPOSITION
-Option verwenden:
Wenn ein ESCAPE TOP
REPOSITION
-Statement ausgeführt wird, verzweigt Natural
direkt zum Schleifenanfang und führt einen Neustart aus; d.h. dass die
Datenbank im Einklang mit dem aktuellen Inhalt der Suchwert-Variable auf einen
neuen Datensatz in der Datei repositioniert. Gleichzeitig wird der
Schleifenzähler *COUNTER
auf Null (0) zurückgesetzt.
Wenn eine READ
-Schleife versucht, den nächsten Datensatz
aus der Datenbank aufzurufen, und der Wert der Systemvariable
*COUNTER
Null (0) ist.
Anmerkung:
Wenn *COUNTER
innerhalb der aktiven
READ
-Schleife auf Null gesetzt wird, wird die Verarbeitung des
aktuellen Datensatzes fortgesetzt; es erfolgt keine sofortige Verzweigung zum
Schleifenanfang.
Wenn das READ
-Statement ein Schleifen-Limit hat (z.B.
READ (10) EMPLOYEES WITH REPOSITION ..
) und ein Neustart-Event
ausgelöst wurde, arbeitet die Schleife 10 neue Datensätze ab, egal wieviele
Datensätze bereits abgearbeitet worden sind, bis die Repositionierung erfolgt
ist.
Wenn ein ESCAPE TOP
REPOSITION
-Statement ausgeführt wird, die innerste Schleife
aber keine Repositionierung ausführen kann (da das Schlüsselwort WITH
REPOSITION
nicht im READ
-Statement gesetzt ist, oder es
sich beim abgesetzten Schleifen-Statement nicht um ein READ
handelt), wird ein entsprechender Laufzeitfehler ausgegeben.
Da das ESCAPE TOP
-Statement keine Referenzen erlaubt,
können Sie nur einen Repositionierungs-Event initiieren, wenn die innerste
Verarbeitungsschleife ein READ .. WITH REPOSITION
-Statement
ist.
Ein Repositionierungs-Event löst weder die Ausführung des
AT START OF
DATA
-Programmabschnittes aus, noch löst er die erneute
Verarbeitung des Schleifenlimit-Operanden aus (wenn es sich um eine Variable
handelt).
Wenn der Suchwert nicht geändert wurde, repositioniert die Schleife auf denselben Datensatz wie beim ursprünglichen Schleifenanfang.
Die folgenden Syntax-Optionen sind verfügbar, um Lese-Reihenfolge und/oder -Bereich anzugeben.
Syntax-Option 1:
[IN ] [PHYSICAL ]
|
[SEQUENCE ]
|
Syntax-Option 2:
|
|||||||||||||||||
ISN
|
operand6 | operand7 | |||||||||||||||
Syntax-Option 3:
[IN ]
[LOGICAL ]
|
[SEQUENCE ]
|
descriptor | ||||||||||||
|
operand6 | operand7 | ||||||||||||
|
operand6
TO operand7
|
|||||||||||||
|
operand6 |
Anmerkungen:
ENDING
AT
, THRU
und TO
nicht benutzt werden. Diese
Vergleichsoperanden gelten auch beim HISTOGRAM
-Statement.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand5 | S | A | ja | nein | ||||||||||||||||
operand6 | C | S | A | N | P | I | F | B * | D | T | L | ja | nein | |||||||
operand7 | C | S | A | N | P | I | F | B * | D | T | L | ja | nein |
* Format B von operand6 und operand7 kann nur mit einer Länge von kleiner gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
READ IN PHYSICAL
SEQUENCE
|
Lesen in physischer Reihenfolge:
Anmerkung: Ist nichts anderes angegeben, gilt standardmäßig |
READ BY
ISN
|
Lesen nach ISN:
Anmerkung: |
READ IN LOGICAL
SEQUENCE
|
Lesen in logischer Reihenfolge:
Wenn Sie ein Deskriptorfeld angeben, werden die Datensätze in der Wertabfolge dieses Feldes gelesen. Als Feld können Sie einen Deskriptor, Subdeskriptor, Superdeskriptor oder Hyperdeskriptor verwenden, nicht aber einen phonetischen Deskriptor, einen Deskriptor innerhalb einer Periodengruppe oder einen Superdeskriptor, der ein Periodengruppenfeld enthält. Wenn Sie kein Deskriptorfeld angeben, wird der im verwendeten DDM
eingetragene Standarddeskriptor (Feld Anmerkungen:
Informationen zu |
ASCENDING |
DESCENDING | VARIABLE | DYNAMIC SEQUENCE
|
Lesen in aufsteigender/absteigender
Reihenfolge:
Diese Klausel gilt nur für Adabas-, XML-,
VSAM- und SQL-Datenbanken. Bei einem Mit dieser Klausel können Sie bestimmen, ob die Datensätze in aufsteigender Reihenfolge oder in absteigender Reihenfolge gelesen werden sollen.
Anmerkungen:
|
STARTING FROM ... ENDING
AT/TO |
STARTING FROM/ENDING AT-Klausel:
Mit den Klauseln Die Um die Datensätze auf einen Endwert zu begrenzen, können Sie eine
|
THRU/ENDING
AT
|
THRU/ENDING AT-Option:
Wenn Um das Ende des zu lesenden Wertebereichs zu bestimmen, liest
Natural intern einen Datensatz über den Endwert hinaus ein. Wenn Sie die
|
TO
|
TO-Option:
Wenn das Schlüsselwort |
Die folgende Liste beschreibt die Funktionsunterschiede zwischen der
Benutzung der Option THRU/ENDING
AT
und der Option TO
.
THRU/ENDING AT | TO |
---|---|
Wenn die READ -Schleife beendet wird, weil der
Endwert erreicht worden ist, enthält der View den ersten Datensatz, der
außerhalb des Bereiches ist (Out-of-Range).
|
Wenn die READ -Schleife beendet wird, weil der
Endwert erreicht worden ist, enthält der View den letzten Datensatz des
angegebenen Bereiches.
|
Wenn eine Endwert-Variable im Verlauf einer
READ -Schleife geändert wird, wird beim nächsten gelesenen
Datensatz der neue Wert für eine Endwerte-Prüfung benutzt.
|
Die Endwert-Variable wird erst beim
READ -Schleifenstart verarbeitet. Alle weiteren Änderungen im
Verlauf der READ -Schleife haben keine Auswirkung.
|
Ein falsch angegebener Bereich (z.B. READ .. ='B' THRU
'A' ) führt nicht zu einem Datenbank- Fehler, sondern dazu, dass einfach
kein Datensatz zurückgegeben wird.
|
Ein falsch angegebener Bereich führt zu einem Datenbank-Fehler
(z.B. Adabas RC=61 ), weil ein Wertebereich nicht in absteigender
Reihenfolge angegeben werden darf.
|
Wenn ein READ .. DESCENDING mit Start- und
Endwert benutzt wird, wird der Startwert zur Positionierung in der Datei
benutzt, wohingegen der Endwert von Natural zum Abprüfen auf das Bereichsende
(End-of-Range) hin benutzt wird. Deshalb ist der Startwert höher als der oder
gleich dem Endwert.
|
Da beide Werte an die Datenbank übergeben werden, müssen sie in aufsteigender Reihenfolge erscheinen. Mit anderen Worten, der Startwert ist niedriger als der oder gleich dem Endwert, egal ob in aufsteigender oder in absteigender Reihenfolge gelesen wird. |
Um auf einen Bereichsüberlauf hin abzuprüfen, muss der Deskriptorwert in dem zugrunde liegenden Datenbank-View erscheinen, d.h. er muss im Satzpuffer zurückgegeben werden. | Der Deskriptor ist für die zurückgegebenen Satzfelder nicht erforderlich. |
Endwerte-Prüfungen auf Adabas-Mehrwertfelder (MU-Feld) oder
Sub-/Super-/Hyperdeskritporen hin ist nicht möglich und führt zum Syntaxfehler
NAT0160 bei der Kompilierung des Programms.
|
Sie können einen Endwert für MU-Felder und Sub-/Super-/Hyperdeskriptoren angeben. |
Kann für alle Datenbanken benutzt werden. | Kann nur für Adabas Version 7 (oder höher), DB2, VSAM or DL/I benutzt werden. |
Anmerkung:
Das Ergebnis von READ
/HISTOGRAM
THRU
/ENDING AT
kann vom Ergebnis bei
READ
/HISTOGRAM
TO
abweichen, wenn
Natural und die Datenbank, auf die zugegriffen wird, sich auf verschiedenen
Plattformen mit unterschiedlichen Sortierfolgen befinden.
Die Natural-Systemvariablen *ISN
und
*COUNTER
stehen mit dem READ
-Statement zur Verfügung. Format/Länge dieser
Systemvariablen ist P10.
Format und Länge können nicht geändert werden.
Die Systemvariablen werden folgendermaßen verwendet:
Systemvariable | Erläuterung |
---|---|
*ISN |
Die Systemvariable Anmerkungen:
|
*COUNTER |
Die Systemvariable *COUNTER
enthält die Anzahl, wie oft die Verarbeitungsschleife durchlaufen wurde.
|
** Example 'REAEX1S': READ (structured mode) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 1 VEHIC-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID 2 MAKE END-DEFINE * LIMIT 3 * WRITE 'READ IN PHYSICAL SEQUENCE' READ EMPLOY-VIEW IN PHYSICAL SEQUENCE DISPLAY NOTITLE PERSONNEL-ID NAME *ISN *COUNTER END-READ * WRITE / 'READ IN ISN SEQUENCE' READ EMPLOY-VIEW BY ISN STARTING FROM 1 ENDING AT 3 DISPLAY PERSONNEL-ID NAME *ISN *COUNTER END-READ * WRITE / 'READ IN NAME SEQUENCE' READ EMPLOY-VIEW BY NAME DISPLAY PERSONNEL-ID NAME *ISN *COUNTER END-READ * WRITE / 'READ IN NAME SEQUENCE STARTING FROM ''M''' READ EMPLOY-VIEW BY NAME STARTING FROM 'M' DISPLAY PERSONNEL-ID NAME *ISN *COUNTER END-READ * END
Ausgabe des Programms REAEX1S
:
PERSONNEL NAME ISN CNT ID --------- -------------------- ----------- ----------- READ IN PHYSICAL SEQUENCE 50005800 ADAM 1 1 50005600 MORENO 2 2 50005500 BLOND 3 3 READ IN ISN SEQUENCE 50005800 ADAM 1 1 50005600 MORENO 2 2 50005500 BLOND 3 3 READ IN NAME SEQUENCE 60008339 ABELLAN 478 1 30000231 ACHIESON 878 2 50005800 ADAM 1 3 READ IN NAME SEQUENCE STARTING FROM 'M' 30008125 MACDONALD 923 1 20028700 MACKARNESS 765 2 40000045 MADSEN 508 3
Äquivalentes Reporting-Mode-Beispiel: REAEX1R
.
DEFINE DATA LOCAL 1 MYVIEW VIEW OF ... 2 NAME 1 #STARTVAL (A20) INIT <'A'> 1 #ATTR (C) END-DEFINE ... SET KEY PF3 ... READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL INPUT (IP=OFF AD=O) 'NAME:' NAME / 'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) / 'Press PF3 to stop' IF *PF-KEY = 'PF3' THEN STOP END-IF IF #ATTR MODIFIED THEN ESCAPE TOP REPOSITION END-IF END-READ ...
DEFINE DATA LOCAL 1 MYVIEW VIEW OF ... 2 NAME 1 #STARTVAL (A20) INIT <'A'> 1 #ATTR (C) END-DEFINE ... SET KEY PF3 ... READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL INPUT (IP=OFF AD=O) 'NAME:' NAME / 'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) / 'Press PF3 to stop' IF *PF-KEY = 'PF3' THEN STOP END-IF IF #ATTR MODIFIED THEN RESET *COUNTER END-IF END-READ ...
Das folgende Beispiel verwendet zunächst ein
READ
-Statement, um Datensätze von der Datei EMPLOYEES
(Mitarbeiter) in logischer Reihenfolge der Werte des Deskriptorfeldes
NAME
zu lesen. Dann werden mit einem FIND
-Statement
Datensätze von der Datei VEHICLES
(Fahrzeuge) gelesen, wobei die
Personalnummer (PERSONNEL−ID
) der EMPLOYEES
-Datei als
Suchkriterium benutzt wird.
Der erzeugte Report zeigt den Namen und die Personalnummer aller von
der EMPLOYEES
-Datei gelesenen Personen sowie die Fabrikate
(MAKE
) der Autos (von der VEHICLES
-Datei), die im
Besitz dieser Personen sind. Besitzt eine Person mehrere Autos, werden
entsprechend mehrere Zeilen pro Person ausgegeben.
** Example 'REAEX2': READ and FIND combination ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 FIRST-NAME 2 NAME 2 CITY 1 VEH-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID 2 MAKE END-DEFINE * LIMIT 10 * RD. READ EMPLOY-VIEW BY NAME STARTING FROM 'JONES' SUSPEND IDENTICAL SUPPRESS FD. FIND VEH-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (RD.) IF NO RECORDS FOUND ENTER END-NOREC DISPLAY NOTITLE (ES=OFF IS=ON ZP=ON AL=15) PERSONNEL-ID (RD.) FIRST-NAME (RD.) MAKE (FD.) (IS=OFF) END-FIND END-READ END
Ausgabe des Programms REAEX2
:
PERSONNEL FIRST-NAME MAKE ID --------------- --------------- --------------- 20007500 VIRGINIA CHRYSLER 20008400 MARSHA CHRYSLER CHRYSLER 20021100 ROBERT GENERAL MOTORS 20000800 LILLY FORD MG 20001100 EDWARD GENERAL MOTORS 20002000 MARTHA GENERAL MOTORS 20003400 LAUREL GENERAL MOTORS 30034045 KEVIN DATSUN 30034233 GREGORY FORD 11400319 MANFRED
** Example 'READSCND': READ (with DESCENDING SEQUENCE) ************************************************************************ DEFINE DATA LOCAL 1 EMPL VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 BIRTH END-DEFINE * READ (10) EMPL IN DESCENDING SEQUENCE BY NAME FROM 'ZZZ' DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) END-READ END
** Example 'REAVSEQ': READ (with VARIABLE SEQUENCE) ************************************************************************ DEFINE DATA LOCAL 1 EMPL VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 BIRTH * 1 #DIR (A1) 1 #STARTVALUE (A20) END-DEFINE * SET KEY PF7 PF8 * INPUT 'Select READ direction' // 'Press' 08T 'PF7' (I) 21T 'to read backward' / 08T 'PF8' (I) 'or' 'ENTER' (I) 21T 'to read forward' * IF *PF-KEY = 'PF7' MOVE 'D' TO #DIR MOVE 'ZZZ' TO #STARTVALUE ELSE MOVE 'A' TO #DIR MOVE 'A' TO #STARTVALUE END-IF * READ (10) EMPL IN VARIABLE #DIR SEQUENCE BY NAME FROM #STARTVALUE DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) END-READ END
DEFINE DATA LOCAL 1 #DIRECTION (A1) INIT <'A'> /* 'A' = ASCENDING 1 #EMPVIEW VIEW OF EMPLOYEES 2 NAME ... END-DEFINE ... READ #EMPVIEW IN DYNAMIC #DIRECTION SEQUENCE BY NAME = 'SMITH' INPUT (AD=O) NAME / 'Press PF7 to scroll in DESCENDING sequence' / 'Press PF8 to scroll in ASCENDING sequence' .. IF *PF-KEY = 'PF7' THEN MOVE 'D' TO #DIRECTION END-IF IF *PF-KEY = 'PF8' THEN MOVE 'A' TO #DIRECTION END-IF END-READ ...
** Example 'REASISND': READ (with STARTING WITH ISN) ************************************************************************ DEFINE DATA LOCAL 1 EMPL VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 BIRTH * 1 #DIR (A1) 1 #STARTVAL (A20) 1 #STARTISN (N8) END-DEFINE * SET KEY PF3 PF7 PF8 * MOVE 'ADKINSON' TO #STARTVAL * READ (9) EMPL BY NAME = #STARTVAL WRITE *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) *COUNTER IF *COUNTER = 5 THEN MOVE NAME TO #STARTVAL MOVE *ISN TO #STARTISN END-IF END-READ * #DIR := 'A' * REPEAT READ EMPL IN VARIABLE #DIR BY NAME = #STARTVAL STARTING WITH ISN = #STARTISN MOVE NAME TO #STARTVAL MOVE *ISN TO #STARTISN INPUT NO ERASE (IP=OFF AD=O) 15/01 *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) // 'Direction:' #DIR // 'Press PF3 to stop' / ' PF7 to go step back' / ' PF8 to go step forward' / ' ENTER to continue in that direction' /* IF *PF-KEY = 'PF7' AND #DIR = 'A' MOVE 'D' TO #DIR ESCAPE BOTTOM END-IF IF *PF-KEY = 'PF8' AND #DIR = 'D' MOVE 'A' TO #DIR ESCAPE BOTTOM END-IF IF *PF-KEY = 'PF3' STOP END-IF END-READ /* IF *COUNTER(0290) = 0 STOP END-IF END-REPEAT END
READ EMPL-VIEW WITH NAME = ... IN SHARED HOLD MODE=Q /* Record in shared hold until next record is read. ... GET EMPL-VIEW *ISN /* The record remains unchanged! ... END-READ
READ EMPL-VIEW WITH NAME = ... /* Records found are put in hold while reading. SKIP RECORDS IN HOLD /* Records already held by other users are skipped ... /* to prevent error NAT3145. UPDATE END TRANSACTION END-READ