[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 einer View (Datenbanksicht) an, die 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 Datenbankmanagementsystem-Schnittstellen-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 die View (Datenbanksicht) 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 die 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 View (Datenbanksicht) 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