可変長配列のサポート
可変長の配列は、COBOL コピーブックでは OCCURS DEPENDING ON (ODO) 文節によって定義され、PL/I コピーブックでは、下限または上限 (あるいはその両方) が REFER オプションによって定義されている次元属性によって定義されます。PL/I コピーブックの場合、宣言された長さについて PL/I ストリング・データ・タイプに REFER 変数 (例: CHAR(expr REFER name)) があるときにも、可変長の配列が定義されます。
次の考慮事項は、可変長配列が入っているテンプレートを使用する場合に適用されます。
- 1 つのレコード構造には複数の可変長配列を含めることができます。ただし、配列のサイズ (ODO または REFER「オブジェクト」) を定義するフィールドはすべて、最初の可変長配列項目の前のレコード内に含まれるか、または PL/I REFER 長の場合には、REFER 長で宣言された最初のストリングの前のレコード内に含まれる必要があります。
- 以下のいずれかが該当する場合、
- (COBOL コピーブックのみ)。オブジェクトが、ODO 文節の指定範囲外にある。
- 実際のレコード長は、オブジェクトによって指定された配列項目数を持つレコードの計算値と一致しない。
- (PL/I コピーブックのみ)。レコード長は、ストリング長 REFER と、配列の次元ごとに下限および上限の REFER から計算された次元エクステントの数の両方に基づいて計算されるレコード長と一致しない。
データ・セットを編集するとき、長さが無効であるためにレコードが選択されなかったことを示す記述「=LGTH」が接頭部域に含まれます。(これらのレコードを (他の「非選択」レコードとともに非表示にせずに) 表示するには、Edit/Browse Options (option 0.8) パネルで「Length error (長さエラー)」オプションを選択します)。
- SNGL または TABL 表示形式の場合。
- レコード長は、オブジェクト・フィールドの値を変更することによって変更することができます。これは、ZOOM を使用せずに、編集セッションでレコード長を変更することができないという規則の例外です。
- オブジェクト・フィールドの値を変更すると、配列内の項目の数が自動的に増減されます。
新規項目は、現行の配列の終わり (および配列の後のフィールドの前) に挿入され、数値項目はゼロに、英数字項目はブランクに初期化されます。
同様に、項目が配列の終わりから削除されますが、配列の最後に続くフィールドには影響しません。
PL/I の場合には、配列内の項目の数は、次元属性の上限から下限を引いた値に 1 を加えることによって決定されます。REFER 変数 (フィールド) が配列次元の下限または上限として指定されている場合、REFER オブジェクト・フィールドの値を変更すると、それに応じて配列項目が挿入または削除されます。TABL 形式の場合、配列項目の新規の数が配列の TABL 列の現行数を超えると、File Manager は表示の列数を増やして、新規の列見出しを追加します。同様に、PL/I ストリング長 REFER が変更されると、その REFER を使用する各変数の TABL の列幅が変更されます。
- (COBOL コピーブックのみ)。File Manager では、オブジェクト・フィールドを、ODO 文節によって指定される範囲の外にある値に変更することはできません (File Manager は ODO の下限値 0 をサポートします)。
- (COBOL コピーブックのみ)。新規レコードを挿入すると、レコードは ODO 定義で指定された配列項目の最小数になります。例えば、次の ODO 文節があるとします。
ODO-ONE OCCURS 0 TO 10 TIMES DEPENDING ON ODO-CNTRL-ONE.
この場合、新規レコードを挿入すると、ODO-CNTRL-ONE フィールドがゼロに初期設定されて、新規レコードには ODO-ONE 配列項目がないことになります。
次の ODO 文節があるとします。
ODO-ONE OCCURS 5 TO 7 TIMES DEPENDING ON ODO-CNTRL-ONE.
この場合、ODO-CNTRL-ONE が 5 に初期設定されて、新規レコードには 5 つの ODO-ONE 配列項目があることになります。
- (PL/I コピーブックのみ)。REFER 指定が含まれているテンプレートを使用して新規レコードを挿入すると、それぞれの配列次元に 1 つのエレメントが作成されます。上限および下限の REFER 値は、1 に設定されます。
- CHAR、HEX、または LHEX 表示形式では、オブジェクト・フィールドの値を変更してもレコード長は変わりません。これらの表示形式では、 オブジェクト・フィールドの値を変更すると、オブジェクト・フィールドの値と そのような多数の配列項目を持つレコード長の計算値が一致しないことになります。
「Expose (do not group) records of types: Length error (公開する (グループ化しない) レコード・タイプ: 長さエラー)」を Edit/Browse Options (option 0.8) パネルで選択すると、Edit (option 2) では、このようなレコードの接頭部域に「=LGTH」が表示されます。