可変テーブルへのエレメントの追加時のオーバーレイの防止
同じグループ内で 1 つまたは複数の非従属データ項目が後に続く可変オカレンス・テーブルのエレメント数を増加する場合には、注意が必要です。 ODO オブジェクトの値を増加し、テーブルにエレメントを追加する場合、 テーブルの後に続く可変位置データ項目に意図せずにオーバーレイしてしまう可能性があります。
このタイプのエラーを回避するには、以下のステップを行います。
- テーブルの後に続く可変位置データ項目を、別のデータ域に保管する。
- ODO オブジェクトの値を増加する。
- 新しいテーブル・エレメントにデータを移動する (必要な場合)。
- 可変位置データ項目を保管したデータ域から復元する。
以下の例で、そのエレメント数が ODO オブジェクト CONTROL-1 に依存する、テーブル VARY-FIELD-1 にエレメントを追加する必要があるとします。 VARY-FIELD-1 の後には、非従属可変位置データ項目 GROUP-ITEM-1 が続いていて、このエレメントがオーバーレイされる可能性があります。
WORKING-STORAGE SECTION.
01 VARIABLE-REC.
05 FIELD-1 PIC X(10).
05 CONTROL-1 PIC S99.
05 CONTROL-2 PIC S99.
05 VARY-FIELD-1 OCCURS 1 TO 10 TIMES
DEPENDING ON CONTROL-1 PIC X(5).
05 GROUP-ITEM-1.
10 VARY-FIELD-2
OCCURS 1 TO 10 TIMES
DEPENDING ON CONTROL-2 PIC X(9).
01 STORE-VARY-FIELD-2.
05 GROUP-ITEM-2.
10 VARY-FLD-2
OCCURS 1 TO 10 TIMES
DEPENDING ON CONTROL-2 PIC X(9).
VARY-FIELD-1 の各エレメントは 5 バイトであり、VARY-FIELD-2 の各エレメントは 9 バイトです。 CONTROL-1 と CONTROL-2 の両方に値 3 が入っている場合、VARY-FIELD-1 と VARY-FIELD-2 のストレージを以下のような図で示すことができます。

VARY-FIELD-1 に 4 番目のエレメントを追加するには、VARY-FIELD-2 の最初の 5 バイトへのオーバーレイを防止するために、 以下のようにコーディングしてください。 (GROUP-ITEM-2 は、可変位置 GROUP-ITEM-1 の一時記憶域として使用します。)
MOVE GROUP-ITEM-1 TO GROUP-ITEM-2.
ADD 1 TO CONTROL-1.
MOVE five-byte-field TO
VARY-FIELD-1 (CONTROL-1).
MOVE GROUP-ITEM-2 TO GROUP-ITEM-1.
VARY-FIELD-1 と VARY-FIELD-2 の変更済みのストレージを、以下のような図で示すことができます。

VARY-FIELD-1 の 4 番目のエレメントは、VARY-FIELD-2 の最初のエレメントにオーバーレイしていないことに注意してください。