変更の始まり

NULLIND{(ヌル標識)}

NULLIND キーワードを使用すれば、フィールドまたはデータ構造に対して %NULLIND 値を明示的に定義することができます。

ある項目に対して NULLIND キーワードが指定されると、このキーワードのパラメーターは、その定義しようとしている項目に対してヌル標識、ヌル標識配列、またはヌル標識データ構造として使用されます。

定義しようとしている項目がデータ構造でなければ、NULLIND キーワードのパラメーターを省略することができます。 その場合は、変数や配列はヌル可能ですが、%NULLIND 組み込み関数を使用してヌル標識のアドレスを指定する必要があります。

NULLIND キーワードへのパラメーターとして指定された標識については、その名前、または関連項目の %NULLIND 組み込み関数のいずれかによってアドレス指定することができます。 例えば、フィールド myFieldNULLIND(myNullind) で定義された場合、%NULLIND(myField)myNullind はどちらも標識 myNullind を表します。 配列データ構造 myDsNULLIND(myDsNulls) で定義された場合、myDsNulls(i).addr%NULLIND(myDs(i).addr) はどちらも標識 myDsNulls(i).addr を表します。

  • 次の例では、フィールド 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 ループは同じ振る舞いをします。
    1. 最初の FOR ループでは、ヌル標識が直接使用されています。
    2. 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 ステートメントは同じ振る舞いをします。
    1. 最初の IF ステートメントでは、ヌル標識が直接使用されています。
    2. 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 キーワードによって定義されています。
    1. サブフィールド sub1_null および sub2_null が NULLIND キーワードのパラメーターとして指定されるとき、これらのサブフィールドはデータ構造名によって修飾されずに指定されます。
    2. データ構造 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 キーワードを使用して定義されたフィールドには継承されません。
    1. データ構造 DS2 は、データ構造 DS1 がパラメーターとして指定された LIKEDS キーワードを使用して定義されます。 DS1 の定義については、上記の例を参照してください。
    2. フィールド FLD1 は NULLIND キーワードで定義されます。
    3. フィールド FLD2 は、フィールド FLD1 がパラメーターとして指定された LIKE キーワードで定義されます。 ヌル可能性は LIKE キーワードによって継承されないので、FLD2 はヌル可能ではありません。
    4. 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 
          ...
変更の終わり