READ WORK FILE

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

関連ステートメント: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 は個々のレコードを読み取るわけではなく、ファイルアクセスパフォーマンスを最適化するためにワークファイルのより大きなブロックを読み取るためです。

構文 1 - 処理ループのある READ WORK FILE

READWORK [FILE] work-file-number

RECORD operand1    

[AND] [SELECT]

OFFSET n
FILLER nX

  operand2 ../graphics/cbc2.gif      

 
       

OFFSET n
FILLER nX

  operand2

   

OFFSET n
FILLER nX

operand4 [AND] ADJUST [OCCURRENCES]

../graphics/dot3.gif

 
[GIVING LENGTH operand3]
statement
END-WORK (structured mode only)
LOOP (reporting mode only)

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

構文 2 - 処理ループのない READ WORK FILE

READWORK [FILE] work-file-number ONCE

RECORD operand1  

[AND] [SELECT]

OFFSET n
FILLER nX

  operand2 ../graphics/cbc2.gif      

../graphics/dot3.gif

../graphics/dot3.gif

 
     

OFFSET n
FILLER nX

  operand2

 

OFFSET n
FILLER nX

  operand4 [AND] ADJUST [OCCURRENCES]

../graphics/dot3.gif

../graphics/dot3.gif

../graphics/dot3.gif

[GIVING LENGTH operand3]
[AT [END] [OF] [FILE] statement END-ENDFILE]           (structured mode only)

AT [END] [OF] [FILE]

statement
DOstatement DOEND

   (reporting mode only)

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

構文説明

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

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

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

構文要素の説明:

構文要素 説明
work-file-number
ワークファイル番号:

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

ONCE
ONCE オプション:

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

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

RECORD operand1FILLER nX
RECORD オプション:

レポーティングモードでは、レコードのレイアウトに対応するオペランドリスト(operand1)を提供する必要があります。オペランドの全長がワークファイルレコードの長さより短い場合は、FILLER nX を指定します。

ストラクチャードモードまたは 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 オプションは無視されます。

operand4 AND ADJUST OCCURRENCES
ADJUST 節:

完全な範囲(*)を持つ 1 次元 X-array を指定します。X-array は、読み取られたすべてのデータを受信するために必要なオカレンス数に合わせて拡張または削減されます。以下の「X-array の処理」を参照してください。

注意:
この機能は、Entire Connection とワークファイルタイプ PORTABLE ではサポートされていません。

GIVING LENGTH operand3
GIVING LENGTH 節:

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

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

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

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

AT END OF FILE
AT END OF FILE 節

この節は、ONCE オプションを使用する場合にのみ使用できます。ONCE オプションを使用する場合、エンドオブファイル条件になったときに行う処理をこの節で指定します。

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

END-WORK
READ WORK FILE ステートメントの終了:

処理ループのあるストラクチャードモードの場合、Natural の予約キーワード END-WORK を使用して READ WORK FILE ステートメントを終了させる必要があります。

LOOP
READ WORK FILE ステートメントの終了:

処理ループのあるレポーティングモードの場合、Natural のステートメント LOOP を使用して READ WORK FILE ステートメントを終了させる必要があります。

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

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

フィールド長

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

Format データ長
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 バイト

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

変数インデックス範囲

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

READ WORK FILE work-file-number #ARRAY (I:J)

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

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

ASCII
ASCII-COMPRESSED

ワークファイルタイプ ASCII および ASCII-COMPRESSED では、最大フィールド/レコード長が 32766 バイトのダイナミック変数およびラージ変数を処理できます。

ASCII または ASCII-COMPRESSED ワークファイルからダイナミック変数を読み取ると、残りのワークファイルレコードが変数に入力されます。このため、このようなタイプのワークファイルの場合、READ WORK FILE ステートメントが実行されるたびにダイナミック変数のサイズが変更され、残りのレコードの長さと同一になるよう調整されます。

SAG (バイナリ)

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

ENTIRECONNECTION

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

PORTABLE
UNFORMATTED

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

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

CSV

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

X-Arrays の処理

ADJUST 節が使用されていない場合、X-array は通常の配列と同じように扱われます。つまり、既存のオカレンスに挿入されます。

表に示すとおり、ADJUST 節を使用すると、完全な範囲(*)で指定された 1 次元 X-array が処理されます。

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

ASCII
ASCII-COMPRESSED
SAG (バイナリ)
CSV

完全な範囲(*)で指定された 1 次元 X-array が展開され、残りのレコードからすべてのデータを受信します。

UNFORMATTED

完全な範囲(*)で指定された 1 次元 X-array が展開され、残りのファイルからすべてのデータを受信します。

PORTABLE
ENTIRECONNECTION

X-array はサポートされていません。

例 1 - READ WORK FILE

** 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

例 2 - ダイナミック変数を含む READ WORK FILE ASCII

** Example 'RWFEX2': READ WORK FILE - ASCII with dynamic variable   
********************************************************************
DEFINE DATA LOCAL                                                       
  1 #DYNA (A) DYNAMIC                                                   
END-DEFINE                                                              
*                                                                       
DEFINE WORK FILE 1 TYPE 'ASCII'                                     
*                                                                       
WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '                         
WRITE WORK FILE 1 VARIABLE 'text4 text5'                                
*                                                                       
READ WORK FILE 1 AND SELECT #DYNA                                       
  DISPLAY *LENGTH(#DYNA) #DYNA (AL=40)                                  
  /*                                                                    
  /* Length: 18  Dyn.Var: 'text1 text2 text3'                           
  /* Length: 11  Dyn.Var: 'text4 text5'                                 
END-WORK                                                                
*                                                                       
END

プログラム RWFEX2 の出力:

Page      1                                                  11-07-15  09:21:09
                                                                               
  LENGTH                     #DYNA                                             
----------- ----------------------------------------                           
                                                                               
         18 text1 text2 text3                                                  
         11 text4 text5

例 3 - ダイナミック変数でフォーマット指定されていない READ WORK FILE

** Example 'RWFEX3': READ WORK FILE - Unformatted with dynamic variable 
************************************************************************
DEFINE DATA LOCAL                                                       
  1 #DYNA (A) DYNAMIC                                                   
END-DEFINE                                                              
*                                                                       
DEFINE WORK FILE 1 TYPE 'UNFORMATTED'                                     
*                                                                       
WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '                         
WRITE WORK FILE 1 VARIABLE 'text4 text5'                                
*                                                                       
DEFINE WORK FILE 1 TYPE 'UNFORMATTED'                                   
*                                                                       
READ WORK FILE 1 AND SELECT #DYNA                                       
  DISPLAY *LENGTH(#DYNA) #DYNA (AL=40)                                  
  /*                                                                    
  /* Length: 29  Dyn.Var: 'text1 text2 text3 text4 text5'               
END-WORK                                                                
* 
END

プログラム RWFEX3 の出力:

Page      1                                                  11-07-15  09:31:04
                                                                               
  LENGTH                     #DYNA                                             
----------- ----------------------------------------                           
                                                                               
         29 text1 text2 text3 text4 text5

例 4 - X-Array があり、そのオカレンスを調整するREAD WORK FILE ASCII

** Example 'RWFEX4': READ WORK FILE - ASCII with X-array            
**                                    and ADJUST its occurrences        
********************************************************************
DEFINE DATA LOCAL                                                       
  1 #ARR (A6/1:*)                                                       
  1 #OCC (I4)                                                           
END-DEFINE                                                              
*                                                                       
DEFINE WORK FILE 1 TYPE 'ASCII'                                     
*                                                                       
WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '                         
WRITE WORK FILE 1 VARIABLE 'text4 text5'                                
*                                                                       
READ WORK FILE 1 AND SELECT #ARR(*) AND ADJUST OCCURRENCES              
  #OCC := *OCCURRENCE(#ARR)                                             
  DISPLAY #OCC #ARR(1:#OCC)                                             
  /*                                                                    
  /* Occurrences: 3 Array(*): 'text1', 'text2', 'text3'                 
  /* Occurrences: 2 Array(*): 'text4', 'text5'  
END-WORK
*       
END

プログラム RWFEX4 の出力:

Page      1                                                  11-07-15  09:36:13
                                                                               
   #OCC      #ARR                                                              
----------- ------                                                             
                                                                               
          3 text1                                                              
            text2                                                              
            text3                                                              
          2 text4                                                              
            text5

例 5 - X-array でフォーマット指定されておらず、そのオカレンスを調整する READ WORK FILE

** Example 'RWFEX5': READ WORK FILE - Unformatted with X-array          
**                                    and ADJUST its occurrences        
************************************************************************
DEFINE DATA LOCAL                                                       
  1 #ARR (A6/1:*)                                                       
  1 #OCC (I4)                                                           
END-DEFINE                                                              
*                                                                       
DEFINE WORK FILE 1 TYPE 'UNFORMATTED'                                     
*                                                                       
WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '                         
WRITE WORK FILE 1 VARIABLE 'text4 text5'                                
*                                                                       
DEFINE WORK FILE 1 TYPE 'UNFORMATTED'                                   
*                                                                       
READ WORK FILE 1 AND SELECT #ARR(*) AND ADJUST OCCURRENCES              
  #OCC := *OCCURRENCE(#ARR)                                             
  DISPLAY #OCC #ARR(1:#OCC)                                             
  /* 
  /*Occurrences: 5 Array(*): 'text1', 'text2', 'text3', 'text4', 'text5'
END-WORK                                                                
*                                                                       
END

プログラム RWFEX5 の出力:

Page      1                                                  11-07-15  09:41:25
                                                                               
   #OCC      #ARR                                                              
----------- ------                                                             
                                                                               
          5 text1                                                              
            text2                                                              
            text3                                                              
            text4                                                              
            text5