データウィンドウが表示されるまで(後編)

テクニカルブログ

こんにちは、サポート部の Yama-chan です。いつも「初心者の憂鬱」シリーズを読んでいただき、ありがとうございます。


はじめに

データウィンドウが表示されるまで(前編)ではアプリケーションの Open イベントでデータベースとの接続処理と INI ファイルから接続情報を読み込む方法について解説しました。さらにウィンドウの Open イベントでデータウィンドウコントロールにトランザクションオブジェクトを設定して、Retrieve によるデータの検索まで紹介しましたが、後編では Retrieve 検索を行ったときに発生するイベントについて解説いたします。


それでは、はじめましょう

データウィンドウコントロールの Retrieve 検索が実行された場合は、以下の4つのイベントが発生します。

  • RetrieveStart
  • RetrieveRow
  • RetrieveEnd
  • DBError

さらに詳しく各イベントについて、見ていきましょう。個々のイベントを確認しながら、実際の使用方法の例もご紹介します。開発の現場で利用するケースが出てくるかもしれないので参考にしていただければ幸いです。


RetrieveStart イベント

まず、RetrieveStart イベントについてご紹介します。このイベントはデータウィンドウに対して検索が開始されようとしている時に発生します。引数は特にありませんが、このあと紹介する RetrieveRow イベントと同様に戻り値により、以降の処理を制御することができます。戻り値として「0」を返した場合は処理を続行しますが、「1」を返した場合は処理を中止することができます。さらに戻り値として「2」を返した場合は検索を実行する前に、データウィンドウの行とバッファのリセットを行いません。再度検索した場合、いままでのデータに新しく検索された結果が追加されます。

よくある利用例としては検索を実行する前に、確認メッセージを表示して利用者に本当に実行してよいのか、再確認を行うことができます。

例 :
integer li_net
li_net = MessageBox("確認", "検索を実行しますか?", &
    Exclamation!, OKCancel!, 2)
IF li_net = 1 THEN
    Return 1
ELSE
    Return 0
END IF
RetrieveStart イベント

RetrieveRow イベント

このイベントはデータが 1 行検索されるたびに発生します。引数として検索されたばかりの行番号が渡されます。検索で取得されるすべての行数ではないことに留意してください。

このイベントの特徴としてはイベント内からの戻り値により、以降の処理を制御できることです。戻り値として「0」を返した場合は処理を続行しますが、「1」を返した場合は処理を中止することができます。

検索の条件によりデータの件数が多く処理に時間がかかる場合があります。利用者は時間がかかって、処理が終了したかどうか判断できず、利用者によってはアプリケーションがフリーズしたと誤解を招く可能性があります。このような状態を未然に防ぎたい場合はこのイベントを使用して制御することができます。

たとえば、検索されたデータの件数が上限に到達した時点で処理を中止したい場合は RetrieveRow イベント内で以下のように記述します。

例 :
// 行数の上限は2行とします。
IF row >= 2 THEN
    MessageBox("検索を中断します", &
    "取り込んだ行数が上限の 2 に達しました")        
    RETURN 1
ELSE
    RETURN 0
END IF
RetrieveRow イベント

上記のような処理を追加することで、時間のかかる処理を待つ必要がなくなります。アプリケーション利用時の無駄な待機がなくなり、利用者を困惑させることもありません。まさに一石二鳥ではないでしょうか?


RetrieveEnd イベント

このイベントはデータウィンドウに対する検索が完了した場合に発生します。引数として検索された行数が返されます。検索が終了されたことを利用者に知らせるために、メッセージを表示したり、行数をウィンドウのどこかに表示したりする場合はこのイベントで書くことができます。

例 :

    // メッセージを表示し、画面上のテキストラベルにも検索された件数を表示します。
    MessageBox("検索結果", string(rowcount) + " 件のデータが検索されました")
    st_2.text = string(rowcount)
RetrieveEnd イベント

DBError イベント

最後に、DBError についてご紹介します。このイベントはデータベースとの接続、またはトランザクションの処理中にエラーが発生した場合に発生します。

イベントでは引数として以下のものが渡されます。

  • code :DBMS より渡された固有の long 型のコード値。
  • sqlerrortext :DBMS より渡された固有のエラーメッセージ。
  • sqlsyntax :エラーが発生した時に DBMS に送信された SQL ステートメント。

皆さんもすでにお気づきかもしれませんが、コードおよびエラーメッセージは DBMS から返された内容となっています。もちろん、接続している DBMS の種類によって、返されたコードとエラーメッセージが違う可能性があります。詳しいエラー内容を確認したい場合はコードを元に利用している DBMS のマニュアルを参照する必要があります。

開発中にこの DBError イベントで詳しいエラーおよび送信している SQL ステートメントを確認し、解決する手立てとして利用するケースもありますが、実際にアプリケーションをリリースしたときに DBMS から、返されているエラーメッセージをそのまま表示しても、利用者が困惑してしまい、どうしたらいいのかわかりません。このような場合は、利用者が分かりやすいメッセージに変えて表示するようにすると良いでしょう。

たとえば、以下のようにエラーコードを確認して、メッセージを出力するようにします。

例 :
Messagebox("トランザクション エラー","エラー メッセージ: "&
   + sqlerrtext + "~r~n 画面のコピーを取り、システム管理者にご連絡ください。")
DBError イベント

まとめ

皆さん、いかがでしたか?

前編につづき、今回は検索が実行されたときに発生するイベントについてご紹介しました。作成したサンプルコードはとてもシンプルですが、実際の開発現場ではもっと複雑なコードになります。でも、基本的なことさえ理解できていれば怖くありません。

最後に一つだけ、大事なことを守っていただきたい。イベントまたは関数の戻り値を必ずチェックすることです。戻り値を放置しないことで、潜在バグを減らすことができます。

それではプロのビルダーを目指して、頑張りましょう。

ハッピーコーディング!
テクニカルブログ 一覧を見る
PowerBuilder マイグレーション