複数条件の抽出フォームの設計 その3
今回は、前回のものに、詳細フォーム(単票)を開くことができるボタンを追加してみました。抽出フォームと詳細フォームは、片方をレコード移動するともう一方も同時に同じレコードに移動するようにしました。
難易度:
デザインおよびコード
同じテーブルから単票フォームを作成します。名前は、F_社員詳細 とします。
前回の抽出フォームにトグルボタンを追加します。
プロパティ | 設定値 |
名前 | tglOpenDetail |
規定値 | Flase |
標題 | 詳細表示 |
トグルボタンの更新後処理
抽出フォームのRecordset を詳細フォームの Recordset に設定するだけです。これで両者の Recordset が共通のものとなり、両者は同期するようになります。
参考: フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは?
ただし、フィルタをかけると Recordset は再生成されるようで、同期しなくなります。ですので、フィルタをかけた後、もう一度設定し直す必要があります。
抽出コマンドボタンのコードの最後に Setコードを追加すればいいのですが、それですと、ユーザーがメニューや右クリックでフィルタをかけたとき、同期しなくなるのを防ぐことはできません。フィルタをかけたときに発生するイベントに設定すればいいと考えて、「フィルタ実行時」イベントに設定してみましたが、これはフィルタが実行される前に発生するようで、使えませんでした。
「フィルタ実行後」というイベントがあればいいのですが、我がAC2003にはありません。このようなときの裏技として、「タイマ時」イベントを利用すると言うのがあります。「タイマ時」イベントに Setコード を記述して(タイマ間隔は0にしておいて実行されないようにしておきます。)、「フィルタ実行時」でタイマ間隔を0以外に設定して(当方の環境では、10(ミリ秒)ぐらいでいいようです。)タイマ時に設定した処理がちょっと遅れて実行されるようにします。タイマ時のコードの先頭で「タイマ間隔」を0に戻すのを忘れないように。さもないとコードが繰り返し実行されてしまいます。
メニューや右クリックでフィルタをかけたときもちゃんと同期するようになりました。ただし、抽出ボタンや抽出解除ボタンのクリックでは同期しません。Filterプロパティではフィルタ実行時イベントは発生してないようです。そこで、Fiterプロパティではなく、DoCmd系の命令でフィルタをかけたり、解除したりするように変更しました。これだとフィルタ実行時イベントは発生します。
フォームモジュール
あと、抽出条件に正しくない値が入力されてエラーが出たときのエラー処理、抽出フォームを閉じるときに、詳細フォームも道連れに閉じるコード、等を追加したのが下記のフォームモジュールになります。
サンプルファイルが下記からダウンロードできます。
FrmFilter_3_07.zip (Access 2007-2010 形式 - 35kb)
FrmFilter_3.zip (Access 2002-2003 形式 - 30kb)
FrmFilter_3_2k.zip (Access 2000 形式 - 27kb)