可変長配列のサポート
可変長配列は、COBOL コピーブックでは OCCURS DEPENDING ON (ODO) 文節で定義され、PL/I コピーブックでは、上限または下限 (または両方) が REFER オプションによって定義される次元属性で定義されます。
注: 可変長セグメントは、2 バイトの 2 進数値の
size field (サイズ・フィールド)で始まります。したがって、可変長セグメントのレイアウトでは、最初の基本項目は 2 バイトの 2 進数値フィールドでなければなりません。
可変長配列が入っているレイアウトを使用するときには、以下の考慮事項が適用されます。
- 可変長セグメント・タイプのレイアウトでは可変長配列だけを使用します。
- レイアウトには複数の可変長配列を入れることができますが、 配列のサイズを定義するフィールド (ODO または
オフジェクト
参照) はすべて、 最初の可変長配列項目より前のレイアウトに存在する必要があります。 - データベースのブラウズまたは編集時に、次のいずれかの条件が真である場合、セグメントの「Cmd」フィールドに、セグメント長がそのレイアウトには正しくないことを示すタグ
=LGが入ります。- (COBOL コピーブックのみ)。オブジェクトが、ODO 文節の指定範囲外にある。
- セグメントの実際の長さが、オブジェクトによって指定された配列項目の数で計算されたセグメントの長さと一致しない。
- SNGL または TABL 表示形式の場合。
- オブジェクト・フィールドの値を変更した場合は、配列中の項目数は自動的に拡張または縮小され、サイズ・フィールドの値 (可変長セグメントの始めにある 2 バイトの 2 進数値フィールド) が、新しいセグメント長に一致するように調整されます。
新規項目は、現行の配列の終わり (および配列の後のフィールドの前) に挿入され、数値項目はゼロに、英数字項目はブランクに初期化されます。
同様に、項目が配列の終わりから削除されますが、配列の最後に続くフィールドには影響しません。
PL/I の場合には、配列中の項目数は、次元属性の上限から下限を減算することによって決 定されます。下限と上限の両方が REFER オプションを使用して指定されている場合には、REFER 項目フィールドの いずれかの値を変更すると、それに応じて配列項目が挿入または削除されます。
- (COBOL コピーブックのみ)。オブジェクト・フィールドを、ODO 文節が指定する範囲外の値に変更することはできません。(FM/IMS は、ODO の最小値 0 をサポートします。)
- (COBOL コピーブックのみ)。新規セグメントを挿入することによって、セグメントは ODO 定義によって指定された最小数の配列項目を持つことになります。例:
- 次の ODO 文節の場合、新規のセグメントを挿入すると、ODO-CNTRL-ONE フィールドがゼロに初期化され、 新規のセグメントの中には ODO-ONE 配列項目がなくなります。
ODO-ONE OCCURS 0 TO 10 TIMES DEPENDING ON ODO-CNTRL-ONE. - 次の ODO 文節の場合、ODO-CNTRL-ONE は 5 に初期化され、新規セグメントの中には 5 つの ODO-ONE 配列項目が入ります。
ODO-ONE OCCURS 5 TO 7 TIMES DEPENDING ON ODO-CNTRL-ONE.
- 次の ODO 文節の場合、新規のセグメントを挿入すると、ODO-CNTRL-ONE フィールドがゼロに初期化され、 新規のセグメントの中には ODO-ONE 配列項目がなくなります。
- (PL/I コピーブックのみ)。新規セグメントを挿入することによって、セグメントの配列項目数がゼロになります。上限および下限の参照オブジェクト・フィールドはゼロに初期化されます。
- オブジェクト・フィールドの値を変更した場合は、配列中の項目数は自動的に拡張または縮小され、サイズ・フィールドの値 (可変長セグメントの始めにある 2 バイトの 2 進数値フィールド) が、新しいセグメント長に一致するように調整されます。
- CHAR、HEX または LHEX 表示形式では、オブジェクト・フィールドの値を変更しても、セグメント長は変わりません。これらの表示形式では、オブジェクト・フィールドの値を変更すると、 オブジェクト・フィールド値と、多くの配列項目を持つセグメントの計算された長さが一致 しなくなる場合があります。