[PowerBuilder] データウィンドウのバッファ(領域)

前回の記事に引き続き、パワービルダー(PowerBuilder)の特徴であるデータウィンドウ(DataWindow)について解説する。

今回はデータウィンドウのバッファについて。

 

 

データウィンドウのバッファ


データウィンドウは下記3つのバッファ(領域)を持つ。順に紹介する。

1.主バッファ(Primary!)

Retrieveで取得したデータやInsertRowで追加したデータ。削除やフィルタが適用されていないデータ。主バッファのデータが画面に表示される

主バッファのデータ数(行数)を取得するには、RowCountメソッドを使用する。

 

2.削除バッファ(Delete!)

DeleteRowで削除されたデータが格納される領域。いわゆる「削除フラグ」が立ったデータ。画面からは非表示になる。

削除バッファのデータ数(行数)を取得するには、DeletedCountメソッドを使用する。

※要注意:削除バッファを使用するには条件がある。後述。

 

3.フィルタバッファ(Filter!)

Filterメソッドでフィルタを適用した結果非表示にされたデータ。画面からは非表示になるが、フィルタ条件が変わったり、フィルタがオフになることでまた表示されることがある。

フィルタバッファのデータ数(行数)を取得するには、FilteredCountメソッドを使用する。


※フィルタが適用された状態でRowCountメソッドを使用すると、フィルタされた後の主バッファの件数しか取れないので注意。
元々取得していたデータの全件数を取得したい場合、RowCountの結果とFilteredCountの結果を合計する必要がある。
(フィルタを適用しない前提の場合はもちろんRowCountだけでよい)

 

具体例


・DWのRetrieve直後、5件のレコードがあったとすると、その5件は主バッファに入っている。
・このDWに対し、Filterメソッドでフィルタした場合、除外されたレコードはフィルタバッファに入る。
・FilteredCountメソッドを用いることでフィルタバッファのデータ件数を取得できる。
・フィルタを解除したら、フィルタバッファから主バッファに戻る。

・DeleteRowメソッドで削除したレコードは、削除バッファに入る。
・DeletedCountメソッドを用いることで削除バッファのデータ件数を取得できる。
・Updateメソッドで実テーブルに更新をかける際、PowerBuilderはこの削除バッファに入ったデータをもとにSQL DELETE文を発行する。
・削除後、レコードは削除バッファから削除される。


※更新特性を「更新可能」にしているDWに限る。

 

データウィンドウの更新属性


データウィンドウには「更新特性」というものがある。これは「DWがデータ取得元のテーブルを更新できるかどうか」のプロパティである。
この更新特性を「更新可能」にしているDWのみ、データベースを更新できる。
(データウィンドウの更新特性は「行(R)」→「更新特性の指定」→「更新可能(A)」にチェックが入っているかどうかで確認できる)

つまり、"データベースから取得したデータを画面上のDWに表示し、それをユーザーが編集後、「更新」ボタンを押すとDWにUpdateメソッドが発行され元のデータベースが更新される"ような画面を作りたいのであれば、そのDWは更新特性が「更新可能」である必要がある。

そして、この更新特性が「更新可能」になっているDWのみ、削除バッファを使用することができる。
もし更新可能でないDWに対してDeleteRowメソッドを実行した場合、レコードは即時削除され、DeletedCountメソッドは常に0を返す

データウィンドウにUpdateメソッドを発行してもテーブルが更新されない場合や、DeletedCountメソッドが常に0を返す場合、ここが原因であることが多い。

 

Updateメソッドは、画面入力や行削除等でDWのデータに変更が加えられた内容を、データ取得元のテーブルに反映(更新)するメソッド。RetrieveメソッドがSQLでいうSELECTに当たるならば、UpdateメソッドはSQLでいうINSERT/UPDATE/DELETEに相当する。

 

さいごに


一度に多くの行を表示・編集するような一覧編集画面ではフィルタや行追加・行削除機能が必要になることが多く、必然的にこれらのバッファ領域を扱うことが多くなるだろう。
各バッファのカウントを取ってフィルタ・削除データの有無を確認するなど、利用シーンは少なくないため、ぜひ活用してほしい。

また、RowsMoveメソッドを使用することで、異なるバッファ間でデータを移動することもできる。あまり使用した記憶はないが、覚えていて損は無いだろう。


なお、データ更新前のバリデーションを行う際には、「データが変更されたかどうか」のステータスを確認する必要も出てくるだろう。
この場合はModifiedCountメソッドを使用することで変更済みレコードのカウントを取ることができるのだが、これについては次回説明したい。

コメントする