PowerbuilderとNullの扱い
PowerScriptやDatawindow式では、式や関数の引数にNull値が含まれると、結果は全てNullになる。
これは結構陥りやすい罠なので要注意。
Most functions that have a null value for any argument return null. Any expression that has a variable with a null value results in null.
引数にNULL値を持つ関数のほとんどはNULLを返します。NULL値を持つ変数を持つ式はすべてNULLになります。
A boolean expression that is null is considered undefined and therefore false.
nullである論理式は未定義とみなされ、したがって偽となります。
SyBooks Online (Archive)
つまり「どこか一つでもNullが入ると全部Nullが返ってくる」と考えた方がいい。Nullチェック重要。
サンプルコード
String ls_text1 String ls_text2 String ls_text3 String ls_text_all
ls_text1 = "This text "
SetNull(ls_text2)
ls_text3 = "will be Null."
ls_text_all = ls_text1 + ls_text2 + ls_text3
↑ls_text2はNullであり、これを+で繋いだls_text_allもNullになる。
Nullが入る可能性がある場合は、IsNull関数でNullチェックを行って適切に処理する必要がある。
上記例でいえば、文字列結合時にNullチェック→Nullが混入した場合はブランクに置き換えるなど。
Nullチェックのやり方
Nullチェックをする際は必ずIsNull関数を使うこと。
IF IsNull(a) THEN
↑これが正しい。
=でNULLと比較してはいけない。
IF a = NULL THEN
↑これは間違い。
null論理式は偽となる
上で引用した「nullである論理式は未定義とみなされ、したがって偽となります」のとおり。
下記3つのIFはNbrがNULLなので全てFALSEとなり、Beepは鳴らない。
int Nbr
// Set Nbr to NULL.
SetNull(Nbr)
IF Nbr = 1 THEN Beep(1)
IF Nbr <> 1 THEN Beep(1)
IF NOT (Nbr = 1) THEN Beep(1)
Nullを使った理論式
「null論理式は偽となる」を活用し、以下のような判定が可能。
IF GetFocus( ) THEN
. . . // Some processing
ELSE
MessageBox("Important", "Specify an option!")
END IF
画面のどのコントロールもフォーカスを持っていない場合、GetFocus()はNULLを返す。
そしてNULLの理論式は偽となるため、上記条件分岐ではELSEが実行される。
コメントする