同一の外部記述フィールドから配列をロードする

外部記述データベース・ファイルの入力レコードに、複数のフィールドがまったく同じように定義されている場合には、データ構造を定義して、それらのフィールドをまるで 1 つの配列であるかのように処理することができます。 以下の 3 つのケースを検討してみます。

  1. フィールドがレコード内で連続しており、かつレコードの先頭にある場合
          A          R REC
          A            FLD1           5P 0
          A            FLD2           5P 0
          A            FLD3           5P 0
          A            OTHER         10A  
    この場合は、外部記述データ構造を使用し、配列を追加サブフィールドとして定義します。 次に OVERLAY キーワードを指定して、その配列をフィールドにマッピングします。
          FMYFILE    IF   E             DISK
          D myDS          E DS                  EXTNAME(MYFILE)
          D   fldArray                          LIKE(FLD1) DIM(3)
          D                                     OVERLAY(myDs)
    
          C                   READ      MYFILE
          C                   FOR       i = 1 to %ELEM(fldArray)
          C*                     ... process fldArray(i)
          C                   ENDFOR     
  2. フィールドがレコード内で連続しており、かつレコードの先頭にはない場合
          A          R REC
          A            OTHER1        10A
          A            ... more fields
          A            FLD1          15A
          A            FLD2          15A
          A            FLD3          15A
          A            OTHER2        10A  
    この場合は、外部記述データ構造を使用し、配列を独立フィールドとして定義します。 次に、BASED キーワードを使用して、その配列をフィールドにマッピングし、先頭フィールドのアドレスを指す基底ポインターを初期化します。
          FMYFILE    IF   E             DISK
          D myDS          E DS                  EXTNAME(MYFILE)
    
          D fldArray        S                   LIKE(FLD1) DIM(3)
          D                                     BASED(pFldArray)
          D pFldArray       S               *   INZ(%addr(FLD1))
    
          C                   READ      MYFILE
          C                   FOR       i = 1 to %ELEM(fldArray) 
          C*                     ... process fldArray(i)
          C                   ENDFOR         
  3. フィールドがレコード内で連続していない場合
          A          R REC
          A            OTHER1        10A
          A            FLD1            T         TIMFMT(*ISO)
          A            FLD2            T         TIMFMT(*ISO)
          A            OTHER2        10A
          A            FLD3            T         TIMFMT(*ISO)
          A            OTHER3        10A           
    この場合は、プログラム記述データ構造を定義し、いかなるタイプの情報も定義せずに、その配列に使用するフィールドを列挙します。 次に、OVERLAY キーワードを使用して、配列をフィールドにマッピングします。
          FMYFILE    IF   E             DISK
          D myDS            DS
          D   FLD1
          D   FLD2
          D   FLD3
          D   fldArray                          LIKE(FLD1) DIM(3)
          D                                     OVERLAY(myDs)
          C                   READ      MYFILE
          C                   FOR       i = 1 to %ELEM(fldArray)
          C*                     ... process fldArray(i)
          C                   ENDFOR