複合 OCCURS DEPENDING ON (ODO) は COBOL 85 標準の拡張としてサポートされます。
コンパイラーによって許可される複合 ODO の基本形式は、以下のとおりです。
複合 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 オブジェクトと、その ODO サブジェクトの長さの積です。 例えば、上記の複合 ODO 項目の 1 つへの参照を行う場合、実際の長さ (使用する場合) は以下のように計算されます。
グループ内の複合 ODO 項目を参照する前に、グループ内のすべての ODO オブジェクトを設定する必要があります。 例えば、上記のコードの EMPLOYEE-NUMBER を参照する前に、EMPLOYEE-NUMBER がその値を入手するために COUNTER-1 および COUNTER-2 に直接依存していない場合でも、 両方の ODO オブジェクトを設定する必要があります。