|
|
|
[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 [(r)]
|
(structured mode only) | |||||||||||||
LOOP [(r)] |
(reporting mode only) | |||||||||||||
Dieser Abschnitt 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
(Datensicht) 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
(r)
|
Ende des READ-Statements:
Im Structured Mode muss das für Natural reservierte Schlüsselwort
Im Structured Mode können Sie bei Im Reporting Mode wird das Natural-Statement Im Reporting Mode können Sie bei |
||
LOOP
(r)
|
|||
Weitere Syntax-Element-Beschreibungen:
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 Verarbeitung mehrerer Zeilen (SQL) im Natural for Db2-Teil der Datenbankmanagementsystem-Schnittstellen-Dokumentation.
Anmerkung
Diese Option ist nur beim Zugriff auf Adabas- oder VSAM-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.
Anmerkungen:
ENDING AT, THRU und
TO nicht benutzt werden. Diese Vergleichsoperanden gelten auch beim
HISTOGRAM-Statement.
[IN] [PHYSICAL]
|
|
|
[SEQUENCE]
|
[IN] [ISN]
|
|
|
[SEQUENCE]
|
||||||||||||||
|
|
|
ISN
|
|
|
|
|
operand6 |
|
|
|
|
|
operand7 |
|
|
||
TO
|
operand7 | ||||||||||||||||
[IN] [LOGICAL]
|
|
|
[SEQUENCE]
|
|
|
descriptor | ||||||||
|
|
|
|
|
|
operand6 |
|
|
|
|
operand7 |
|
|
||
|
|
|
|
operand6
TO
operand7
|
|||||||||||
|
|
|
|
operand6 | |||||||||||
| 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 |
|---|---|
READ IN PHYSICAL SEQUENCE
|
Lesen in physischer Reihenfolge:
Anmerkung Ist nichts anderes angegeben, gilt standardmäßig |
READ BY ISN
|
Lesen nach ISN:
Für
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 In einem Mit dieser Klausel können Sie bestimmen, ob die Datensätze in aufsteigender oder absteigender Reihenfolge gelesen werden sollen.
|
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 Bei Verwendung in READ BY DESCRIPTOR
Um das Ende des zu lesenden Wertebereichs zu bestimmen, liest Natural
intern einen Datensatz über den Endwert hinaus ein. Wenn Sie die
Bei Verwendung in READ BY ISN
Bei Vorhandensein von "ISN verfügbar als Endwert" verlässt
Natural die Bei Nichtvorhandensein von "ISN verfügbar als Endwert" liest
Natural einen Datensatz nach dem Endwert. Dies ist bei aufsteigender
(
|
TO
|
TO-Option:
Wenn das Schlüsselwort Bei Verwendung in READ BY DESCRIPTOR
Unabhängig davon, ob in aufsteigender ( Bei Verwendung von READ BY ISN
Wie bei In einem |
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 (Datensicht) 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 der 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, oder VSAM 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
** Example 'READVISN': READ with DESCENDING/VARIABLE BY ISN ** ** Note: The ASCENDING and DESCENDING order for READ BY ISN can only be ** applied to ADABAS 8.6 (or higher) on mainframes. ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME * 1 #DIR-ASCENDING (A1) CONST<'A'> 1 #DIR-DESCENDING (A1) CONST<'D'> * END-DEFINE * WRITE 'READ with ASCENDING BY ISN = 500' READ (5) EMPLOY-VIEW ASCENDING BY ISN = 500 DISPLAY NOTITLE *ISN NAME FIRST-NAME END-READ * WRITE / 'READ with DESCENDING BY ISN = 500' READ (5) EMPLOY-VIEW DESCENDING BY ISN = 500 DISPLAY *ISN NAME FIRST-NAME END-READ * WRITE / 'READ with VARIABLE ascending BY ISN = 500' READ (5) EMPLOY-VIEW VARIABLE #DIR-ASCENDING BY ISN = 500 DISPLAY *ISN NAME FIRST-NAME END-READ * WRITE / 'READ with VARIABLE descending BY ISN = 500' READ (5) EMPLOY-VIEW VARIABLE #DIR-DESCENDING BY ISN = 500 DISPLAY *ISN NAME FIRST-NAME END-READ END *
Ausgabe des Programms READVISN:
ISN NAME FIRST-NAME
----------- -------------------- --------------------
READ with ASCENDING BY ISN = 500
500 JENSEN HANS
501 JENSEN CLAUS
502 SOERENSEN KARL
503 ERIKSSEN JONAS
504 ANDERSEN ANITA
READ with DESCENDING BY ISN = 500
500 JENSEN HANS
499 MARTINEZ MANUEL
498 OSEA ROBERTO
497 FERNANDEZ CARMEN
496 DE LA IGLESIA JORGE
READ with VARIABLE ascending BY ISN = 500
500 JENSEN HANS
501 JENSEN CLAUS
502 SOERENSEN KARL
503 ERIKSSEN JONAS
504 ANDERSEN ANITA
READ with VARIABLE descending BY ISN = 500
500 JENSEN HANS
499 MARTINEZ MANUEL
498 OSEA ROBERTO
497 FERNANDEZ CARMEN
496 DE LA IGLESIA JORGE