バージョン 4.2.5
 —  ステートメント  —

READ

READ

  ALL   [MULTI-FETCH-clause] [RECORDS] [IN] [FILE] view-name
BROWSE   (operand1)  
    [PASSWORD=operand2]
    [CIPHER=operand3]
    [WITH REPOSITION]
    [sequence/range-specification]
    [STARTING WITH ISN=operand4]
    [WHERE logical-condition]
    statement
END-READ ストラクチャードモードのみ
[LOOP] レポーティングモードのみ

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

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

関連ステートメント:ACCEPT/REJECT | AT BREAK | AT START OF DATA | AT END OF DATA | BACKOUT TRANSACTION | BEFORE BREAK PROCESSING | GET TRANSACTION DATA | DELETE | END TRANSACTION | FIND | HISTOGRAM | GET | GET SAME | LIMIT | PASSW | PERFORM BREAK PROCESSING | RETRY | STORE | UPDATE

関連機能グループ:「データベースへのアクセスと更新


機能

READ ステートメントは、データベースからレコードを読み取るために使用します。 レコードは物理順、Adabas ISN 順、またはディスクリプタ(キー)フィールドの値順で取得できます。

このステートメントでは、処理ループを開始します。

READ ステートメント」(『プログラミングガイド』)も参照してください。

Top of page

構文説明

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

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S           N P I   B *             不可
operand2 C S       A                         不可
operand3 C S           N                     不可
operand4 C S           N P I   B *             不可

* operand1 および operand4 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

operand1
読み取るレコード数:

読み取るレコード数は、operand1 を(キーワード READ の直後にカッコで囲んで)指定することで制限できます。この際、キーワード READ の直後にカッコで囲んで数値定数(0~4294967295)または変数として指定します。 次に例を示します。

READ (5) IN EMPLOYEES ...
  
MOVE 10 TO CNT(N2)
READ (CNT) EMPLOYEES  ...

このステートメントでは、指定した制限が、LIMIT ステートメントで設定した制限より優先されます。

プロファイルまたはセッションパラメータ LT で設定された制限のほうが小さい場合、LT 制限が適用されます。

注意:

  1. 読み取るレコード数が 4 桁の場合、先頭にゼロを付けて指定します(0nnnn)。カッコで囲まれた 4 桁の数はすべてステートメントの行番号参照として Natural で解釈されるためです。
  2. operand1 は、READ ループに入るときに評価されます。 operand1 の値が READ ループ内で変更されても、読み取られるレコード数には影響しません。
ALL レコードを読み取ることを強調するために、オプションでキーワード ALL を指定できます。
MULTI-FETCH-clause 以下の「MULTI-FETCH 節」を参照してください。
view-name
ビュー名:

view-name として、ビューの名前を指定します。この名前は、DEFINE DATA ステートメント内、あるいはプログラム外のグローバルデータエリアまたはローカルデータエリアに事前に定義しておく必要があります。

レポーティングモードでは、view-name を DDM の名前にすることもできます。

PASSWORD

CIPHER

PASSWORD および CYPHER 節:

これらの節は Adabas または VSAM データベースにのみ適用可能です。 Entire System Server では使用できません。

PASSWORD 節は、パスワード保護されているファイルからデータを取得するときのパスワードの指定に使用します。

CIPHER 節は、暗号化されているファイルからデータを取得するときのサイファキーの指定に使用します。

詳細については、ステートメント FIND および PASSW を参照してください。

WITH REPOSITION このオプションは、READ ステートメントを再位置決めイベントに反応するように設定するために使用します。 「WITH REPOSITION オプション」を参照してください。
sequence/range-specification このオプションでは、取得順序/範囲を指定します。 「順序/範囲の指定」を参照してください。
STARTING WITH ISN=operand4

この節は Adabas および VSAM データベースにのみ適用されます。

Adabas へのアクセス

この節は、物理順または論理順(昇順/降順)の READ ステートメントと組み合わせて使用します。 指定された値(operand4)は Adabas ISN(内部シーケンス番号)を表し、READ ループを開始するレコードを明確に指定するために使用します。

  • 論理順
    等号(=)で記述されても、READ ステートメントは対応するディスクリプタフィールドに同じ開始値を持つレコードのみを返すわけではなく、指定された開始値で始めて昇順または降順に論理的な参照を開始します。 いくつかのレコードがディスクリプタフィールドに同じ内容を持っている場合、それらは ISN ソート順に返されます。

    STARTING WITH ISN 節は、開始値が最初のレコードのディスクリプタ値と一致している場合にのみ適用される一種の "第 2 レベル" の選択条件になります。 開始値と同じディスクリプタ値の全レコードおよび開始 ISN "以下"(降順 READ については "以上")の ISN は Adabas で無視されます。 READ ループで返される最初のレコードは次のいずれかです。

    • ディスクリプタ = 開始値の最初のレコードおよび開始 ISN より "高い"(降順 READ については "低い")ISN。

    • このようなレコードが存在しない場合は、開始値より "大きい"(降順 READ については "小さい")ディスクリプタを持つ最初のレコード。

  • 物理順
    レコードは、それらが物理的に保存されている順序で返されます。 STARTING WITH ISN 節を指定した場合、開始 ISN と同じ ISN のレコードに達するまで、Adabas では全レコードが無視されます。 返される最初のレコードは、ISN = 開始 ISN のレコードに続く次のレコードです。

VSAM へのアクセス

この節は物理順でのみ使用できます。 指定される値(operand4)は、VSAM RBA(ESDS の相対バイトアドレス)または RRN(RRDS の相対レコード番号)を表し、読み取り操作の開始値として使用されます。

この節は、処理を継続する次のレコードを簡単に指定するために、処理が中断された READ ループ内での再位置決めに使用できます。 これは特に、次のレコードをディスクリプタ値で一意に識別できない場合に役立ちます。 また、分散クライアント/サーバーアプリケーションで、レコードをサーバープログラムで読み取ってクライアントプログラムで処理し、レコードを順次処理ではなくバッチ処理する場合にも役立ちます。

例については、下記のプログラム REASISND を参照してください。

WHERE logical-condition WHERE 節」を参照してください。
END-READ READ ステートメントを終了するには、Natural 予約キーワード END-READ を使用する必要があります。

MULTI-FETCH 節

注意:
この節は、Adabas または DB2 データベースでのみ使用できます。

MULTI-FETCH

ON
OFF
OF multi-fetch-factor

詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)、または『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「複数行の処理」(SQL)を参照してください。

WITH REPOSITION オプション

注意:
このオプションは、基準データベースが Adabas、VSAM、または DL/I の場合にのみ適用されます。

WITH REPOSITION オプションでは、READ ステートメントを再位置決めイベントに反応するように設定できます。 これにより、アクティブな READ ループ内で別の開始値に再位置決めを行うことができます。 READ ステートメントの処理は新しい開始値で継続します。

READ ステートメントを WITH REPOSITION オプション付きで使用すると、再位置決めイベントが 2 つの方法のいずれかで起動されます。

  1. ESCAPE TOP REPOSITION ステートメントが実行されるとき。 ESCAPE TOP REPOSITION ステートメントの実行時、Natural はループ開始への即時分岐を行い、再スタートを実行します。つまり、データベースは、検索値変数の現在の内容に従って、ファイルの新しいレコードに再位置決めを行います。 同時に、ループカウンタ *COUNTER をゼロにリセットします。

  2. READ ループがデータベースから次のレコードを取り出そうとして、システム変数 *COUNTER の値が 0 であるとき。

    注意:
    アクティブな READ ループ内で *COUNTER0 に設定される場合、現在のレコードの処理は継続します。ループ開始への即時分岐は行われません。

機能上の考慮事項

順序/範囲の指定

取得順序/範囲の指定には、3 つの構文オプションを使用できます。

構文オプション 1:

[IN] [PHYSICAL]

ASCENDING
DESCENDING
VARIABLE operand5
DYNAMIC operand5

[SEQUENCE]

構文オプション 2:

 

 

=
EQ
EQUAL TO
[STARTINGFROM

 

               

BY
WITH

ISN operand6

THRU
ENDING AT

operand7

                     

構文オプション 3:

[IN] [LOGICAL]    

ASCENDING
DESCENDING
VARIABLE operand5
DYNAMIC  operand5

[SEQUENCE]    

BY
WITH

descriptor    
 

=
EQ
EQUAL TO
[STARTINGFROM

operand6

THRU
ENDING AT

operand7

   

=
EQ
EQUAL TO
[STARTINGFROM

operand6 TOoperand7  
   

<
LT
LESS THAN
>
GT
GREATER THAN
<=
LE
LESS EQUAL
>=
GE
GREATER EQUAL

operand6              

注意:

  1. Entire System Server で、構文オプション [2] と [3] は使用できません。
  2. 図 3 の比較演算子を使用した場合は、オプション ENDING ATTHRU、および TO は使用できません。 これらの比較演算子は HISTOGRAM ステートメントにも有効です。

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

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand5   S       A                         不可
operand6 C S       A   N P I F B * D T L       不可
operand7 C S       A   N P I F B * D T L       不可

* operand6 および operand7 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

READ IN PHYSICAL SEQUENCE

PHYSICAL SEQUENCE は、データベースに物理的に保存されている順にレコードを読み取る場合に使用します。

注意:
VSAM データベースの場合:READ PHYSICAL は ESDS と RRDS にのみ適用されます。

PHYSICAL はデフォルトの順序です。

READ BY ISN

READ BY ISN は、Adabas および VSAM データベースに対してのみ使用できますVSAM データベースに対しては ESDS および RRDS にのみ有効です。

READ BY ISN は、レコードを Adabas ISN(内部シーケンス番号)順に読み取るときに使用しますまたは、VSAM RBA(ESDS の相対バイトアドレス)や RRN(RRDS の相対レコード番号)の順に読み取ります。

注意:
XML データベースの場合:READ BY ISN は Tamino オブジェクト ID の順に従って XML オブジェクトを読み取るために使用します。

READ IN LOGICAL SEQUENCE

LOGICAL SEQUENCE は、レコードをディスクリプタ(キー)フィールドの値の順に読み取るために使用します。

ディスクリプタが指定されると、レコードはそのディスクプタの値の順序で読み取られます。 順序制御には、ディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、またはハイパーディスクリプタを使用できます。 フォネティックディスクリプタ、ピリオディックグループ内のディスクリプタ、またはピリオディックグループフィールドを含むスーパーディスクリプタは使用できません。

ディスクリプタを指定しなかった場合、DDM に指定されたデフォルトのディスクリプタ(Default Sequence フィールド)が使用されます。

注意:

  1. DL/I データベースの場合:ディスクリプタはルートセグメントのシーケンスフィールドまたは 2 次インデックスフィールドにする必要があります。 2 次インデックスフィールドを指定する場合、PCB の PROCSEQ パラメータにも指定する必要があります。 Natural は、この PCB とそれに対応する階層構造によってデータベースを処理します。 HDAM データベースはルートセグメントを検索するためにランダムルーチンを使用するため、HDAM データベースに対して READ LOGICAL を使用しても有効な結果は返されません。したがって、HDAM データベースには READ PHYSICAL を使用してください。
  2. VSAM データベースの場合:LOGICAL はプライマリおよびオルタネートキー定義のある KSDS、またはオルタネートキー定義のある ESDS にのみ有効です。

順序制御に使用するディスクリプタが空値省略で定義されている場合(Adabas のみ)、ディスクリプタ値が空値であるレコードは読み取られません。

順序制御に使用するディスクリプタがマルチプルバリューフィールドの場合(Adabas のみ)、存在する値の個数に応じて同じレコードが何回も読み取られます。

注意:
READ IN LOGICAL SEQUENCE については、『プログラミングガイド』でも説明されています。「データベースアクセスのためのステートメント」の「READ ステートメント」を参照してください。

ASCENDING | DESCENDING | VARIABLE | DYNAMIC SEQUENCE

この節は、Adabas、XML データベース、VSAM、および SQL データベースにのみ適用されます。 READ PHYSICAL ステートメントでは、VSAM および DB2 データベースにのみ適用できます。

この節を使用して、レコードを昇順または降順のどちらで読み取るかを指定できます。

  • デフォルトは昇順です。昇順はキーワード ASCENDING を使用して明示的に指定することもできます。

  • レコードを降順で読み取る場合は、キーワード DESCENDING を指定します。

  • レコードを昇順または降順のどちらで読み取るかを事前に決めずに実行時に決めるには、変数(operand5)の前に VARIABLE キーワードまたは DYNAMIC キーワードを指定します。 Operand5 は、フォーマット/長さ A1 で、値 A("昇順")または D("降順")が含まれている必要があります。

    • キーワード VARIABLE を使用した場合、読み取り順(operand5 の値)は、READ 処理ループの開始時に評価され、READ ループ内でoperand5 フィールドが変更されるかどうかに関係なく、ループが終了するまで変わりません。

    • キーワード DYNAMIC を使用した場合、読み取り順(operand5 の値)は、READ 処理ループでの各レコード取り出し前に評価され、レコードからレコードへ変更できます。 これは、READ ループの任意の場所で昇順から降順(または、逆)へのスクロール順の変更を可能にします。

注意:

  1. Adabas データベースの場合:DYNAMIC 順を使用するには、システムで Adabas V7(またはそれ以降)が必要です。
STARTING FROM ... ENDING AT/TO

STARTING FROM および ENDING AT 節は、ユーザー指定の値の範囲を基準にしてレコードの集合の読み取りを制限するために使用します。

STARTING FROM 節(=EQEQUAL TO、または [STARTING] FROM)は、読み取り操作の開始値を決めます。 開始値を指定すると、指定した値から読み取りが始まります。 ファイルに開始値が存在しない場合、次に高い(またはDESCENDING 読み取りでは低い)値が使用されます。 より高い(または DESCENDING ではより低い)値が存在しなければ、ループに入りません。

レコードを終了値に制限するには、包括的な範囲を示す用語 THRUENDING AT、または TO を持つ ENDING AT 節を指定できます。 読み取りディスクリプタフィールドが終了値を超えると、自動的なループ終了が実行されます。 TOTHRU および ENDING AT キーワードの基本機能は、非常によく似ていますが、内部的に動作が異なります。

THRU/ENDING AT

THRU または ENDING AT を使用した場合、開始値だけがデータベースに供給され、データベースによってレコードが返された後に、Natural ランタイムシステムによって終了値のチェックが実行されます。 読み取り順が ASCENDING の場合、開始値は READ ループで最初に返される値(およびレコード)を表すため、開始値としてより低い値を供給し、終了値としてより高い値を供給する必要があります。 ただし、逆順読み取り(DESCENDING)を呼び出す場合、より高い値は開始値に、そして終了値にはより低い値が出現する必要があります。

内部的に、読み取る範囲の終了を決定するために、Natural は終了値を超えるレコードを 1 件読み取ります。 終了値に到達したために READ ループを終了したとき、この最後のレコードは実際には要求した範囲内の最後のレコードではなく、その範囲を超えた最初のレコードである(最後の結果レコードを超えるレコードがファイルに含まれない場合を除く)ことに注意してください。

THRU および ENDING AT 節は、READ または HISTOGRAM ステートメントをサポートするすべてのデータベースに対して使用できます。

TO

キーワード TO を使用すると、開始値と終了値の両方がデータベースに送られ、Natural は値の範囲をチェックしません。 終了値を超えると、データベースは"ファイルの終わり"に到達した場合と同様に対処し、データベースループを終了します。 データベースにより完全な範囲チェックが行われるので、ASCENDING または DESCENDING のいずれの順序でブラウズしていても、常に範囲の小さい方の値が開始値になり、大きい方の値が終了値になります。

TO オプションは、基準データベースが Adabas バージョン 7(またはそれ以降)、DB2、VSAM、または DL1 の場合にのみ適用できます。

THRU/ENDING AT と TO の機能上の違いに関する注意

次のリストは、THRU/ENDING AT および TO オプションの機能上の違いを示しています。

THRU/ENDING AT TO
終了値に達したために READ ループが終了するとき、ビューには "範囲外" の最初のレコードが含まれます。 終了値に達したために READ ループが終了するとき、ビューには指定した範囲の最後のレコードが含まれます。
終了値変数が READ ループ中に修正された場合、次のレコードの読み取り時に新しい値が終了値チェックに使用されます。 終了値変数は READ ループ開始時にのみ評価されます。 READ ループ中の以降の修正はすべて無効です。
範囲が不正な場合(例えば、READ .. = 'B' THRU 'A')、レコードが返されないだけで、データベースエラーは発生しません。 値範囲を降順で供給してはならないため、不正な範囲はデータベースエラー(例:Adabas RC=61)となります。
READ .. DESCENDING が、開始値および終了値と一緒に使用される場合、開始値はファイルでの位置決めに使用され、終了値は Natural で "範囲終了" をチェックするために使用されます。 したがって、開始値は終了値以上の値です。 両方の値がデータベースに渡されるため、それらは昇順で出現する必要があります。 つまり、昇順または降順で読み取っているかどうかに関係なく、開始値は終了値以下の値です。
範囲のオーバーフローをチェックするために、ディスクリプタ値は基準データベースビューに出現する必要があります。つまり、それはレコードバッファに返される必要があります。 ディスクリプタは、返されるレコードフィールドに必要ではありません。
Adabas マルチバリューフィールド(MU フィールド)またはサブ/スーパー/ハイパーディスクリプタに対して終了値チェックはできません。また、プログラムコンパイル時に構文エラー NAT0160 を引き起こします。 MU フィールドおよびサブ/スーパー/ハイパーディスクリプタに対して終了値を指定できます。
すべてのデータベースに使用できます。 Adabas バージョン 7(またはそれ以降)、DB2、VSAM、または DL/Iに対してのみ使用できます。

WHERE 節

WHERE logical-condition

WHERE 節は、追加の選択条件(logical-condition)を指定するために使用できます。この条件は、値が読み取られた、値に対する処理が実行されるに評価されます(AT BREAK 評価を含む)。

logical-condition の構文については、『プログラミングガイド』の「論理条件基準」で説明しています。

WHERE 節を含む READ ステートメントに LIMIT ステートメントや処理回数の制限を指定した場合、WHERE 節で排除されたレコードは制限数にカウントされません。

Top of page

READ で使用可能なシステム変数

Natural システム変数 *ISN および *COUNTERREAD ステートメントで使用可能です。

これらのシステム変数は、P10 のフォーマットと長さで定義されています。 このフォーマット/長さは変更できません。

システム変数の使用方法について次に説明します。

*ISN

システム変数 *ISN には、現在処理中のレコードの Adabas ISN が入ります。

注意:

  1. VSAM データベースでは、現在処理中のレコードの RRN(RRDSデータセット)または RBA(ESDSデータセット)が *ISN に入ります。
  2. Tamino では、XML オブジェクト ID が *ISN に入ります。
  3. DL/I、SQL データベースおよび Entire System Server では、*ISN は使用できません。
*COUNTER システム変数 *COUNTER には、入力した処理ループの回数が含まれます。

Top of page

例 1 - READ ステートメント

** Example 'REAEX1S': READ (structured mode)                            
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 NAME                                                                
1 VEHIC-VIEW VIEW OF VEHICLES                                           
  2 PERSONNEL-ID                                                        
  2 MAKE                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 3                                                                 
*                                                                       
WRITE 'READ IN PHYSICAL SEQUENCE'                                       
READ EMPLOY-VIEW IN PHYSICAL SEQUENCE                         
  DISPLAY NOTITLE PERSONNEL-ID NAME *ISN *COUNTER                       
END-READ                                                            
*                                                                       
WRITE / 'READ IN ISN SEQUENCE'                                          
READ EMPLOY-VIEW BY ISN STARTING FROM 1 ENDING AT 3
  DISPLAY         PERSONNEL-ID NAME *ISN *COUNTER  
END-READ                                       
*                                                  
WRITE / 'READ IN NAME SEQUENCE'                    
READ EMPLOY-VIEW BY NAME                     
  DISPLAY         PERSONNEL-ID NAME *ISN *COUNTER  
END-READ                                   
*                                                  
WRITE / 'READ IN NAME SEQUENCE STARTING FROM ''M'''
READ EMPLOY-VIEW BY NAME STARTING FROM 'M'   
  DISPLAY         PERSONNEL-ID NAME *ISN *COUNTER  
END-READ                                      
*                                                  
END                                               

プログラム REAEX1S の出力:

PERSONNEL         NAME            ISN         CNT     
   ID                                                 
--------- -------------------- ----------- -----------
                                                      
READ IN PHYSICAL SEQUENCE                             
50005800  ADAM                           1           1
50005600  MORENO                         2           2
50005500  BLOND                          3           3
                                                      
READ IN ISN SEQUENCE                                  
50005800  ADAM                           1           1
50005600  MORENO                         2           2
50005500  BLOND                          3           3
                                                      
READ IN NAME SEQUENCE                                 
60008339  ABELLAN                      478           1
30000231  ACHIESON                     878           2
50005800  ADAM                           1           3
                                                      
READ IN NAME SEQUENCE STARTING FROM 'M'               
30008125  MACDONALD                    923           1
20028700  MACKARNESS                   765           2
40000045  MADSEN                       508           3

レポーティングモードの例はライブラリ SYSEXRM のプログラム REAEX1R を参照してください。

例 2 - READ WITH REPOSITION

DEFINE DATA LOCAL
1 MYVIEW VIEW OF ...
  2 NAME
1 #STARTVAL (A20) INIT <'A'>
1 #ATTR     (C)
END-DEFINE
...
SET KEY PF3
...
READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL
INPUT (IP=OFF AD=O) 'NAME:' NAME /
    'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) /
    'Press PF3 to stop'
  IF *PF-KEY = 'PF3'
    THEN STOP
  END-IF
  IF #ATTR MODIFIED
    THEN ESCAPE TOP REPOSITION
  END-IF
END-READ
...
DEFINE DATA LOCAL
1 MYVIEW VIEW OF ...
  2 NAME
1 #STARTVAL (A20) INIT <'A'>
1 #ATTR     (C)
END-DEFINE
...
SET KEY PF3
...
READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL
  INPUT (IP=OFF AD=O) 'NAME:' NAME /
    'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) /
    'Press PF3 to stop'
  IF *PF-KEY = 'PF3'
    THEN STOP
  END-IF
  IF #ATTR MODIFIED
    THEN RESET *COUNTER
  END-IF
END-READ
...

例 3 - READ および FIND ステートメントの結合

次の例では、まず EMPLOYEES ファイルから、ディスクリプタ NAME の値で論理順にレコードを読み取ります。 次に、EMPLOYEES ファイルの PERSONNEL-ID(人事番号)を検索条件として、VEHICLES ファイルを FIND ステートメントで検索します。 結果のレポートには、読み取られた従業員の名前(EMPLOYEES ファイルから読み取られる)と、この従業員が所有する自動車のモデル(VEHICLES ファイルから読み取られる)が示されます。 1 人で何台も自動車を所有している場合、同一名で複数行が出力されます。

** Example 'REAEX2': READ and FIND combination                          
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 FIRST-NAME                                                          
  2 NAME                                                                
  2 CITY                                                                
1 VEH-VIEW VIEW OF VEHICLES                                             
  2 PERSONNEL-ID                                                        
  2 MAKE                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 10                                                                
*                                                                       
RD. READ EMPLOY-VIEW BY NAME STARTING FROM 'JONES'                    
  SUSPEND IDENTICAL SUPPRESS                                            
  FD. FIND VEH-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (RD.)       
    IF NO RECORDS FOUND                                                 
      ENTER                                   
    END-NOREC                                 
    DISPLAY NOTITLE (ES=OFF IS=ON ZP=ON AL=15)
            PERSONNEL-ID (RD.)                
            FIRST-NAME (RD.)                  
            MAKE (FD.) (IS=OFF)               
  
  END-FIND
END-READ                          
END

プログラム REAEX2 の出力:

PERSONNEL      FIRST-NAME         MAKE      
      ID                                       
--------------- --------------- ---------------
                                               
20007500        VIRGINIA        CHRYSLER       
20008400        MARSHA          CHRYSLER       
                                CHRYSLER       
20021100        ROBERT          GENERAL MOTORS 
20000800        LILLY           FORD           
                                MG             
20001100        EDWARD          GENERAL MOTORS 
20002000        MARTHA          GENERAL MOTORS 
20003400        LAUREL          GENERAL MOTORS 
30034045        KEVIN           DATSUN         
30034233        GREGORY         FORD           
11400319        MANFRED                       

例 4 - DESCENDING オプション

** Example 'READSCND': READ (with DESCENDING SEQUENCE)                  
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL VIEW OF EMPLOYEES                                                
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 BIRTH                                                               
END-DEFINE                                                              
*                                                                       
READ (10) EMPL IN DESCENDING SEQUENCE BY NAME FROM 'ZZZ'          
  DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD)                    
END-READ                                                           
END

例 5 - VARIABLE オプション

** Example 'REAVSEQ':  READ  (with VARIABLE SEQUENCE)                   
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL VIEW OF EMPLOYEES                                                
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 BIRTH                                                               
*                                                                       
1 #DIR        (A1)                                                      
1 #STARTVALUE (A20)                                                     
END-DEFINE                                                              
*                                                                       
SET KEY PF7 PF8                                                         
*                                                                       
INPUT 'Select READ direction'                                           
   // 'Press' 08T 'PF7' (I)                  21T 'to read backward'     
    /         08T 'PF8' (I) 'or' 'ENTER' (I) 21T 'to read forward'      
*                                                                       
IF *PF-KEY = 'PF7'                                                      
  MOVE 'D'   TO #DIR                                
  MOVE 'ZZZ' TO #STARTVALUE                         
ELSE                                                
  MOVE 'A' TO #DIR                                  
  MOVE 'A' TO #STARTVALUE                           
END-IF                                              
*                                                   
READ (10) EMPL IN VARIABLE #DIR SEQUENCE
               BY NAME FROM #STARTVALUE
  DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD)
END-READ                                      
END                                                

例 6 - DYNAMIC オプション

DEFINE DATA LOCAL
1 #DIRECTION (A1) INIT <'A'>   /* 'A' = ASCENDING
1 #EMPVIEW VIEW OF EMPLOYEES
2 NAME
...
END-DEFINE
...
READ #EMPVIEW IN DYNAMIC #DIRECTION SEQUENCE BY NAME = 'SMITH'
   INPUT (AD=O) NAME
       / 'Press PF7 to scroll in DESCENDING sequence'
       / 'Press PF8 to scroll in ASCENDING  sequence'
   ..
   IF *PF-KEY = 'PF7' THEN MOVE 'D' TO #DIRECTION END-IF
   IF *PF-KEY = 'PF8' THEN MOVE 'A' TO #DIRECTION END-IF
END-READ
...

例 7 - STARTING WITH ISN 節

** Example 'REASISND': READ  (with STARTING WITH ISN)                   
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL VIEW OF EMPLOYEES                                                
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 BIRTH                                                               
*                                                                       
1 #DIR      (A1)                                                        
1 #STARTVAL (A20)                                                       
1 #STARTISN (N8)                                                        
END-DEFINE                                                              
*                                                                       
SET KEY PF3 PF7 PF8                                                     
*                                                                       
MOVE 'ADKINSON' TO #STARTVAL                                            
*                                                                       
READ (9) EMPL BY NAME = #STARTVAL                                  
  WRITE *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) *COUNTER             
  IF *COUNTER = 5 THEN                                      
    MOVE NAME TO #STARTVAL                                  
    MOVE *ISN TO #STARTISN                                  
  END-IF                                                    
END-READ                                                  
*                                                           
#DIR := 'A'                                                 
*                                                           
REPEAT                                                      
 READ EMPL IN VARIABLE #DIR  BY NAME = #STARTVAL           
            STARTING WITH ISN = #STARTISN            
    MOVE NAME TO #STARTVAL                                  
    MOVE *ISN TO #STARTISN                                  
    INPUT NO ERASE  (IP=OFF AD=O)                           
         15/01 *ISN  NAME  FIRST-NAME  BIRTH (EM=YYYY-MM-DD)
           //  'Direction:' #DIR                            
           //  'Press PF3 to stop'                          
           /   '      PF7 to go step back'                  
           /   '      PF8 to go step forward'               
           /   '      ENTER to continue in that direction'
    /*                                                    
    IF *PF-KEY = 'PF7' AND #DIR = 'A'                     
      MOVE 'D' TO #DIR                                    
      ESCAPE BOTTOM                                       
    END-IF                                                
    IF *PF-KEY = 'PF8' AND #DIR = 'D'                     
      MOVE 'A' TO #DIR                                    
      ESCAPE BOTTOM                                       
    END-IF                                                
    IF *PF-KEY = 'PF3'                                    
      STOP                                                
    END-IF                                                
  END-READ                                          
  /*                                                      
  IF *COUNTER(0290) = 0                                   
    STOP                                                  
  END-IF                                                  
END-REPEAT                                                
END

Top of page