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

READ WORK FILE

ストラクチャードモード構文

READ [WORK FILE] work-file-number [ONCE]
 

RECORD operand1            

  [AND] [SELECT]

OFFSET n operand2
  FILLER nX
  [GIVING LENGTHoperand3]
 

AT [END] [OF] [FILE]

           
  statement            
  END-ENDFILE            
  statement              
END -WORK              

レポーティングモード構文

READ [WORK FILE] work-file-number [ONCE]
 

RECORD {operand1 [FILLER nX]}

  [AND] [SELECT]

OFFSET n operand2
  FILLER nX
  [GIVING LENGTH operand3]
 

AT [END] [OF] [FILE]

statement
  DO statement DOEND
  statement              
[LOOP]                

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

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

関連ステートメント:CLOSE WORK FILE | DEFINE WORK FILE | WRITE WORK FILE

関連機能グループ:「ワークファイル/PC ファイルの制御


機能

READ WORK FILE ステートメントは、Adabas 以外の物理順ワークファイルからデータを読み取るために使用します。 データはワークファイルから順次読み取られます。 データがどのように読み取られるかは、そのデータがワークファイルにどのように書き込まれたということとは無関係です。

このステートメントは、Com-plete、CICS、CMS、TSO、TIAM、またはバッチモード環境で実行されるプログラムでのみ使用できます。 適切な JCL またはシステムコマンドを実行してワークファイルを割り当てる必要があります。 詳細については、『オペレーション』ドキュメントを参照してください。 ワークファイル割り当ての詳細については、『パラメータリファレンス』ドキュメントでプロファイルパラメータ WORK を参照してください。

READ WORK FILE は、ワークファイルの全レコードを読み取るための処理ループを開始し、実行します。 READ WORK FILE ループでは自動ブレイク処理を行うことができます。

注意:

  1. READ WORK FILE ステートメントの実行中にエンドオブファイル条件になると、Natural はワークファイルを自動的にクローズします。
  2. Entire Connection の場合:Entire Connection ワークファイルを読み取る場合、READ WORK FILE 処理ループ内に I/O ステートメントを指定しないでください。
  3. Unicode およびコードページのサポートについては、『Unicode およびコードページのサポート』ドキュメントの「メインフレームプラットフォーム上のワークファイルと出力ファイル」を参照してください。

Top of page

構文説明

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

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

フォーマット C は Natural Connection では無効です。

フィールド長」も参照してください。

構文要素の説明:

work-file-number
ワークファイル番号:

(Natural に定義した)読み取るワークファイルの番号。

変数インデックス範囲:

ワークファイルから配列を読み取る場合、配列に変数インデックス範囲を指定できます。 次に例を示します。

READ WORK FILE work-file-number #ARRAY (I:J)
ONCE
ONCE オプション:

ONCE は、1 レコードのみを読み取るために使用します。 処理ループは開始されません(したがってループを閉じるキーワード END-WORK または LOOP は指定できません)。 ONCE を指定する場合、AT END OF FILE 節も使用する必要があります。

ONCE 指定のある READ WORK FILE ステートメントがユーザー開始の処理ループで制御される場合、処理ループの終了前にワークファイルにエンドオブファイル条件が検出されることもあります。 ワークファイルから読み取られたすべてのフィールドには、最後に読み取られたレコードの値が残っています。 その後、ワークファイルは、READ WORK FILE ONCE の次回実行時に読み取られる最初のレコードに再位置決めされます。

RECORDoperand1 FILLER nX
RECORD オプション:

RECORD を指定した場合、読み取られた各レコードの全フィールドが以降の処理で使用可能になります。 レコードのレイアウトに対応するオペランドリスト(operand1)を提供する必要があります。

FILLER nX の指定があると、入力データ内で n バイト分がスキップされます。 RECORD 節で定義されたレコードは、連続ストレージ内にある必要があります。 FILLER はストラクチャードモードでは使用できません。

ストラクチャードモードまたは DEFINE DATA ステートメントで定義したレコードを使用する場合、1 つのフィールド(またはグループ)だけが使用できます。 この場合、FILLER は指定できません。

レコードに含まれているデータが Natural によってチェックおよび変換されることはありません。 数値フィールド内に数値以外のデータが含まれていると、プログラムの異常終了を起こすので、ユーザーは正しくレコードレイアウトを記述する必要があります。 Natural によるチェックは行われないため、このオプションはシーケンシャルファイルのレコードを処理するには最も速い方法です。 レコードが読み取られる前は、operand1 で定義したレコードエリアは空白で埋められます。 したがって、エンドオブファイル条件では空白のエリアが返されます。 短いレコードには空白が付加されます。

次の場合、RECORD オプションは使用できません。
  • Entire Connection ワークファイルを読み取る場合

  • ダイナミック変数を使用する場合

ワークファイルタイプ CSV を使用する場合、RECORD オプションは無視され、処理は SELECT モードに切り替わります。

SELECT
SELECT オプション(デフォルト):

SELECT を指定した場合、オペランドリスト( operand2)に指定されたフィールドのみが使用可能になります。 入力レコード内のフィールドの位置を OFFSET または FILLER 指定で示すことができます。

OFFSET n OFFSET 0 は、レコードの先頭バイトを示します。 TYPE UNFORMATTED で定義されたワークファイルに OFFSET を指定することはできません。
FILLER nX 入力レコード内で n バイト分スキップすることを示します。

Natural は、各フィールドに選択された値を割り当て、レコードから選択された数値フィールドに定義どおり正しい数値データが含まれているかをチェックします。 選択されたフィールドのチェックは Natural で行われるため、このオプションを使用すると、シーケンシャルファイルの処理にオーバーヘッドがかかります。

レコードが SELECT オプションで指定した全フィールドを満たさない場合、次のことが適用されます。

  • フィールドの一部だけが満たされる場合、残りの部分は空白またはゼロにリセットされます。

  • まったく満たされなかったフィールドは前の内容のままです。

ファイルタイプ CSV を読み取る場合、OFFSET オプションは無視されます。

GIVING LENGTH operand3

GIVING LENGTH 節は、読み取るレコードの実際の長さを取得するために使用します。 長さ(バイト数)はoperand3 に返されます。

operand3 は、フォーマット/長さ I4 で定義する必要があります。

ワークファイルが TYPE UNFORMATTED として定義されている場合、返される長さはバイトストリームから読み取られるバイト数(FILLER オペランドでスキップしたバイトを含む)を示します。

ワークファイルタイプ CSV で GIVING LENGTH 節を使用した場合は、GIVING LENGTH で指定したオペランドではレコード内のフィールド数(レコードの長さではない)が返されます。

AT END OF FILE

AT END OF FILE 節は ONCE オプションとともに使用できます。 ONCE オプションを使用する場合、エンドオブファイル条件になったときに行う処理をこの節で指定する必要があります。

ONCE オプションを使用しない場合、エンドオブファイル条件は通常の処理ループ終了と同様に扱われます。

END -WORK READ WORK FILE ステートメントを終了するには、Natural 予約語 END-WORK を使用する必要があります。

Top of page

フィールド長

オペランド定義テーブル内のフィールド長は次のように決定されます。

フォーマット 長さ
A、B、I、F 入力レコード中のバイト数は、内部長さ定義と同じです。
N 入力レコード中のバイト数は、小数点の前後の内部桁数の合計です。 小数点と符号は、入力レコード中のバイト数には入りません。
P、D、T 入力レコード中のバイト数は、小数点の前後の桁数の合計に 1(符号用)を加算し、それを 2 で割って切り上げたものです。
L 1 バイトが使用されます。 C フォーマットのフィールドについては、2 バイトが使用されます。

フィールド長の例:

フィールド定義 入力レコード
#FIELD1 (A10) 10 バイト
#FIELD2 (B15) 15 バイト
#FIELD3 (N1.3) 4 バイト
#FIELD4 (N0.7) 7 バイト
#FIELD5 (P1.2) 2 バイト
#FIELD6 (P6.0) 4 バイト

プログラミングガイド』の「ユーザー定義変数のフォーマットおよび長さ」も参照してください。

Top of page

ラージおよびダイナミック変数の処理

ワークファイルタイプ 処理
UNFORMATTED UNFORMATTED ワークファイルからダイナミック変数を読み取ると、(現在の位置から)ファイルの残りすべてが変数に挿入されます。 ファイルが 1073741824 バイトを超過した場合、最大の 1073741824 バイトが変数に挿入されます。
FORMATTED FORMATTED ワークファイルからダイナミック変数を読み取ると、変数は現在定義されている長さ(長さ 0 を含む)で埋められます。 ファイルの終わりに到達すると、現在のフィールドの残りは空白で埋められます。 後続のフィールドは変更されません。

Top of page

** Example 'RWFEX1': READ WORK FILE                                     
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 NAME                                                                
*                                                                       
1 #RECORD                                                               
  2 #PERS-ID (A8)                                                       
  2 #NAME    (A20)                                                      
END-DEFINE                                                              
*                                                                       
FIND EMPLOY-VIEW WITH CITY = 'STUTTGART'                                
  WRITE WORK FILE 1                                                     
        PERSONNEL-ID NAME                                               
END-FIND                                                                
*                                                                       
* ...                                                                   
*                                                                       
READ WORK FILE 1 RECORD #RECORD
  DISPLAY NOTITLE #PERS-ID #NAME
END-WORK                   
*                               
END                            

プログラム RWFEX1 の出力:

#PERS-ID        #NAME        
-------- --------------------
                             
11100328 BERGHAUS            
11100329 BARTHEL             
11300313 AECKERLE            
11300316 KANTE               
11500304 KLUGE               
11500308 DIETRICH            
11500318 GASSNER             
11500343 ROEHM               
11600303 BERGER              
11600320 BLAETTEL            
11500336 JASPER              
11100330 BUSH                
11500328 EGGERT             

Top of page