DCLOPT(*NOCHGDSLEN
DCLOPT キーワードは宣言に関連するオプションを指定します。
パラメーターは *NOCHGDSLEN でなければなりません。
DCLOPT(*NOCHGDSLEN) が指定されると、以下の条件が満たされれば、自由形式のファイルまたは定義ステートメント内で %SIZE をデータ構造パラメーターと一緒に使用することができます。
- すべてのサブフィールドが定義される。
- データ構造が DIM または OCCURS キーワードで定義された場合は、%SIZE が指定されたとき、次元を定義しなければならない。
- %SIZE とデータ構造定義は、その両方をグローバル宣言内で使用するか、または両方を同じサブプロシージャー内で使用しなければならない。
以下の追加規則が適用されます。
- 入力仕様にデータ構造を指定することはできない。
- 演算仕様の結果フィールドにデータ構造がある場合は、「長さ」記入項目を指定できない。
- 外部記述ファイル内に生成された入力仕様または出力仕様がある場合は、そのファイル内のフィールド名をデータ構造の名前にすることはできない。 (QUALIFIED キーワードも LIKEFILE キーワードもないグローバル・ファイルに対しては入力仕様と出力仕様が生成されます。)
次の例では、
- 制御ステートメントにキーワード DCLOPT(*NOCHGDSLEN) が指定されています。
- データ構造 MYDS は明示的な長さなしで定義されています。
- サブフィールド DATA は LINE と同様に定義されています。
- 最初のファイル宣言は、%SIZE(MYDS) の値がまだ知られていないので無効です。
- フィールド LINE が定義され、MYDS のすべてのサブフィールドが定義されて、制御ステートメント内に DCLOPT(*NOCHGDSLEN) があるときは、データ構造 MYDS が定義され、このデータ構造のサイズが知られます。
- 2 番目のファイル宣言は、%SIZE(MYDS) の値が知られているため、有効です。
DCLOPT(*NOCHGDSLEN) がないと、コンパイラーがこのプロシージャーのすべてのステートメントを処理し終わるまで MYDS のサイズが未知であるため、どちらのファイル宣言も無効になります。
ctl-opt dclopt(*nochgdslen); // 1
dcl-ds myDs; // 2
seq zoned(6:2);
dat zoned(6);
data like(line); // 3
end-ds;
dcl-f myfile1 disk(%size(myDS)); // 4
dcl-s line char(100); // 5
dcl-f myfile2 disk(%size(myDS)); // 6
