ファイル・パラメーターの受け渡しと使用に関する規則

  • 渡されるファイルは、プロトタイプ・パラメーターと同じ親ファイルを使用して定義する必要があります。
  • ファイル・パラメーターは修飾されます。 親ファイル 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