OBTAIN

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:


Funktion

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.

Einschränkung

Das OBTAIN-Statement gilt nur für den Reporting Mode.

Syntax-Beschreibung

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.

Beispiele:

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.

Ungültiges Beispiel 1

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

Ungültiges Beispiel 2

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.

Beispiele

Beispiel 1 — OBTAIN-Statement

** 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                                                        

Beispiel 2 — OBTAIN-Statement mit mehreren Bereichen

** 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.