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