このセクションでは、以下におけるSQL Nullフィールドの動作について説明します。
ここでの説明では、以下のフィールド定義を使用します。
Define Field(#A) Type(*DEC) Length(9) Decimals(0) Input_Atr(ASQN) Default(*SQLNULL)
Define Field(#B) Type(*DEC) Length(9) Decimals(0) Input_Atr(ASQN) Default(*SQLNULL)
Define Field(#C) Type(*DEC) Length(9) Decimals(0) Default(*NULL)
次のトピックも参照してください。
ASQN (Allow SQL Nulls: SQL Nullを許可) 属性
SQL Nullフィールドが割り当てのためのANSI規則により確実に処理されるようにする場合は、*STRICT_NULL_ASSIGN関数オプションを使用可能にします。このオプションでは、ソース・フィールドがSQL Nullで、ターゲット・フィールドにASQN属性が設定されていない場合は、実行時に致命的なエラーが発生します。
SQL Nullを許可するフィールドでは、次の例のようにSQL Nullを明示的に設定することもできます。
#B := *SQLNULL
現在SQL Nullであるフィールドを別のフィールドに割り当てることができます。ターゲット・フィールドがSQL Nullを許可されると、SQL Nullに設定されます。次の例では、#BがSQL Nullなので#AはSQL Nullになります。
#A := #B
ターゲット・フィールドにASQN属性が設定されていない場合は、*STRICT_NULL_ASSIGN関数オプションが使用可能にされるかどうかによって動作が異なります。デフォルトでは、フィールド・タイプの*NULL値はターゲット・フィールドに割り当てられます。次の例では、#Cが数値フィールドなのでゼロに設定されます。フィールド・タイプごとの*NULL valueの定義については、「CHANGE Parameters」を参照してください。
#C := #B
ただし、*STRICT_NULL_ASSIGNが有効にされ、#BがSQL Nullである場合に上のサンプル・コードが実行されると、ターゲット・フィールドがSQL Nullの設定をサポートしないため致命的なエラーが発生します。LANSA開発者は、*STRICT_NULL_ASSIGNを使用する場合は、この種の実行時エラーを出さないように注意深くコーディングする必要があります。例えば、以下のようになります。
If (*Not #B.IsSqlNull)
#C := #B
Else
Message Msgtxt('#B is SQL Null')
Endif
また.AsValue組み込みメソッドを使用して、SQL Nullフィールドを別の値として扱うことができます。これはSQL Nullまたは*NULLが適切な値ではない場合の数値演算と連結に便利です。次の例では、#BがSQL Nullの場合に#Cに5という結果を取得できます。ただし#Bが3である場合は、#BがSQL Nullである場合にのみ#B. AsValueが#Bに影響を与えるため、#Cは15に設定されます。
#C := #B.AsValue( 1 ) * 5
次のトピックも参照してください。
IF COND((#DATE2.IsSqlNull) *orif (#DATE1 *gt #DATE2))
#DATE2 := #DATE1
ENDIF
(#A.IsSqlNull) *orif (#A.IsNull)
#A.AsValue(1) *EQ 1
以下の表に、サンプル・フィールド#Aおよび#BがどちらもSQL Nullで#Cが*ZEROの場合のさまざまな条件の結果をまとめます。
|
式の評価中は、中間結果はSQL Null状態を保持します。その結果は常に厳密に解釈されます。例えば、#B が SQL Null の場合は、式 '#B + 1' の結果は SQL Null です。SQL Nullに1を足しても、SQL Nullのままだからです。これは結果フィールドの属性とは無関係です。
動作の違いが発生するとすれば、それは式の結果が結果フィールドに割り当てられる場合に限られます。式の結果がSQL Nullの場合は、動作は結果フィールドがSQL Nullを許可するかどうかと、関数オプション*STRICT_NULL_ASSIGNが有効かどうかによって決まります。詳細については、「割り当て 」 を参照してください。
SQL Nullフィールドの値をより適切な別の値に変更する場合は組み込みメソッド.AsValue を使用します。 例えば、#BがSQL Nullである場合は、式'#B. AsValue(1) + 1'の結果は2(および#Bが4である場合は5)です。