Answer
可変長ファイルの入力では、各レコードのレコード長に注意する必要があります。可変長ファイルに対してレコードを出力する場合は、ファイル定義のDCBパラメータで可変長ファイルの指定を行い、出力時にレコード長をセットする必要があります。
可変長ファイルの場合、レコード記述ワード(RDW)に対して4バイトのレコード長を指定することができ、ファイルがブロッキングされる場合には、ブロック記述ワード(BDW)に対して4バイトのブロック長を指定することができます。
[ファイル定義の記述]
FILE ファイル名 レコード形式 ( レコード長 ブロック長 )
※レコード形式 : 可変長ファイルではV、VB、VBSを指定。
RECORD-LENGTH は現在のデータ・レコードの長さの情報を持ったEasytrieve Plusのシステム定義フィールドです。入力の場合、このフィールドに各レコードごとのレコード長がセットされています。RECORD-LENGTHにレコード長をセットする場合、レコード長はRDWを除いた長さを指定します。RECORD-LENGTHにレコード長を設定しない場合は、最大レコード長がとられます。
[RECORD-LENGTHの記述]
[ファイル名 :] RECORD-LENGTH
※RECORD-LENGTHフィールドは、すべてのファイルに対して同じ名前で用意されます。同一ジョブ内で複数ファイルを参照する場合には、ファイル名で修飾します。可変長ファイルを扱う場合、RECORD-LENGTHで入力レコード長を確認の上データを参照しないと、記憶保護例外でアベンドする可能性がありますので注意が必要です。
記述例
(例1) 可変長ファイルへ出力する
FILE FILEA VB ( 44 444 )
CODE 1 3 N
*
FILE FILEB VB( 44 444 )
*
JOB
IF CODE NE 999
FILEB:RECORD-LENGTH = FILEA:RECORD-LENGTH
PUT FILEB FROM FILEA
END-IF
この例では、可変長ファイル「FILEA」を入力し、CODEが999以外のレコードを可変長ファイル「FILEB」へ出力しています。可変長ファイルへレコードを出力するときには、PUTの実行前にかならずRECORD-LENGTHフィールドにレコード長を設定します。このシステム定義フィールドはすべてのファイルに対して同じ名前で用意されますので、この例のように同一プログラム中で複数ファイルを取り扱う場合にはかならずファイル名で修飾します。
(例2) 固定長ファイルを可変長ファイルへ変換する
FILE FILEA FB ( 80 800 )
CODE 1 3 A
*
FILE FILEB VB ( 44 444 )
*
JOB
IF CODE <= 100
FILEB:RECORD-LENGTH = 40
ELSE
IF CODE 101 THRU 200
FILEB:RECORD-LENGTH = 60
ELSE
IF CODE > 200
FILEB:RECORD-LENGTH = 80
END-IF
END-IF
END-IF