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

7.4.2 顧客の新規登録
●新規登録の処理
 さて,List 7-9の処理を実装したことによって,ユーザーが[新規]ボタンを押したときにFormEditCustomerフォームが表示されることになった。Fig.7-23にも示したように,FormEditCustomerフォームには,[OK]と[キャンセル]という2つのボタンを用意してある。ユーザーが[OK]ボタンを押したときには,入力された内容のとおりに顧客を登録し,[キャンセル]が押されたときには,何もせずにウィンドウを閉じる。

 まずは,[キャンセル]ボタンが押されたときの処理から記述してみる。[キャンセル]ボタンには,BTN_CANCELという名前を付けたので(Fig.7-23を参照),[キャンセル]ボタンが押されたときの処理はBTN_CANCEL_Clickプロシージャに記述すればよい。このプロシージャの処理内容は単純に自分自身を閉じるだけであり,具体的には“Me.Hide”とだけ記述すればよい(List 7-10)。

 次に,FormEditCustomerフォームの[OK]ボタンが押されたときの処理を考える。ここでは,ユーザーがテキストボックスに入力したテキストを元に顧客情報テーブルにレコードを追加するという処理をする。顧客情報テーブルにレコードを追加するには,Business.CustomerコンポーネントのAddCustomerメソッドを呼び出せばよい。[OK]ボタンにはBTN_OKという名前を付けたので(Fig.7-23を参照),[OK]ボタンが押されたときの処理はBTN_OK_Clickプロシージャに記述することになる。実際にそのような処理を実装したものがList 7-11である。

 List 7-11では,まず8行目でBusiness.Customerコンポーネントを実体化する。そして,11行目でAddCustomerメソッドを呼び出して顧客を登録するという処理をしている。このとき,追加された顧客の顧客番号はAddCustomerメソッドの戻り値として戻るわけだが,この値はグローバル変数CustomerID(1行目で宣言)に格納することにした。グローバル変数にしたのは,最後に追加された顧客の顧客番号をあとから使えると便利だからである。実際,「7.4.3 顧客の一覧参照」では,一覧表示するときに,新規に追加した顧客をカレント行に合わせるために利用する。ちなみに,CustomerID変数はPrivate宣言ではなくPublic宣言としたため(1行目),FormEditCustomerフォーム以外のフォームからも参照できるようになっている。

 14〜16行目の処理は,顧客の締め日を設定するものである。しかし,顧客の締め日はAccountingロール,AccountingAdminロール,AllAdminロールに属するユーザーしか変更できない。そこで14行目のIf文で顧客の締め日を入力するテキストボックスであるTXT_BILLDAYテキストボックスのEnabledプロパティを参照し,それがTrueのときのみ締め日を設定するようにした。

 すでにList 7-7FormEditCustomerフォームのForm_Loadイベントの処理においてはロールを判定し,Accountingロール,AccountingAdminロール,AllAdminロールのいずれかに属するときにはTXT_BILLDAYテキストボックスのEnabledプロパティをTrueにし,そうでなければFalseにするという処理をしている。結果として,14行目のIf文が真となり,15行目のUpDateCustomer_BILLDAYメソッドの呼び出しで締め日を変更できるのは,Accountingロール,AccountingAdminロール,AllAdminロールのいずれかに属するユーザーであるということになる。

 以上の処理が終わったならば,18行目でBusiness.Customerコンポーネントを解放し,21行目でフォームを閉じるという処理をする。

 なお,List 7-11の6行目では,On Error Gotoステートメントを使って実行時エラーを発生させたときに,25行目以降の処理に飛ぶようにした。

 実行時エラーが発生するのは,(1)ネットワークの通信エラーなどによってBusiness.Customerコンポーネントが使えなかった場合,(2)Business.CustomerコンポーネントのAddNewメソッドやUpdateCustomer_BILLDAYメソッドの処理に問題があった場合,である。たとえば,Business.CustomerコンポーネントのAddNewメソッドは,引数に渡された値を調べ,指定された文字列が長すぎないかをチェックし,適合しないときには実行時エラーが発生するという実装になっている。そして,UpdateCustomer_BILLDAYメソッドでは,引数に指定された締め日が1〜31の数値であることを確認し,そうでないときには実行時エラーを発生させる。よって,これらの原因によっても,実行時エラーが発生することになる。これらのエラーが発生したときには,26行目のMsgBox関数の処理によってErrオブジェクトのDescriptionプロパティの内容がユーザーに表示されることになる。Business.Customerコンポーネントが明示的にエラーを発生させる際には,Descriptionプロパティにエラーメッセージを格納しているから,これによりユーザーが参照するメッセージは,「顧客名が長すぎます」とか「よみがなが長すぎます」といった具体的なメッセージとなる。


One Point! ただし,COM+の不具合からか,AllAdminロールに属するユーザー以外からAddNewメソッドやUpdateCustomer_BILLDAYメソッドを呼び出したときには,実行時エラーのメッセージがオートメーションエラーのメッセージに置き換わってしまうという問題がある。これについては現在調査中である。

One Point!UpdateCustomer_BILLDAYメソッドは,引数として1〜31までの数値をとるわけだが,引数の型はLong型ではなくVariant型として宣言した(List 6-26を参照)。そのため,15行目にあるように,“ objCustomer.UpdateCustomer_BILLDAY CustomerID, TXT_BILLDAY.Text”のように,TXT_BILLDAYテキストボックスのTextプロパティの値を直接渡してしまうことができる。もし,UpdateCustomer_BILLDAYメソッドの引数の型がLong型であった場合には,TXT_BILLDAYテキストボックスのTextプロパティの値を直接渡すことはできない。なぜなら,ユーザーがTXT_BILLDAYテキストボックスに数値以外の値を入力したら,型変換エラーが発生するためである。よって,事前に正しくLong型に変換できるかどうかをチェックする(たとえば,IsNumeric関数を使う)必要がある。しかし,今回はUpdateCustomer_BILLDAYメソッドの引数の型をVariant型とし,UpdateCustomer_BILLDAYメソッドの内部で文字列を数値に変換するという処理をしているために,そのチェックが不要となっているのである。このように,ユーザーからの入力を直接受け取るビジネスロジックのメソッドの引数は,Variant型としてどのような型でも受け取れるようにしておき,ビジネスロジック内で型変換処理をしてエラーチェックするようにしたほうが,プレゼンテーション層の実装が簡単になる。
Prev 14/134 Next