OBTAIN
operand1
|
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Gehört zur Funktionsgruppe: Reporting Mode-Statements
Dieses Dokument behandelt folgende Themen:
Das Statement OBTAIN
dient dazu, ein oder mehrere
Datenbankfelder zu lesen. Das OBTAIN
-Statement erzeugt keinen
ausführbaren Code im Natural-Objektprogramm. Es wird in erster Linie benutzt,
um einen Wertebereich eines multiplen Feldes oder einen Bereich von
Ausprägungen einer Periodengruppe zu lesen, so dass Teile dieser Bereiche
nacheinander im Programm referenziert werden können.
Ein OBTAIN
-Statement ist für jedes im Programm zu
referenzierende Datenbankfeld nicht erforderlich, da Natural ja automatisch
jedes in einem nachfolgenden Statement referenzierte Datenbankfeld liest (zum
Beispiel, ein DISPLAY
-
oder COMPUTE
-Statement).
Wenn multiple Felder oder Periodengruppen in der Form eines Arrays
referenziert werden, muss das Array mit einem OBTAIN
-Statement
definiert werden, um sicher zu stellen, dass es für alle Ausprägungen des
Feldes erstellt ist. Wenn einzelne multiple Felder oder Periodengruppen
referenziert werden, bevor das Array definiert wird, werden die Felder nicht
innerhalb des Arrays positioniert und existieren unabhängig vom Array. Die
Felder enthalten denselben Wert wie die entsprechende Ausprägung innerhalb des
Arrays.
Einzelne Ausprägungen oder multiple Felder oder Periodengruppen oder Subarrays können innerhalb eines vorher definierten Arrays gehalten werden, wenn die Array-Dimensionen der zweiten individuellen Ausprägung oder das Array innerhalb des ersten Arrays enthalten sind.
Referenzen auf multiple Felder oder Periodengruppen mit eindeutigem variablen Index können nicht in einem Array von Werten enthalten sein. Wenn einzelne Ausprägungen eines Arrays mit einem variablen Index verarbeitet werden sollen, muss dem Index-Ausdruck der eindeutige variable Index vorausgehen, um das individuelle Array zu kennzeichnen.
Das OBTAIN
-Statement gilt nur für den Reporting Mode.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | S | A | G | A | U | N | P | I | F | B | D | T | L | ja | ja |
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
operand1
|
Als operand1 geben Sie die Felder an,
die mit dem OBTAIN -Statement gelesen werden sollen.
|
READ FINANCE OBTAIN CREDIT-CARD (1-10) DISPLAY CREDIT-CARD (3-5) CREDIT-CARD (6-8) SKIP 1 END
Das obige Beispiel führt dazu, dass die ersten 10 Ausprägungen des
Feldes CREDIT−CARD
(das in einer Periodengruppe enthalten ist)
gelesen werden, und die Ausprägungen (3−5)
und (6−8)
angezeigt werden, wo die nachfolgenden Subarrays im ersten Array
(1−10)
residieren.
READ FINANCE MOVE 'ONE' TO CREDIT-CARD (1) DISPLAY CREDIT-CARD (1) CREDIT-CARD (1-5)
Ausgabe:
CREDIT-CARD CREDIT-CARD ------------------ ---------------- ONE DINERS CLUB AMERICAN EXPRESS ONE AVIS AMERICAN EXPRESS ONE HERTZ AMERICAN EXPRESS ONE UNITED AIR TRAVEL
Die erste Referenz auf CREDIT−CARD (1)
ist nicht innerhalb
des Arrays enthalten. Das Array, das nach der Referenz auf die eindeutige
Ausprägung (1)
definiert ist, kann rückwirkend keine eindeutige
Ausprägung oder ein Array enthalten, das kürzer als das definierte Array
ist.
READ FINANCE OBTAIN CREDIT-CARD (1-5) MOVE 'ONE' TO CREDIT-CARD (1) DISPLAY CREDIT-CARD (1) CREDIT-CARD (1-5)
Ausgabe:
CREDIT-CARD CREDIT-CARD ------------------ ---------------- ONE ONE AMERICAN EXPRESS ONE ONE AMERICAN EXPRESS ONE ONE AMERICAN EXPRESS ONE ONE
Die individuelle Referenz auf CREDIT−CARD (1)
ist innerhalb
des im OBTAIN
-Statement definierten Arrays enthalten.
MOVE (1) TO INDEX READ FINANCE DISPLAY CREDIT-CARD (1-5) CREDIT-CARD (INDEX)
Ausgabe:
CREDIT-CARD CREDIT-CARD ------------------- ---------------- DINERS CLUB DINERS CLUB AMERICAN EXPRESS AVIS AVIS AMERICAN EXPRESS HERTZ HERTZ AMERICAN EXPRESS UNITED AIR TRAVEL UNITED AIR TRAVEL
Die Referenz auf CREDIT−CARD
mittels der variablen
Index-Notation ist nicht innerhalb des Arrays enthalten.
RESET A(A20) B(A20) C(A20) MOVE 2 TO I (N3) MOVE 3 TO J (N3) READ FINANCE OBTAIN CREDIT-CARD (1:3) CREDIT-CARD (I:I+2) CREDIT-CARD (J:J+2) FOR K (N3) = 1 TO 3 MOVE CREDIT-CARD (1.K) TO A MOVE CREDIT-CARD (I.K) TO B MOVE CREDIT-CARD (J.K) TO C DISPLAY A B C LOOP /* FOR LOOP / * READ END
Ausgabe:
A B C ------------------- ------------------- ------------------- CARD 01 CARD 02 CARD 03 CARD 02 CARD 03 CARD 04 CARD 03 CARD 04 CARD 05
Die drei Arrays können einzeln aufgerufen werden, indem Sie den eindeutigen Basis-Index als Kennzeichner für den Index-Ausdruck benutzen.
READ FINANCE OBTAIN CREDIT-CARD (1-10) FOR I 1 10 MOVE CREDIT-CARD (I) TO A(A20) WRITE A END
Das obige Beispiel erzeugt die Fehlermeldung NAT1006
(Wert
für variablen Index = 0
), weil als der Datensatz mit
READ
gelesen wurde, der Index
I
noch den Wert 0
enthielt.
Auf jeden Fall würden in dem obigen Beispiel nicht die ersten 10
Ausprägungen von CREDIT−CARD
ausgegeben werden, weil die einzelne
Ausprägung mit dem variablen Index nicht im Array enthalten sein kann und der
variable Index (I
) nur ausgewertet wird, wenn der nächste
Datensatz gelesen wird.
Im Folgenden finden Sie die korrekte Methode, um das oben Beschriebene auszuführen:
READ FINANCE OBTAIN CREDIT-CARD (1-10) FOR I 1 10 MOVE CREDIT-CARD (1.I) TO A (A20) WRITE A END
READ FINANCE FOR I 1 10 WRITE CREDIT-CARD (I) END
Das obige Beispiel erzeugt die Fehlermeldung NAT1006
, weil
der Index I
Null ist, wenn der Datensatz im
READ
-Statement gelesen
wird.
Im Folgenden wird die korrekte Methode verwendet, um das oben Beschriebene auszuführen:
READ FINANCE FOR I 1 10 GET SAME WRITE CREDIT-CARD (0030/I) END
Das GET
SAME
-Statement ist erforderlich, um den Datensatz erneut zu
lesen, nachdem der variable Index in der FOR
-Schleife aktualisiert worden
ist.
** Example 'OBTEX1': OBTAIN ************************************************************************ RESET #INDEX (I1) * LIMIT 5 READ EMPLOYEES BY CITY OBTAIN SALARY (1:4) /* IF SALARY (4) GT 0 DO WRITE '=' NAME / 'SALARIES (1:4):' SALARY (1:4) FOR #INDEX 1 TO 4 WRITE 'SALARY' #INDEX SALARY (1.#INDEX) LOOP SKIP 1 DOEND LOOP * END
Ausgabe des Programms OBTEX1
:
Page 1 05-02-08 13:37:48 NAME: SENKO SALARIES (1:4): 31500 29900 28100 26600 SALARY 1 31500 SALARY 2 29900 SALARY 3 28100 SALARY 4 26600 NAME: HAMMOND SALARIES (1:4): 22000 20200 18700 17500 SALARY 1 22000 SALARY 2 20200 SALARY 3 18700 SALARY 4 17500
** Example 'OBTEX2': OBTAIN (with multiple ranges) ************************************************************************ RESET #INDEX (I1) #K (I1) * #INDEX := 2 #K := 3 * LIMIT 2 * READ EMPLOYEES BY CITY OBTAIN SALARY (1:5) SALARY (#INDEX:#INDEX+3) /* IF SALARY (5) GT 0 DO WRITE '=' NAME WRITE 'SALARIES (1-5):' SALARY (1:5) / WRITE 'SALARIES (2-5):' SALARY (#INDEX:#INDEX+3) WRITE 'SALARIES (2-5):' SALARY (#INDEX.1:4) / WRITE 'SALARY 3:' SALARY (3) WRITE 'SALARY 3:' SALARY (#K) WRITE 'SALARY 4:' SALARY (#INDEX.#K) DOEND LOOP
Ausgabe des Programms OBTEX2
:
Page 1 05-02-08 13:38:31 NAME: SENKO SALARIES (1-5): 31500 29900 28100 26600 25200 SALARIES (2-5): 29900 28100 26600 25200 SALARIES (2-5): 29900 28100 26600 25200 SALARY 3: 28100 SALARY 3: 28100 SALARY 4: 26600
Weitere Beispiele zur Benutzung des OBTAIN
-Statements,
siehe Datenbank-Array
referenzieren im Leitfaden zur
Programmierung.