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

READ WORK FILE

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

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

RECORD operand1            

  [AND] [SELECT]

OFFSET n operand2
  FILLER nX
  [GIVING LENGTH operand3]
 

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 以外の物理順ワークファイルからデータを読み取るために使用します。 データはワークファイルから順次読み取られます。 データがどのように読み取られるかは、そのデータがワークファイルにどのように書き込まれたということとは無関係です。

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

注意:

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

ASCII ワークファイルを読み取る場合、最後の物理レコードの後に最後のレコードとして空のレコードが返されることがあります。 Natural は個々のレコードを読み取るわけではなく、ファイルアクセスパフォーマンスを最適化するためにワークファイルのより大きなブロックを読み取るためです。

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                

ワークファイルタイプ ENTIRECONNECTION または TRANSFER を使用しているとき、operand2 のフォーマットを C にすることはできません。

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

構文要素の説明:

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 の次回実行時に読み取られる最初のレコードに再位置決めされます。

RECORD operand1 FILLER nX
RECORD オプション:

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

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

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

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

下記の「RECORD オプションの使用方法の概要」を参照してください。

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

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

OFFSET n OFFSET 0 は、レコードの先頭バイトを示します。
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 を使用する必要があります。

RECORD オプションの使用方法の概要

RECORD オプションとの併用 コンパイル時に排除 ランタイムに排除 RECORD オプションが無視され、処理が SELECT モードに切り替わる
ワークファイルタイプ ENTIRE CONNECTION   x  
ダイナミック変数 x    
ワークファイルタイプ CSV     x
ワークファイルタイプ PORTABLE     x
ワークファイルタイプ ASCII、ASCII COMPRESSED、CSV、UNFORMATTED、コンフィグレーションユーティリティでコードページが指定されている場合(変換が必要)、または 1 つ以上の Unicode フィールドが指定されている場合(フォーマット U のオペランド、変換が必要)     x

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

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

ワークファイルタイプ 処理

ASCII
ASCII-COMPRESSED
SAG(バイナリ)

ワークファイルタイプ ASCII、ASCII-COMPRESSED、および SAG(バイナリ)では、ダイナミック変数は処理できず、エラーが生成されます。 ただし、最大フィールド/レコード長が 32766 バイトのラージ変数は処理できます。

ENTIRECONNECTION

ワークファイルタイプ ENTIRECONNECTION では、ダイナミック変数は処理できません。 ただし、このタイプでは、最大フィールド/レコード長が 107341824 バイトのラージ変数を処理できます。

どのダイナミック変数を使用する場合でも、RECORD オプションは許可されません。

PORTABLE
UNFORMATTED

2 つのワークファイルタイプ PORTABLE と UNFORMATTED を使用して、ラージおよびダイナミック変数をワークファイルに書き込んだりワークファイルから読み取ったりできます。 これらのタイプには、ダイナミック変数に対するサイズ制限がありません。 ただし、ラージ変数は最大フィールド/レコード長の 32766 バイトを超えることはできません。

PORTABLE ワークファイルからダイナミック変数を読み取ると、保存されている長さへのサイズ変更が行われます。

CSV ダイナミックおよびラージ変数の最大フィールド/レコード長は 32766 バイトです。 ダイナミック変数がサポートされます。 X-array は許可されていないので、エラーメッセージが表示されます。

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