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チェック重要。
データウィンドウ絡みでよく使うメソッド解説がいくつか集まったので記事化することに。
ここを結構参考にしたような気がする。
Powerbuilderのデータウィンドウ関連イベントの中でも便利なものをいくつか紹介する。
DWがテーブルへINSERT/UPDATE/DELETEした件数の取得
各DWの「UpdateEnd」イベントにて以下の情報を受け取ることができる。
追加行数はrowsinserted、更新行数はrowsupdated、削除行数はrowsdeletedから取得できる。
// 処理 : UpdateEnd event
messagebox("ROW COUNT: INSERTED, UPDATED, DELETED", String(rowsinserted) + " " + String(rowsupdated) + " " + String(rowsdeleted))
データベースへ追加・更新・削除処理を行った後、処理結果件数を確認したい時に便利。
C系列ならSwitch、VBならSelect Case文に相当するもの。PowerBuilderではCHOOSE CASE文を使う。
HELPには下記のような例文があるが、
CHOOSE CASE Weight
CASE IS<16
Postage=Weight*0.30
Method="USPS"
CASE 16 to 48
Postage=4.50
Method="UPS"
END CHOOSE
ここに
CASE IS NULL
とか
CASE NULL
と書いてもコンパイルエラーになる。どうやらこの書き方ではNull判定できない様子。
PowerBuilderの引用符について
の記事でも少し触れたが、Modifyメソッドに渡すパラメータ文字列を作成する際、チルダを用いた引用符の扱いが非常に面倒くさい。
ls_modify = "r_" + String(ll_i) + ".visible='1~tIF(結果" + String(ll_i) +" = ~~'~~', 1, 0)'"
dw_4.Modify(ls_modify)
↑こういうやたら~が多いやつ
理解するにはなかなか難しいのだが、一つ例を出してこの引用符について説明したい。
データウィンドウの様式と、タブラ様式のデータウィンドウでよく使うプロパティ設定について。
データウィンドウ(DW)の様式について
DWにはいくつかの様式があり、DWが持つデータをどのように表現したいかによって好きな様式を選ぶことができる。
例えばグラフとか、一覧表示(タブラ)とか、フリーフォームとか...同じデータを持つDWでも、様式が変わると見え方が全く異なってくる。
個人的に一番よく使ったのが一覧表示に適しているタブラ様式。(他の様式については追って解説する予定)
PowerBuilderでデータウィンドウのプロパティ値を取得/更新する場合、
- 専用のメソッド(DescribeとModify)を用いて取得/更新する方法
- プロパティ式を使ってDWのプロパティ値を直接参照/更新する方法
の2つがある。
DescribeとModifyを使う方法は前回の記事で説明したため、今回はそれと対比しながら直接DWオブジェクトに設定する方法を紹介する。
DescribeとModifyを使う方法
前回説明したが、DWのプロパティを取得するDescribeメソッドと、プロパティを更新するModifyメソッドがある。
例)
//dw_1が持つempnameというオブジェクトのBorderプロパティ値を取得
dw_1.Describe("empname.Border")
//dw_1が持つempnameというオブジェクトのBorderプロパティ値に1をセット
dw_1.Modify("empname.Border=1")
詳細については前回の説明を見てほしい。
長らく死蔵していたPowerBuilderネタの下書きを発見したのでUPしておく。今更役に立つかは分からないけど。
DescribeとModify
DescribeとModifyは、データウィンドウが持つ各種プロパティを取得・変更するメソッドである。
例えば、下記でdw_2というDWのSQL SELECT文を取得できる。
ls_sql_text = dw_2.Describe("Datawindow.Table.Select")
また、下記でdw_2に新たなSQL文をセットすることができる。
dw_2.Modify("DataWindow.Table.Select=~"" + ls_sql_text + "~"" )
タイマー処理を使用すると、指定した秒数ごとに処理を繰り返し実行することができる。
例としては、1分ごとに自動でデータを再取得して画面のグラフを再表示したり、タイムアウト処理に使ったり。
タイマーには2種類ある
このタイマー処理には2種類あり、ひとつはウィンドウが持つtimerイベント、もう一つがtimingユーザーオブジェクト。
前者はウィンドウが持つイベントのため実装が楽だが1ウィンドウにつき1つのみという制約がある。
後者は制約はないが、別途ユーザーオブジェクトを作成しないといけないのがやや手間だ。