Accessお手本データベースのホームへ戻る

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

 

1-3-1 トグルボタンをクリックしてサブフォームをダイナミックに入れ替えします

 

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

 

1-3-2 タブコントロールの各ページに時給、日給、月給のサブフォームを配置した例

 

サンプルデータベース (CH1-3.mdb)では、以下のノウハウを習得することができます。

 

◆ サブフォームを必要なときにダイナミックにロードしてフォームの表示時間を短縮する方法

◆ レコードの移動ボタンをクリックしたとき、レコードに対応したサブフォームをダイナミックにロードする方法

 

   サブフォームをダイナミックに入れ替えるフォームを作成するには

 

 Access を起動して作業フォルダに、新規データベース CH1-3.mdbを作成します。

 

 ファイルメニューから外部データの取り込みインポートをクリックします。インポートのダイアログが表示されたら、CH3-4.mdbを選択してインポートボタンをクリックします。オブジェクトのインポートダイアログが開かれたら、テーブルタブをクリックしてすべて選択のボタンをクリックします。同様の手順で、クエリ、フォーム、モジュールタブをクリックしたらすべて選択のボタンをクリックして、最後にOKボタンをクリックします。

 

1-3-3 CH3-4.mdbからテーブル、クエリ、フォーム、モジュールの全てのオブジェクトをインポートする

 

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

 

1-3-4 tblWorkOrderに新規フィールド WagesBasedOnを追加

 

 データベースウィンドウからフォームをクリックしたら、frmWorkOrderをデザインモードで開きます。サブフォームsfrWorkOrderDetailsのプロパティを表示させたら、ソースオブジェクトを空にします。これで、サブフォームはメインフォームを開いてもロードされません。ツールボックスからオプショングループのアイコンをクリックして、フォーム右上に3個のトグルボタン(時給、日給、月給)を作成します。尚、オプショングループを作成するときは、ツールボックスのコントロールウィザードが有効になっているか確認してください。

 

1-3-1 オプショングループのプロパティ

コントロールの種類

プロパティ

オプショングループ

名前

fraWageType

トグルボタン

時給

日給

月給

 

 

 

 メニューからコードのアイコンをクリックして、フォームモジュールを開きます。CH1-3.mdbを開いたら、frmWorkOrderのフォームモジュールを開いてリスト1-1-1に示す部分をコピーして貼り付けます。フォームモジュールにSub Form_Current()Sub fraWageType_AfterUpdate()Sub UpdateSourceObject()が追加されたことを確認したら保存して閉じます。

 

 

 データベースウィンドウからサブフォームsfrWorkOrderDetailsを選択したら、マウスの右ボタンをクリックしてショートカットメニューを表示させます。メニューから名前を付けて保存をクリックして、sfrWorkOrderDetailsbyHourlyの名称で保存します。同じ操作を繰り返して、sfrWorkOrderDetailsbyDailysfrWorkOrderDetailsbyMonthlyを作成します。サブフォームsfrWorkOrderDetailsHourlyをデザインモードで開いたら、フォームヘッダーにラベル時給を作成します。また、詳細セクションの、背景色14286771に設定します。同様の手順でサブフォームsfrWorkOrderDetailsDaily, sfrWorkOrderDetailsMonthlyにラベルを追加して詳細セクションの背景色を表1-13-2のように設定します。

 

1-3-2 サブフォームのプロパティ

サブフォーム

コントロール

プロパティ

sfrWorkOrderDetailsHourly

ラベル

標題

時給

詳細

背景色

14286771

sfrWorkOrderDetailsDaily

ラベル

標題

日給

詳細

背景色

14286847

sfrWorkOrderDetailsMonthly

ラベル

標題

月給

詳細

背景色

16761992

 

 

1-3-5 サブフォーム sfrWorkOrderDetailsHourlyにラベル(時給)を追加して、詳細の背景色を設定した例

 

 メインフォームfrmWorkOrderをビューモードで開いたら、オプショングループのトグルボタン時給、日給、月給をクリックしてサブフォームが入れ替わるか確認します。次に、フォームのレコード移動ボタンをクリックしてトグルボタンとサブフォームが自動的に切り替わるか確認します。

 

 メインフォームを保存して、Accessを終了させます。

 

 

Sub Form_Current()イベントの処理

このイベントは、フォームのカレントレコードが移動するときに実行されます。尚、このイベントは、フォームが開かれたときも実行されます。このイベントでは、テーブルtblWorkOrderWagesBasedOnフィールドから給与形態フラグを取得して、オプショングループに設定します。次に、Sub UpdateSourceObjectを呼び出して、給与形態フラグに対応したサブフォームをロードします。

 

 

Sub fraWageType_AfterUpdate()イベントの処理

このイベントは、オプショングループのトグルボタンをクリックしたときに実行されます。このイベントでは、オプショングループから選択した給与形態フラグをtblWorkOrderWagesBasedOnフィールドに保存します。次に、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

 

ダウンロード (CH1-3.lzh)
ダウンロード (CH3-4.lzh)