OBTAIN

OBTAIN operand1

構文図で使用されている記号については、「構文記号」を参照してください。

関連機能グループ:レポーティングモードのステートメント

このドキュメントでは、次のトピックについて説明します。


関数

OBTAIN ステートメントは、レポーティングモードで 1 つ以上のフィールドをファイルから読み取るときに使用します。OBTAIN ステートメントは、Natural オブジェクトプログラムの実行コードを生成するものではありません。主に、マルチプルバリューフィールドの値範囲またはピリオディックグループのオカレンスの範囲を読み取って、これらの範囲の一部を後でプログラムで参照できるようにするために使用されます。

Natural は後続のステートメント(DISPLAY ステートメントや COMPUTE ステートメントなど)で参照される各データベースフィールドを自動的に読み取るため、プログラムで参照するデータベースフィールドごとに OBTAIN ステートメントを使用する必要はありません

配列形式のマルチプルバリューフィールドまたはピリオディックグループフィールドが参照されている場合は、配列を OBTAIN ステートメントで定義して、フィールドのすべてのオカレンスに対して作成されるようにする必要があります。配列が定義される前に個々のマルチプルバリューフィールドまたはピリオディックグループフィールドが参照された場合は、フィールドが配列に配置されず、配列からは独立して存在するようになります。フィールドには、配列内の対応するオカレンスと同じ値が含まれます。

2 つ目の個々のオカレンスまたは配列の配列次元が初期配列に含まれている場合、マルチプルバリューフィールド、ピリオディックグループフィールドまたはサブ配列の個々のオカレンスは、以前に定義した配列に保持できます。

一意の変数添字のあるマルチプルバリューフィールドまたはピリオディックグループフィールドへの参照は、値の配列に含めることができません。配列の個々のオカレンスを変数添字とともに処理する場合は、添字表現の接頭辞として一意の変数添字を付けて、個々の配列を示す必要があります。

制限事項

OBTAIN ステートメントはレポーティングモードでだけ有効です。

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1   S A G   A U N P I F B D T L      

構文要素の説明:

構文要素 説明
operand1
読み取るフィールド:

operand1 で、OBTAIN ステートメントの結果、参照可能になるフィールドを指定します。

例:

READ FINANCE OBTAIN CREDIT-CARD (1-10)
DISPLAY CREDIT-CARD (3-5) CREDIT-CARD (6-8)
SKIP 1 END

上記の例では、フィールド CREDIT-CARD(ピリオディックグループに含まれます)の最初の 10 個のオカレンスが読み取られ、オカレンス 3 ~ 5 と 6 ~ 8 が表示されます。後続のサブ配列は初期配列(1 ~ 10)に存在するようになります。

READ FINANCE
MOVE 'ONE' TO CREDIT-CARD (1)
DISPLAY CREDIT-CARD (1) CREDIT-CARD (1-5)

出力:

    CREDIT-CARD      CREDIT-CARD
------------------ ----------------


ONE                DINERS CLUB
                   AMERICAN EXPRESS




ONE                AVIS
                   AMERICAN EXPRESS



ONE                HERTZ
                   AMERICAN EXPRESS



ONE                UNITED AIR TRAVEL

CREDIT-CARD (1) への最初の参照は、配列に含まれていません。一意のオカレンス(1)への参照の後に定義されている配列は、一意のオカレンスまたは定義されている配列より短い配列を遡及的に含むことはできません。

READ FINANCE
OBTAIN CREDIT-CARD (1-5)
MOVE 'ONE' TO CREDIT-CARD (1)
DISPLAY CREDIT-CARD (1) CREDIT-CARD (1-5)

出力:

    CREDIT-CARD      CREDIT-CARD
------------------ ----------------


ONE                ONE
                   AMERICAN EXPRESS



ONE                ONE
                   AMERICAN EXPRESS



ONE                ONE
                   AMERICAN EXPRESS



ONE                ONE

CREDIT-CARD (1) への個々の参照は、OBTAIN ステートメントで定義されている配列に含まれます。

MOVE (1) TO INDEX
READ FINANCE
DISPLAY CREDIT-CARD (1-5) CREDIT-CARD (INDEX)

出力:

    CREDIT-CARD      CREDIT-CARD
------------------- ----------------


DINERS CLUB         DINERS CLUB
AMERICAN EXPRESS



AVIS                AVIS
AMERICAN EXPRESS



HERTZ              HERTZ
AMERICAN EXPRESS



UNITED AIR TRAVEL  UNITED AIR TRAVEL

変数添字表記を使用した CREDIT-CARD への参照は、配列に含まれません。

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

出力:

         A                   B                   C
------------------- ------------------- -------------------
CARD 01             CARD 02             CARD 03
CARD 02             CARD 03             CARD 04
CARD 03             CARD 04             CARD 05

3 つの配列は、一意の基本添字を添字表現の修飾子として使用して、個別にアクセスできます。

無効な例 1

READ FINANCE
OBTAIN CREDIT-CARD (1-10)
FOR I 1 10
MOVE CREDIT-CARD (I) TO A(A20)
WRITE A
END

上記の例では、レコードの読み取り時(READ)に添字 I にまだ値 0 が含まれているため、エラーメッセージ NAT1006(変数添字の値 = 0)が生成されます。

いずれの場合にも、上記の例では、変数添字を持つ個々のオカレンスを配列に含めることができず、変数添字(I)は次のレコードの読み取り時にのみ評価されるため、CREDIT-CARD の最初の 10 個のオカレンスは出力されません。

上記を実行する正しいメソッドは次のとおりです。

READ FINANCE
OBTAIN CREDIT-CARD (1-10)
FOR I 1 10
MOVE CREDIT-CARD (1.I) TO A (A20)
WRITE A
END

無効な例 2

READ FINANCE
FOR I 1 10
WRITE CREDIT-CARD (I)
END

上記の例では、レコードが READ ステートメントで読み取られたときに添字 I がゼロであるため、エラー メッセージ NAT1006 が生成されます。

上記を実行する正しいメソッドは次のとおりです。

READ FINANCE
FOR I 1 10
GET SAME
WRITE CREDIT-CARD (0030/I)
END

GET SAME ステートメントは、変数添字が FOR ループ内で更新された後にレコードを再び読み取るために必要です。

例 1 - OBTAIN ステートメント

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

プログラム 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

例 2 - 複数の範囲がある OBTAIN ステートメント

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

プログラム 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

OBTAIN ステートメントのその他の使用例については、『プログラミングガイド』の「データベース配列の参照」を参照してください。