ODO オブジェクトの値を変更する場合のエラーの防止
テーブル内の従属データ項目に関する ODO オブジェクトの値を変更した後に、 複合 ODO 指標名 (可変長エレメントのテーブルの指標名) を参照する場合には、注意が必要です。 ODO オブジェクトの値を変更した場合、関連する複合 ODO 指標内のバイト・オフセットは、 テーブルの長さが変更されているので、もはや有効ではありません。 この後に、以下の方法で指標名を参照するようにコーディングする場合、注意しないと予期しない結果が生じる可能性があります。
- テーブルのエレメントへの参照
- SET 整数データ項目 TO 指標名 という形式の SET ステートメント (形式 -1)
- SET 指標名 UP|DOWN BY 整数 という形式の SET ステートメント (形式 -2)
このタイプのエラーを回避するには、以下のステップを行います。
- 指標項目を整数データ項目に保管する。 (この実行によって、暗黙の変換が行われます。整数項目は、指標内のオフセットに対応する、 テーブル・エレメントのオカレンス番号を受け取ります。)
- ODO オブジェクトの値を変更する。
- 即時に、整数データ項目から指標項目を復元する。 (この実行によって、暗黙の変換が行われます。指標項目は、整数項目内のテーブル・エレメントのオカレンス番号に対応するオフセットを受け取ります。 このオフセットは、その時点で有効であるテーブル長に従って計算されます。)
以下のコードは、ODO オブジェクト COUNTER-2 を変更する場合に 付録 H. 複合 OCCURS DEPENDING ONに示した指標名を保管および復元する方法を示しています。
77 INTEGER-DATA-ITEM-1 PIC 99.
...
SET INDX TO 5.
* INDX is valid at this point.
SET INTEGER-DATA-ITEM-1 TO INDX.
* INTEGER-DATA-ITEM-1 now has the
* occurrence number corresponding to INDX.
MOVE NEW-VALUE TO COUNTER-2.
* INDX is not valid at this point.
SET INDX TO INTEGER-DATA-ITEM-1.
* INDX is now valid, containing the offset
* corresponding to INTEGER-DATA-ITEM-1, and
* can be used with the expected results.