テーブル・エレメントが出現する回数が実行前にわからない場合には、可変長テーブルを定義しなければなりません。 そのためには、OCCURS DEPENDING ON (ODO) 文節を使用します。
X OCCURS 1 TO 10 TIMES DEPENDING ON Y
上の例で、X は ODO サブジェクト と呼び、Y は ODO オブジェクト と呼びます。
可変長レコードを正しく操作するためには、次の 2 つの要因が影響します。
グループ項目の可変部分の長さは、DEPENDING ON 句のオブジェクトと OCCURS 文節のサブジェクトの長さとの積です。
ODO オブジェクトの内容がそれの PICTURE 文節と一致していない場合には、プログラムが異常終了することがあります。ODO オブジェクトに、テーブル・エレメントの現在のオカレンス回数を正しく指定するようにしてください。
次の例は、OCCURS DEPENDING ON 文節のサブジェクトとオブジェクトの両方を含むグループ項目 (REC-1) を示しています。グループ項目の長さがどのようにして決定されるかは、それがデータを送り出しているのか、データを受け取っているのかによって異なります。
WORKING-STORAGE SECTION.
01 MAIN-AREA.
03 REC-1.
05 FIELD-1 PIC 9.
05 FIELD-2 OCCURS 1 TO 5 TIMES
DEPENDING ON FIELD-1 PIC X(05).
01 REC-2.
03 REC-2-DATA PIC X(50).
REC-1 (この場合は送り出し項目) を REC-2 に移動したい場合、REC-1 の長さは、FIELD-1 の現行値を使用して、移動の直前に決定されます。 FIELD-1 の内容がその PICTURE 文節と一致している場合 (すなわち、 FIELD-1 がゾーン 10 進数項目を含んでいる場合)、REC-1 の実際の長さに基づいて移動は続行可能です。それ以外の場合は、結果は予測できません。 移動を開始する前に、ODO オブジェクトに正しい値が含まれていることを確認してください。
REC-1 (この場合は受け取り項目) に移動を行う場合、REC-1 の長さは、最大のオカレンス回数を使用して決定されます。この例では、FIELD-2 の 5 回のオカレンスと FIELD-1 の合計で 26 バイトの長さになります。この場合、REC-1 を受け取り項目として参照する前に、ODO オブジェクト (FIELD-1) を設定する必要はありません。 ただし、移動によって受信フィールドの ODO オブジェクトを有効に設定するようにするためには、送信フィールドの ODO オブジェクトを 1 から 5 の間の有効な数値に設定しなければなりません。
しかし、REC-1 の後に可変位置グループ (複合 ODO) が続いているような REC-1 (この場合も受け取り項目) に移動を行う場合は、REC-1 の実際の長さは、移動の直前に ODO オブジェクト (FIELD-1) の現行値を使用して計算されます。次の例では、REC-1 と REC-2 は同じレコードにありますが、REC-2 は REC-1 に従属していないため、可変位置項目です。
01 MAIN-AREA
03 REC-1.
05 FIELD-1 PIC 9.
05 FIELD-3 PIC 9.
05 FIELD-2 OCCURS 1 TO 5 TIMES
DEPENDING ON FIELD-1 PIC X(05).
03 REC-2.
05 FIELD-4 OCCURS 1 TO 5 TIMES
DEPENDING ON FIELD-3 PIC X(05).
コンパイラーは、実際の長さが使用されたことを知らせるメッセージを出します。この場合には、グループ項目を受信フィールドとして使用する前に、ODO オブジェクトの値を設定することが必要となります。
次の例は、ODO オブジェクト (下の LOCATION-TABLE-LENGTH) がグループの外側にあるときの、可変長テーブルの定義方法を示します。
DATA DIVISION.
FILE SECTION.
FD LOCATION-FILE.
01 LOCATION-RECORD.
05 LOC-CODE PIC XX.
05 LOC-DESCRIPTION PIC X(20).
05 FILLER PIC X(58).
WORKING-STORAGE SECTION.
01 FLAGS.
05 LOCATION-EOF-FLAG PIC X(5) VALUE SPACE.
88 LOCATION-EOF VALUE “FALSE”.
01 MISC-VALUES.
05 LOCATION-TABLE-LENGTH PIC 9(3) VALUE ZERO.
05 LOCATION-TABLE-MAX PIC 9(3) VALUE 100.
*****************************************************************
*** L O C A T I O N T A B L E ***
*** FILE CONTAINS LOCATION CODES. ***
*****************************************************************
01 LOCATION-TABLE.
05 LOCATION-CODE OCCURS 1 TO 100 TIMES
DEPENDING ON LOCATION-TABLE-LENGTH PIC X(80).
関連概念
付録D. 複合 OCCURS DEPENDING ON
関連タスク
可変長テーブルへの値の割り当て
可変長テーブルのロード
エレメントを可変テーブルに追加する際のオーバーレイを防止する
データ項目の長さの検出
関連参照
OCCURS DEPENDING ON 文節
(「COBOL for Windows 言語解説書」)