[Powerbuilder] Tips: Nullの扱いには気をつけよう

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が実行される。

コメントする