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 |
読み取るフィールド:
|
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 つの配列は、一意の基本添字を添字表現の修飾子として使用して、個別にアクセスできます。
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
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 ループ内で更新された後にレコードを再び読み取るために必要です。
** 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
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
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 ステートメントのその他の使用例については、『プログラミングガイド』の「データベース配列の参照」を参照してください。