サブフォームをダイナミックに入れ替えるお手本データベース

図1-3-1 トグルボタンをクリックしてサブフォームをダイナミックに入れ替えします
このサンプルデータベースは、トグルボタンをクリックして時給、日給、月給のサブフォームをダイナミックに入れ替えします。通常、メインフォームに複数のサブフォームを配置する場合、タブコントロールを作成してタブコントロールの各ページにサブフォームを配置します。ところが、タブコントロールにサブフォームを配置した場合、メインフォームを開くとき不要なサブフォームも含めて、全てのサブフォームをロードするため時間がかかります。メインフォームを高速表示させるには、サンプルデータベースのようにサブフォームが必要になったとき、そのサブフォームのみロードするように設計します。

図1-3-2 タブコントロールの各ページに時給、日給、月給のサブフォームを配置した例
サンプルデータベース (CH1-3.mdb)では、以下のノウハウを習得することができます。
◆ サブフォームを必要なときにダイナミックにロードしてフォームの表示時間を短縮する方法
◆ レコードの移動ボタンをクリックしたとき、レコードに対応したサブフォームをダイナミックにロードする方法
● サブフォームをダイナミックに入れ替えるフォームを作成するには
1 Access を起動して作業フォルダに、新規データベース CH1-3.mdbを作成します。
2 ファイルメニューから外部データの取り込み、インポートをクリックします。インポートのダイアログが表示されたら、CH3-4.mdbを選択してインポートボタンをクリックします。オブジェクトのインポートダイアログが開かれたら、テーブルタブをクリックしてすべて選択のボタンをクリックします。同様の手順で、クエリ、フォーム、モジュールタブをクリックしたらすべて選択のボタンをクリックして、最後にOKボタンをクリックします。

図1-3-3 CH3-4.mdbからテーブル、クエリ、フォーム、モジュールの全てのオブジェクトをインポートする
3 データベースウィンドウからテーブル
をクリックしたら、tblWorkOrderをデザインモードで開いて、数値型のWagesBasedOnのフィールドを追加します。このフィールドには、給与形態フラグ(1:時給、2:日給、3:月給)を格納します。フィールドの説明欄に、給与形態フラグの意味を入力したらテーブルを保存して閉じます。

図1-3-4 tblWorkOrderに新規フィールド WagesBasedOnを追加
4 データベースウィンドウからフォーム
をクリックしたら、frmWorkOrderをデザインモードで開きます。サブフォームsfrWorkOrderDetailsのプロパティを表示させたら、ソースオブジェクトを空にします。これで、サブフォームはメインフォームを開いてもロードされません。ツールボックスからオプショングループのアイコン
をクリックして、フォーム右上に3個のトグルボタン(時給、日給、月給)を作成します。尚、オプショングループを作成するときは、ツールボックスのコントロールウィザードが有効になっているか確認してください。
表1-3-1 オプショングループのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
||||||||
|
オプショングループ |
名前 |
fraWageType
|
5 メニューからコードのアイコン
をクリックして、フォームモジュールを開きます。CH1-3.mdbを開いたら、frmWorkOrderのフォームモジュールを開いてリスト1-1-1に示す部分をコピーして貼り付けます。フォームモジュールにSub Form_Current()、Sub
fraWageType_AfterUpdate()、Sub UpdateSourceObject()が追加されたことを確認したら保存して閉じます。
6 データベースウィンドウからサブフォームsfrWorkOrderDetailsを選択したら、マウスの右ボタンをクリックしてショートカットメニューを表示させます。メニューから名前を付けて保存をクリックして、sfrWorkOrderDetailsbyHourlyの名称で保存します。同じ操作を繰り返して、sfrWorkOrderDetailsbyDaily、sfrWorkOrderDetailsbyMonthlyを作成します。サブフォームsfrWorkOrderDetailsHourlyをデザインモードで開いたら、フォームヘッダーにラベル”時給”を作成します。また、詳細セクションの、背景色を14286771に設定します。同様の手順でサブフォームsfrWorkOrderDetailsDaily, sfrWorkOrderDetailsMonthlyにラベルを追加して詳細セクションの背景色を表1-13-2のように設定します。
表1-3-2 サブフォームのプロパティ
|
サブフォーム |
コントロール |
プロパティ |
値 |
|
sfrWorkOrderDetailsHourly |
ラベル |
標題 |
時給 |
|
詳細 |
背景色 |
14286771 |
|
|
sfrWorkOrderDetailsDaily |
ラベル |
標題 |
日給 |
|
詳細 |
背景色 |
14286847 |
|
|
sfrWorkOrderDetailsMonthly |
ラベル |
標題 |
月給 |
|
詳細 |
背景色 |
16761992 |

図1-3-5 サブフォーム sfrWorkOrderDetailsHourlyにラベル(時給)を追加して、詳細の背景色を設定した例
7 メインフォームfrmWorkOrderをビューモードで開いたら、オプショングループのトグルボタン時給、日給、月給をクリックしてサブフォームが入れ替わるか確認します。次に、フォームのレコード移動ボタンをクリックしてトグルボタンとサブフォームが自動的に切り替わるか確認します。
8 メインフォームを保存して、Accessを終了させます。
Sub Form_Current()イベントの処理
このイベントは、フォームのカレントレコードが移動するときに実行されます。尚、このイベントは、フォームが開かれたときも実行されます。このイベントでは、テーブルtblWorkOrderのWagesBasedOnフィールドから給与形態フラグを取得して、オプショングループに設定します。次に、Sub UpdateSourceObjectを呼び出して、給与形態フラグに対応したサブフォームをロードします。
Sub fraWageType_AfterUpdate()イベントの処理
このイベントは、オプショングループのトグルボタンをクリックしたときに実行されます。このイベントでは、オプショングループから選択した給与形態フラグをtblWorkOrderのWagesBasedOnフィールドに保存します。次に、Sub UpdateSourceObjectを呼び出して、引数に対応したサブフォームをロードします。最後に、サブフォームにフォーカスを移動して終了します。サブフォームにフォーカスが移動されると、Sub sfrWorkOrderDetails_Enter()イベントが実行されて一ヶ月分のレコードが作成されます。
Sub UpdateSourceObject()の処理
このサブプロシージャは、フォームのOnCurrentとオプショングループのOnAfterUpdateイベントから呼ばれます。このプロシージャは、Select Case…End Selectで引数の給与形態フラグを調べて、フラグに対応したサブフォームをソースオブジェクト(SourceObject)に設定してロードします。
リスト1-3-1 frmWorkOrderのフォームモジュール
|
Const conHourly = 1 Const conDaily = 2 Const conMonthly = 3 Private Sub Form_Current() Me.fraWageType = Nz([WagesBasedOn], 0) Call UpdateSourceObject(Me.fraWageType) End Sub Private Sub fraWageType_AfterUpdate() [WagesBasedOn] = Me.fraWageType Call UpdateSourceObject(Me.fraWageType) Me.sfrWorkOrderDetails.SetFocus End Sub Private Sub UpdateSourceObject(intType As Integer) With Me.sfrWorkOrderDetails Select Case intType Case conHourly .SourceObject = "sfrWorkOrderDetailsbyHourly" Case conDaily .SourceObject = "sfrWorkOrderDetailsbyDaily" Case conMonthly .SourceObject = "sfrWorkOrderDetailsbyMonthly" End Select End With End Sub |