NULLIND{(ヌル標識)}
NULLIND キーワードを使用すれば、フィールドまたはデータ構造に対して %NULLIND 値を明示的に定義することができます。
ある項目に対して NULLIND キーワードが指定されると、このキーワードのパラメーターは、その定義しようとしている項目に対してヌル標識、ヌル標識配列、またはヌル標識データ構造として使用されます。
定義しようとしている項目がデータ構造でなければ、NULLIND キーワードのパラメーターを省略することができます。 その場合は、変数や配列はヌル可能ですが、%NULLIND 組み込み関数を使用してヌル標識のアドレスを指定する必要があります。
NULLIND キーワードへのパラメーターとして指定された標識については、その名前、または関連項目の %NULLIND 組み込み関数のいずれかによってアドレス指定することができます。 例えば、フィールド myField が NULLIND(myNullind) で定義された場合、%NULLIND(myField) と myNullind はどちらも標識 myNullind を表します。 配列データ構造 myDs が NULLIND(myDsNulls) で定義された場合、myDsNulls(i).addr と %NULLIND(myDs(i).addr) はどちらも標識 myDsNulls(i).addr を表します。
- NULLIND キーワードのパラメーターは、サブフィールドのデータ・タイプ以外のあらゆる方法で定義しようとしている項目と一致しなければなりません。
- この項目がデータ構造である場合は、外部記述データ構造でなければなりません。 NULLIND キーワードのパラメーターも、EXTNAME または LIKEREC キーワードの抜き出しタイプで、*NULL パラメーターを追加して、項目として外部記述されなければなりません。
- 個々の外部サブフィールドに対して NULLIND キーワードを指定することはできません。 外部記述データ構造のサブフィールドは、外部フィールドがヌル可能である場合は自動的にヌル可能として定義されます。 特定の標識を外部記述サブフィールドのヌル標識として定義するためには、外部記述ヌル標識データ構造を定義し、それを外部記述データ構造と関連付ける必要があります。
- プログラム記述データ構造に対して NULLIND キーワードを指定することはできません。 外部記述データ構造の追加のプログラム記述サブフィールドに対して NULLIND キーワードを指定できますが、このデータ構造が入出力操作と一緒に使用されると、プログラム記述サブフィールドのヌル標識は考慮されません。
- 項目が配列である場合は、NULLIND キーワードのパラメーターも同じ次元を持つ配列でなければなりません。
- 項目がサブフィールドである場合は、NULLIND キーワードのパラメーターも同じデータ構造内のサブフィールドでなければなりません。 データ構造が修飾されている場合は、修飾データ構造名を付けずに NULLIND キーワードのパラメーターを指定する必要があります。 下記の例を参照してください。
- LIKE キーワードで定義されたフィールドまたは LIKEDS キーワードで定義されたデータ構造は、LIKE または LIKEDS キーワードのパラメーターの NULLIND キーワードを継承しません。 しかし、LIKEDS キーワードで定義されたデータ構造は、NULLIND キーワードのパラメーターとして指定されたデータ構造のサブフィールドに指定された NULLIND キーワードによって定義された関係を継承します。 下記の例を参照してください。
- NULLIND キーワードのパラメーターの有効範囲および記憶域タイプは、項目と同じでなければなりません。 例えば、項目がサブプロシージャー内の静的フィールドである場合は、NULLIND キーワードのパラメーターも同じサブプロシージャー内の静的フィールドでなければなりません。
- プロトタイプ・パラメーターに NULLIND キーワードが指定されたとき
- NULLIND キーワードのパラメーターは必須です。
- NULLINDキーワードのパラメーターはパラメーター・リスト内の別のパラメーターでなければなりません。
- OPTIONS(*NULLIND) はパラメーターには使用できません。
- NULLINDキーワードのパラメーターはヌル可能とすることもヌル可能サブフィールドを持つこともできません。
- NULLINDキーワードのパラメーターは 1 つの項目にしか指定できません。
- NULLIND キーワードは、ALWNULL(*USRCTL) キーワードが有効である場合にのみ使用できます。
例
- 次の例では、フィールド DUEDATE はパラメーターを持たない NULLIND キーワードで定義されています。
DUEDATE のヌル標識は、%NULLIND 組み込み関数を使用してアドレス指定されます。
dcl-s dueDate date nullind; if not %nullind(dueDate) and dueDate > %date(); sendReminder (custId : dueDate); endif; - 次の例では、配列 empBonus はパラメーター empBonus_null を持つ NULLIND キーワードで定義されています。
empBonus_null も同じ次元を持つ配列として定義されています。
empBonus のヌル標識については、%NULLIND 組み込み関数または empBonus_null 配列を使用してアドレス指定することができます。
次の 2 つの FOR ループは同じ振る舞いをします。
- 最初の FOR ループでは、ヌル標識が直接使用されています。
- 2 番目の FOR ループでは、%NULLIND が使用されています。
dcl-c MAX_EMPLOYEES dcl-s empBonus packed(5:2) dim(MAX_EMPLOYEES) nullind(bonus_null); dcl-s empBonus_null ind dim(MAX_EMPLOYEES); dcl-s numEmployees int(10); for i = 1 to numEmployees; if not empBonus_null(i); // 1 applyBonus (emp(i) : empBonus(i)); endif; endfor; for i = 1 to numEmployees; if not %nullind(empBonus(i)); // 2 applyBonus (emp(i) : empBonus(i)); endif; endfor; - 次のトリガー・プログラムの例では、データ構造 beforeDs は EXTNAME(*INPUT) で定義されており、データ構造 beforeNull は EXTNAME(*INPUT : *NULL) で定義されています。
データ構造 beforeNull は、データ構造 beforeDsl のヌル標識データ構造として指定されています。
beforeNull データ構造のサブフィールドについては、それらのサブフィールドの名前によってアドレス指定することも、%NULLIND 組み込み関数を beforeDsl データ構造のサブフィールドと一緒に使用してアドレス指定することもできます。
次の 2 つの IF ステートメントは同じ振る舞いをします。
- 最初の IF ステートメントでは、ヌル標識が直接使用されています。
- 2 番目の IF ステートメントでは、ヌル標識のアドレスを指定するために %NULLIND が使用されています。
dcl-ds before extname('CUSTFILE':*input) based(pBefore) nullind(before_null) end-ds; dcl-ds beforeNull extname('CUSTFILE':*input) based(pBeforeNull) end-ds; pBefore = %addr(trgbuf) + trgbuf.beforeOffset; pBefore_null = %addr(trgbuf) + trgbuf.beforeNullMapOffset; if beforeNull.quantity; // 1 ... if %nullind(beforeDs.quantity); // 2 ... - 次の例では、修飾されたデータ構造 ds1 内の 2 つのサブフィールドが NULLIND キーワードによって定義されています。
- サブフィールド sub1_null および sub2_null が NULLIND キーワードのパラメーターとして指定されるとき、これらのサブフィールドはデータ構造名によって修飾されずに指定されます。
- データ構造 DS1 のサブフィールドが演算で使用されるとき、データ構造が修飾されるので、これらのサブフィールドはデータ構造名によって修飾されます。
dcl-ds ds1 qualified; sub1 char(10) nullind(sub1_null); 1 sub2 likerec(custRec:*input) nullind(sub2_nulls); 1 sub1_null ind; sub2_nulls likerec(custRec:*input:*null); end-ds; if ds1.sub1_null 2 or ds1.sub2_nulls.quantity; 2 ; ... - 次の例は、サブフィールドのヌル標識関係が LIKEDS キーワードを使用して定義されたデータ構造によってどのように継承されるかを示しています。ただし、ヌル可能性は LIKE キーワードを使用して定義されたフィールドには継承されません。
- データ構造 DS2 は、データ構造 DS1 がパラメーターとして指定された LIKEDS キーワードを使用して定義されます。 DS1 の定義については、上記の例を参照してください。
- フィールド FLD1 は NULLIND キーワードで定義されます。
- フィールド FLD2 は、フィールド FLD1 がパラメーターとして指定された LIKE キーワードで定義されます。 ヌル可能性は LIKE キーワードによって継承されないので、FLD2 はヌル可能ではありません。
- DS2 のサブフィールドのヌル標識関係は、DS1 のサブフィールドに対して定義された NULLIND キーワードから継承されます。 DS2.SUB1 はヌル可能であり、そのヌル標識は DS2.SUB1_NULL です。
dcl-ds ds2 likeds(ds1) inz; 1 dcl-s fld1 char(10) nullind(null1); 2 dcl-s fld2 like(fld1); 3 if %nullind(ds2.sub1); 4 ...
