付録 H. 複合 OCCURS DEPENDING ON
複合 OCCURS DEPENDING ON (ODO) は COBOL 85 標準の拡張としてサポートされます。
コンパイラーによって許可される複合 ODO の基本形式は、以下のとおりです。
- 可変位置の項目またはグループ: DEPENDING ON オプションが指定された OCCURS 文節によって記述され、 非従属データ項目またはグループが後に続いているデータ項目。
- 可変位置のテーブル: DEPENDING ON オプションが指定された OCCURS 文節によって記述され、OCCURS 文節によって記述された非従属データ項目が後に続いているデータ項目。
- 可変長エレメントを持つテーブル: DEPENDING ON オプションが指定された OCCURS 文節によって記述された従属データ項目を含んでいる OCCURS 文節によって記述されたデータ項目。
- 可変長エレメントを持つテーブルの指標名。
- 可変長エレメントを持つテーブルのエレメント。
複合 ODO によって、ディスク・スペースを節約できますが、使用が容易でなく、コードの保守を困難にする可能性があります。
以下の例は、考えられる複合 ODO のオカレンス・タイプを示しています。
01 FIELD-A.
02 COUNTER-1 PIC S99.
02 COUNTER-2 PIC S99.
02 TABLE-1.
03 RECORD-1 OCCURS 1 TO 5 TIMES
DEPENDING ON COUNTER-1 PIC X(3).
02 EMPLOYEE-NUMBER PIC X(5). 1
02 TABLE-2 OCCURS 5 TIMES 2 3
INDEXED BY INDX. 4
03 TABLE-ITEM PIC 99. 5
03 RECORD-2 OCCURS 1 TO 3 TIMES
DEPENDING ON COUNTER-2.
04 DATA-NUM PIC S99.
この例で、COUNTER-1 は、RECORD-1 の DEPENDING ON 文節のオブジェクトなので、ODO オブジェクトです。 RECORD-1 は、ODO サブジェクトと呼ばれます。 同様に、COUNTER-2 は、対応する ODO サブジェクトである RECORD-2 の ODO オブジェクトです。
上記の例に示した複合 ODO のオカレンス・タイプは、次のとおりです。
- 1
- 可変位置の項目: EMPLOYEE-NUMBER は、同じレベル 01 レコード内の可変長テーブルに続くデータ項目ですが、 この可変長テーブルに従属していません。
- 2
- 可変位置のテーブル: TABLE-2 は、同じレベル 01 レコード内の可変長テーブルに続くテーブルですが、この可変長テーブルに従属していません。
- 3
- 可変長エレメントを持つテーブル: TABLE-2 は、オカレンス数が ODO オブジェクトの内容によって異なる従属データ項目 RECORD-2 を含むテーブルです。
- 4
- 可変長エレメントを持つテーブルの指標名 INDX。
- 5
- 可変長エレメントを持つテーブルのエレメント TABLE-ITEM。
各レコードの可変部分の長さは、その ODO オブジェクトと、その ODO サブジェクトの長さの積です。 例えば、上記の複合 ODO 項目の 1 つへの参照を行う場合、実際の長さ (使用する場合) は以下のように計算されます。
- TABLE-1 の長さは、COUNTER-1 の内容 (RECORD-1 の数) と 3 (RECORD-1 の長さ) を乗算した結果です。
- TABLE-2 の長さは、COUNTER-2 の内容 (RECORD-2 の数) と 2 (RECORD-2 の長さ) を乗算した結果です。
- FIELD-A の長さは、COUNTER-1、COUNTER-2、TABLE-1、 EMPLOYEE-NUMBER、および TABLE-2 x 5 の長さの合計です。
グループ内の複合 ODO 項目を参照する前に、グループ内のすべての ODO オブジェクトを設定する必要があります。 例えば、上記のコードの EMPLOYEE-NUMBER を参照する前に、EMPLOYEE-NUMBER がその値を入手するために COUNTER-1 および COUNTER-2 に直接依存していない場合でも、 両方の ODO オブジェクトを設定する必要があります。