この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.3 顧客の一覧参照
●データグリッドとADODB.Recordsetオブジェクトとを結び付ける

○[新規]ボタンの処理
 ところで,このままだと[新規]ボタンを押して新しい顧客を登録したとしても,その追加された顧客はデータグリッドには表示されない。データグリッドに表示するためには明示的に[最新の状態に更新]ボタンを押さなければならない。これでは使いづらいし,しかもユーザーが登録に失敗したのと勘違いして何度も登録をくり返すことにもなりかねない。やはり,顧客を登録したあとでデータグリッドにも反映させるようにすべきである。

 顧客の登録は,List 7-9に示したBTN_NEW_Clickプロシージャで処理するようにした。この処理の最後にRefreshDataプロシージャの呼び出しを追加すれば,顧客を登録したあとでデータグリッドが更新され,追加した顧客も表示されるようになる。

 しかし,「○[最新の状態に更新]ボタンの処理」でも説明したように,RefreshDataプロシージャを呼び出しただけでは,マーキー行が先頭行を指してしまう。自然なユーザーインタフェースを考えると,マーキーは追加した顧客を指すようにするのが妥当だろう。そうしないと,扱う顧客が多数存在する場合に,どれが新しく追加した顧客だかわからなくなってしまうからである。また,追加した顧客が,データグリッドの1画面で表示できる範囲外にある場合には,スクロールさせないとその顧客が見えないから,ユーザーが気づかないおそれもある。

 では,RefreshDataプロシージャを呼び出したのちに,カレント行を追加した顧客に合わせるには,どのようにすればよいのだろうか。これは簡単で,先に説明したFindメソッドを使えばよい。

 新規に登録した顧客の顧客番号は,FormEditCustomerフォームのグローバル変数CustomerIDに格納されている(List 7-11を参照)。また,データグリッドの結び付けられるADODB.RecordsetオブジェクトはFormCustomerフォームのグローバル変数g_objRecに格納されている(List 7-12を参照)。よって,次のようにしてFindメソッドを呼び出せば,最後に追加された顧客を検索し,それをカレント行にすることができる。


' 先頭に移動する
g_objRec.MoveFirst
' 検索する
g_objRec.Find "ID=" & FormEditCustomer.CustomerID, _
              0, adSearchForward

 この処理をList 7-9で示したBTN_NEW_Clickプロシージャに追加することになるのだが,ユーザーがFig.7-23で示したFormEditCustomerフォームの[キャンセル]ボタンを押して顧客の新規登録を取り止めたときには,グローバル変数CustomerIDの値が不定になってしまう。そのため,上記の処理は正しく動作しない。

 そこでまず,List 7-8に示したFormEditCustomerフォームのNewCustomerプロシージャをList 7-16のように変更する。

 変更した部分は17行目であり,グローバル変数CustomerIDの値を-1に設定するようにしただけである。この処理によって,もしユーザーが顧客の新規登録を取り止めるために[キャンセル]ボタンを押すと,グローバル変数CustomerIDの値は-1のままになる。もちろん,[OK]ボタンを押して顧客を登録したときには,FromEditCustomerフォームのBTN_OK_Clickプロシージャ(List 7-11)の11行目にあるように,登録された顧客の顧客番号が設定される。つまり,グローバル変数CustomerIDの値が-1であるかどうかを判断することによって,顧客が新規に登録されたのか,取り止められたのかを判断できるようになる。

 以上の内容を踏まえ,[新規]ボタンが押されたときに呼び出されるBTN_NEW_Clickプロシージャ(List 7-9)の処理を変更したものが,List 7-17である。

 List 7-17に追加したのは,7〜14行目の処理である。8行目でFormEditCustomerフォームのCustomerIDフィールドの値が-1ではないことを確認し,-1でなかったならば,9行目でデータグリッドの表示を更新し,その後11行目と12行目で追加した顧客をカレント行にする処理をしている。

 ところで,12行目では,IDフィールドの値が追加された顧客の顧客番号であるレコードをFindメソッドを使って検索しているわけだが,該当するレコードが見つからないというケースはあり得る。極めて希であるが,顧客を登録した直後にほかの誰かによってその顧客が削除された場合である。すでに説明したように,Findメソッドは該当するレコードが見つからないと,カレント行を末尾の次の行に移動することになる。しかし,別にエラーなどが発生するわけではないので,特に問題とはならない。

Prev 19/134 Next