ファイル・パラメーターの受け渡しと使用に関する規則
- 渡されるファイルは、プロトタイプ・パラメーターと同じ親ファイルを使用して定義する必要があります。
- ファイル・パラメーターは修飾されます。 親ファイル FILE1 のレコード様式が REC1 および REC2 であるとすると、ファイル・パラメーター PARM のレコード様式は、呼び出し先プロシージャーでは PARM.REC1 および PARM.REC2 となります。
- 渡されるファイルのあらゆる設定 (ファイル仕様書キーワードを使用して定義される設定) は、アクセス方法にかかわらず (ファイルに直接アクセス、パラメーターを渡すことによってアクセス)、そのファイルにアクセスするすべてのプロシージャーについて有効になります。 例えば、外部ファイル名を保持する変数に EXTFILE キーワードが指定されている場合に、呼び出し先プロシージャーがそのファイルをオープンすると、呼び出し元の変数の値を使用して、オープンされるファイルの名前が設定されます。 ファイルに関連付けられている変数に対して、呼び出し先プロシージャーがキーワードを介してアクセスまたは変更を実行する必要がある場合、呼び出し元プロシージャーはそれらの変数を別々のパラメーターとして渡さなければなりません。
- ファイル・フィードバック組み込み関数の %EOF(ファイル名)、%EQUAL(ファイル名)、%FOUND(ファイル名)、%OPEN(ファイル名)、および %STATUS(ファイル名) を呼び出し先プロシージャーで使用して、ファイル・パラメーターの現在の状態を判別することができます。
この場合は、ファイル・パラメーターの名前をオペランドとして組み込み関数に指定してください。
モジュール間でのファイル・パラメーターの引き渡しについて詳しくは、ファイルに関連付けられる変数および ファイルを渡す方法および関連付けられている変数を含むデータ構造を渡す方法の例を参照してください。
図 1. ファイルをパラメーターとしてプロシージャーに渡す
* Define a file template to be used for defining actual files
* and the file parameter
Finfile_t IF E DISK TEMPLATE BLOCK(*YES)
F EXTDESC('MYLIB/MYFILE')
F RENAME(R01M2:inRec)
* Define two actual files that can be passed to the file parameter
Ffile1 LIKEFILE(infile_t)
F EXTFILE('MYLIB/FILE1')
Ffile2 LIKEFILE(infile_t)
F EXTFILE('MYLIB/FILE2')
* Define a data structure type for the file data
D inData_t DS LIKEREC(infile_t.inRec:*INPUT)
D TEMPLATE
* Define the prototype for a procedure to handle the files
D nextValidRec PR N
D infile LIKEFILE(infile_t)
D data LIKEDS(inData_t)
* Define variables to hold the record data
D f1Data DS LIKEDS(inData_t)
D f2Data DS LIKEDS(inData_t)
/FREE
// Process valid records from each file until one
// of the files has no more valid records
DOW nextValidRec(file1 : f1Data)
AND nextValidRec(file2 : f2Data);
// ... process the data from the files
ENDDO;
*INLR = '1';
/END-FREE
* The procedure that will process the file parameter
P nextValidRec B
D nextValidRec PI N
D infile LIKEFILE(infile_t)
D data LIKEDS(inData_t)
/FREE
// Search for a valid record in the file parameter
READ infile data;
DOW NOT %EOF(infile);
IF data.active = 'Y';
RETURN *ON; // This is a valid record
ENDIF;
READ infile data;
ENDDO;
RETURN *OFF; // No valid record was found
/END-FREE
P nextValidRec E