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 つの配列は、一意の基本添字を添字表現の修飾子として使用して、個別にアクセスできます。
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
ステートメントの詳細な使用例については、を参照してください。
「データベース配列の参照」(『プログラミングガイド』)