READ
|
ALL
|
[MULTI-FETCH-clause]
[RECORDS ] [IN ] [FILE ]
view-name
|
||||||
BROWSE
|
(operand1) | |||||||
[PASSWORD= operand2]
|
||||||||
[CIPHER= operand3]
|
||||||||
[WITH
REPOSITION ]
|
||||||||
[sequence/range-specification] | ||||||||
[STARTING WITH
ISN= operand4]
|
||||||||
[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 | 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 Abschnitt READ-Statement 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 and operand4 kann mit einer Länge von kleiner gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
operand1 |
Anzahl der zu lesenden Datensätze:
Sie können die Anzahl der Datensätze, die mit dem
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 | Um hervorzuheben, dass alle Datensätze gelesen werden
sollen, können Sie optional das Schlüsselwort ALL angeben.
|
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 |
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 | Diese Option macht das READ -Statement empfänglich
für Repositionierungsereignisse. Siehe WITH REPOSITION
Option.
|
sequence/range-specification | Diese Option gibt Lese-Reihefolge und -umfang an. Siehe Lesereihenfolge und -umfang. |
STARTING WITH ISN=operand4 |
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 |
WHERE logical-condition | Siehe WHERE-Klausel. |
END-READ | Das für Natural reservierte Schlüsselwort END−READ
muss zum Beenden des READ -Statements benutzt werden.
|
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:
READ IN PHYSICAL SEQUENCE |
Anmerkung: Ist nichts anderes angegeben, gilt standardmäßig |
---|---|
READ BY ISN |
Anmerkung: |
READ IN LOGICAL SEQUENCE |
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 |
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 |
Mit den Klauseln Die Um die Datensätze auf einen Endwert zu begrenzen, können Sie eine
|
THRU/ENDING AT |
Wenn Um das Ende des zu lesenden Wertebereichs zu bestimmen, liest
Natural intern einen Datensatz über den Endwert hinaus ein. Wenn Sie die
|
TO |
Wenn das Schlüsselwort Die |
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. |
WHERE
logical-condition
|
Mit der WHERE-Klausel können Sie ein zusätzliches Selektionskriterium
in Form einer logischen Bedingung
(logical-condition) angeben. Diese wird ausgewertet,
nachdem ein Wert gelesen wurde, aber bevor eine weitere
Verarbeitung auf der Grundlage dieses Wertes (einschließlich
AT BREAK
-Verarbeitung)
erfolgt.
Näheres zu logischen Bedingungen finden Sie unter Logische Bedingungen im Leitfaden zur Programmierung.
Ist über ein LIMIT
-Statement oder eine
Limit-Notation die Anzahl der zu lesenden Datensätze begrenzt, so werden bei
einem READ
-Statement, das eine WHERE
-Klausel enthält,
Datensätze, die aufgrund der WHERE
-Bedingung nicht
weiterverarbeitet werden, bei der Ermittlung des Limits nicht mitgezählt.
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:
*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