[PowerBuilder] データウィンドウ関連でよく使うメソッドを解説

データウィンドウ絡みでよく使うメソッド解説がいくつか集まったので記事化することに。

ここを結構参考にしたような気がする。

 

 

AcceptTextメソッド

AcceptTextメソッドはDWに入力された値を確定する。

データウィンドウのカラムに入力した文字は、Enterキーを押したり、Tabを押して次の入力項目に移動した際に入力内容が検証され、問題なければ確定される。

しかし、文字を入力してまだカーソルが点滅している状態では入力内容は未確定で、そのまま別のDWをクリックするなどしてフォーカスが外れた場合は確定されない。

また「データウィンドウの入力条件に反します」エラーメッセージが出た際も、正しい内容が入力されるまでは確定されない。

そして、確定されていないままデータ更新(DBに反映)すると「入力したはずなのにDBに反映されない」問題が起きる。

データ更新を行う際は、先にそのDWでAcceptTextメソッドを呼んでカラムに入力された内容を確定する必要がある。

 

ちなみに

DWのLoseFocusイベントにAcceptTextメソッドを記述するのはダメ(無限ループになる)。

DWに入力→入力規則違反のエラーメッセージBoxが出る→DWがフォーカスを失う→LoseFocusイベント発火→AcceptTextメソッド実行→入力規則違反のエラーメッセージBoxが出る・・・(以下無限)。

あと、戻り値チェックも忘れずに。入力規則エラー時は戻り値-1を返し、成功時は1を返す。

 

Filterメソッド

Filterメソッドは指定した条件に合致するデータのみに絞り込むことができる。

SetFilterメソッドでフィルタ条件をセットし、Filterメソッド実行時に実際にフィルタ処理が行われる。

 ls_filter = "項目No = " + String(ll_koumoku_no)
dw_4.SetFilter(ls_filter)
dw_4.Filter()

フィルター条件を固定で(規定値)設定したい場合は、下記方法でデフォルトのフィルタ条件をセットすることができる。

  • データウィンドウペインタを開き、「行(Alt+R)」→「フィルタの指定」をクリックし、ダイアログにフィルタしたい条件を入力する。
    • SetFilterメソッドを使う場合と比べ、このダイアログで条件を入力すると入力内容を検証してくれるので、構文ミス等でエラーを出すことがなくなる。

デフォルトのフィルタ条件が設定されている場合、SetFilterを呼ばなくてもFilterメソッドを呼ぶだけでデフォルトのフィルタ条件でフィルタしてくれる。

 

Filterの色々な活用方法

LIKEを使えばあいまいフィルタが可能。

dw_4.SetFilter("comment LIKE '%" + o_a15progress%'")

SerFilterにNullを指定すると、既定のフィルタ設定ダイアログを出してやることができる。

 SetNull(ls_filter)
dw_4.SetFilter(ls_filter)
dw_4.Filter()

↓既定のフィルタ設定ダイアログを使えば、ユーザーに自由にフィルタ条件を設定してもらうことが可能。

filterwindow.gif

ユーザーにこのフィルタ条件式を書かせるのはちょっと酷だけど。

 

また、空文字でフィルタすれば設定済みのフィルタ条件を解除(全件表示)することができる。

 dw_4.SetFilter("")
dw_4.Filter()

 

現在のフィルター条件を取得

Describeメソッドを使用することで、DWのプロパティ値を取得することができる。

例えば下記で現在のフィルタ条件を取得できる。

dw_3.Describe("Datawindow.Table.Filter")

Describeメソッドについては過去記事でも紹介しているこちらも言及あり

 

Sortメソッド

Sortメソッドを使えば指定した条件でソートできる。

SetSortでソート条件をセットし、Sortで実際にソートを実行する。

 dw_3.Setsort("追加日時")
dw_3.Sort()

ソート条件を固定で(規定値)設定したい場合は、下記方法でデフォルトのソート条件をセットすることができる。

  • データウィンドウペインタを開き、「行(Alt+R)」→「ソートの指定」をクリックし、ソート条件を指定する。
    • SetSortメソッドを使う場合と比べ、ダイアログで条件を入力すると入力内容を検証してくれるので、構文ミス等でエラーを出すことがなくなる。

この場合は、Sortメソッドを呼ぶだけでデフォルトのソート条件でソートしてくれる。

Filterメソッドと同様に、空文字""をSetSortすることでソート条件をクリアしたり、NULLをSetSortして既定のソート設定ダイアログを出してやることができる。

 

Findメソッド

Findメソッドは、開始位置から終了位置まで条件検索して何レコード目に見つかったか、最初のレコードを返す。見つからなかった場合は0を返す。

ll_found = dw_status.Find("emp_lname = '山田' and emp_salary > 100000", 1, dw_status.RowCount())

 

Findメソッドを使用した重複チェック

  1. 最初→最後の方向にFind(一番初めにヒットした行数が返される)
  2. 最後→最初の方向にFind(一番初めにヒットした行数が返される)
  3. 1.も2.も同一の行数でヒットした場合、そのコードは単独であり、重複していないと判断可
    • ただし、1.2.両方とも見つからなかった場合はどちらも0を返すため、どちらも0を返した場合は「ヒットなし」
//重複チェック
ls_code = dw_2.GetItemString(ll_i,"コード")

ll_found = dw_2.Find("コード = '" + ls_code + "'",1, dw_2.RowCount())
ll_found2 = dw_2.Find("コード = '" + ls_code + "'",dw_2.RowCount() ,1 )

IF ll_found = ll_found2 AND ll_found <> 0 THEN
//重複なしの処理
ELSE
//重複ありの処理
END IF

コメントする