データドリブン型のメニューを作成するお手本データベース

図1-1-1 メニューアイテムをテーブルから読み込んで表示
このサンプルデータベースは、タブコントロールの各ページに表示されるメニューアイテムをテーブル(tblMenu)から読み込んで表示します。メニューアイテムをクリックすると、テーブルに登録されている、フォーム/レポートを開きます。関数が登録されているときは、関数を実行します。テーブルのメニューアイテムには、メニューID、メニュータイトル、フォーム名/レポート名/関数名を登録します。フォーム名の先頭には、”frm”を付加します。また、レポート名の先頭には、”rpt”を付加します。.関数を指定するときは、”=”を付加して”=MyFunc()”のように登録します。メニュー情報をテーブルに登録することにより、将来機能追加などでフォーム/レポートを追加してもテーブルにメニューアイテムを追加するだけでメニューフォームの修正が不要となります。

図1-1-2 テーブル(tblMenu)に登録されたメニューアイテム
サンプルデータベース(CH1-1.mdb)では、以下のノウハウを習得することができます。
◆ タブコントロールの全てのページに表示されるコントロールを作成する方法
◆ タブコントールのタブをクリックしたとき、タブに対応したレコードを絞り込む方法
◆ テーブルに登録されている関数を実行する方法
● データドリブン型のメニューを作成するには
1 Accessを起動して作業フォルダに新規データベース CH1-1.mdbを作成します。
2 データベースウィンドウからテーブル
をクリックして、新規作成のボタンをクリックします。テーブルの新規作成ダイアログが表示されたら、デザインビューを選択してOKボタンをクリックします。テーブルが表示されたら、フィールド名にMenuId, MenuTitle, MenuNameを入力します。データ型とフィールドサイズは、表1-1-1のように設定します。
表1-1-1 テーブル(tblMenu)の構成
|
フィールド名 |
データ型 |
サイズ |
説明 |
|
MenuId(主キー) |
数値型 |
整数型 |
メニューID |
|
MenuTitle |
テキスト型 |
50 |
メニュータイトル |
|
MenuName |
テキスト型 |
50 |
フォーム/レポート/関数名 |
MenuIdフィールドを選択したら、メニューから主キーのアイコン
をクリックして主キーを設定します。

図1-1-3 テーブル tblMenuを作成
3 テーブルを”tblMenu”の名称で保存したら、テーブルを開いて図1-1-4に示すようなスタッフ管理システムのメニューアイテムを入力します。MenuIdは、3桁で100-199が保守サブメニュー、200-299が登録サブメニュー、300-399が検索サブメニュー、400-499が印刷サブメニュー、500-599が補助サブメニュー、600-699-が終了サブメニュー用です。MenuTitleには、メニューに表示される標題を入力します。MenuNameには、フォーム名/レポート名、関数名のいずれかを入力します。関数を入力するときは、”=”を付加して”=Quit_FS()”のように入力します。MenuNameに値を入力しないと、そのメニューアイテムは、コメントとして扱われて表示されません。

図1-1-4 テーブル tblMenuにスタッフ管理システムのメニューアイテムを登録
4 データベースウィンドウからフォーム
をクリックして、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューを選択してOKボタンをクリックします。フォームのデザインビューが表示されたら、ツールボックスからタブコントロールのアイコン
をドラッグして、詳細セクションの中央に作成します。タブコントロールにページ(1-6)を追加したら、ページの標題を保守、登録、検索、印刷、補助、終了に書き替えます。また、各ページのタグプロパティには、MenuIdの範囲を設定します。ツールボックスからリストボックスのアイコン
をドラッグしてフォームの詳細セクションに作成します。マウスをリストボックスの上に移動してから、左ボタンをホールドしてマウスが手の形になったらリストボックスをタブコントロールの先頭ページ(保守)に移動します。リストボックスをタブコントロールの全てのページの同位置に表示させるには、先頭ページ(保守)の上にコントロールを移動させます。(重要:タブコントールの先頭ページをクリックした状態で、ツールボックスからリストボックスのアイコンをクリックして作成すると、リストボックスは先頭ページにしか表示されません。)リストボックスには、テーブルから読み込んだメニューアイテムを表示します。

図1-1-5 フォームにタブコントロールを作成して先頭ページにリストボックスを移動した例
タブコントロールとリストボックスのプロパティは、表1-1-2のように設定します。リストボックスの値集合ソース(RowSource)を作成するには、リストボックスのプロパティを表示させて、値集合ソースをクリックしてクエリビルダボタン
をクリックします。テーブルの表示ダイアログが表示されたら、テーブルのタブをクリックしてtblMenuを選択して追加ボタンをクリックします。閉じるのボタンをクリックしてダイアログを閉じます。tblMenuからMenuId, MenuTitle, MenuNameのフィールドをダブルクリックしてQBEフィールドに移動します。MenuIdの並べ替えをクリックしてコンボボックスから昇順を選択します。MenuIdの抽出条件に、”Between 100 And 199”を入力して先頭ページ(保守)のメニューアイテムのみ表示されるようにします。MenuNameの抽出条件に”Not Is Null”を入力して、MenuNameが入力されていないアイテムを表示しないようにします。クエリを保存して、リストボックスの値集合ソースを更新します。

図1-1-6 リストボックスの値集合ソースのSQL
表1-1-2 詳細セクションに作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
タブコントロール |
名前 |
tabMenu |
|
タブコントロール(ページ1) |
標題 |
保守 |
|
タグ |
100 And 199 |
|
|
タブコントロール(ページ2) |
標題 |
登録 |
|
タグ |
200 And 299 |
|
|
タブコントロール(ページ3) |
標題 |
検索 |
|
タグ |
300 And 399 |
|
|
タブコントロール(ページ4) |
標題 |
印刷 |
|
タグ |
400 And 499 |
|
|
タブコントロール(ページ5) |
標題 |
補助 |
|
タグ |
500 And 599 |
|
|
タブコントロール(ページ6) |
標題 |
終了 |
|
タグ |
600 And 699 |
|
|
リストボックス |
名前 |
lstMenu |
|
値集合タイプ |
テーブル/クエリ |
|
|
値集合ソース |
SELECT tblMenu.MenuId, tblMenu.MenuTitle, tblMenu.MenuName FROM tblMenu WHERE (((tblMenu.MenuId) Between 100 And 199) AND (Not (tblMenu.MenuName) Is Null)) ORDER BY tblMenu.MenuId; |
|
|
連結列 |
1 |
|
|
列数 |
3 |
|
|
列幅 |
0cm;6cm;0cm |
|
|
立体表示 |
なし |
|
|
境界線スタイル |
透明 |
|
|
背景色 |
12632256 |
5 フォームヘッダーに、ラベル(lblTitle)を作成して標題に”スタッフ管理”を設定します。lblTitleの下にバージョン番号を表示する、ラベル(lblVersion)を作成します。lblVersionの標題は、実行時に設定します。さらに、図1-1-7のようにアプリケーションのアイコンなどを貼り付けると、見栄えがよくなります。

図1-1-7 フォームヘッダーにアプリケーションのタイトルとバージョン番号を表示するラベルを貼り付けた例
6 メニューからコードのアイコン
をクリックしてフォームモジュールを表示させたら、CH1-1.mdbを開いて”frmMenu”のフォームモジュールをコピーして貼り付けます。フォームモジュールのリストは、リスト1-1-1を参照してください。また、CH1-1.mdbのフォームからfrmSample、レポートからrptSample、モジュールからbasMyLibをインポートしてください。frmSample、rptSampleは、メニューからアイテムをクリックしたときに開かれます。basMyLibには、メニューをクリックしたときに、呼び出される関数が登録されています。
7 フォームを”frmMenu”の名称で保存してから開きます。タブコントロールのタブをクリックしてサブメニューを表示させたら、適用なメニューアイテムをクリックします。メニューアイテムをクリックすると、テーブルに登録されているフォーム、レポートが開かれるか、関数が実行されます。

図1-1-8 フォームを開いてメニューを表示させた例
8 メニューアイテムをクリックしたときの動作が確認できたら、Accessを終了させます。
Sub Form_Load()イベントの処理について
このイベントは、フォームが開かれてデータをロードしたときに実行されます。このイベントでは、SetVersion_FS()を呼び出して、フォームヘッダーのラベル(lblVersion)の標題にバージョン番号を設定します。SetVersion_FSでは、テーブル/レジストリなどに格納さているバージョン番号を取得して設定します。
Sub tabMenu_Change()イベントの処理について
このイベントは、タブコントロールのタブをクリックしたときに実行されます。このイベントでは、リストボックスの値集合ソース(RowSource)を書き替えて、クリックしたページのメニューアイテムを表示します。SQLのWhere句には、”MenuId Between 100 And 199”のようにページに対応したメニューアイテムが表示されるようにレコードを絞り込みます。Betweenの値(100 And 199)は、ページコントロールのタグ(Tag)プロパティから取得します。”Not MenuName Is Null”では、MenuNameに値が入力されていないアイテムを表示しないようにしています。メモリ変数(strRowSource)にSQLを作成したら、リストボックスの値集合ソース(RowSource)を書き替えます。これで、リストボックスには、タブコントロールの各ページに対応したメニューアイテムが表示されます。
Sub lstMenu_Click()/Sub lstMenu_DblClick()イベントの処理について
このイベントは、リストボックスのメニューアイテムをクリック/ダブルクリックしたときに実行されます。シングルクリック/ダブルクリックのどちらを有効にするには、条件付コンパイル定数(#Single_Click)で制御します。#Single_Clickに、”True”を設定するとシングルクリック、”False”を設定するとダブルクリックになります。このイベントでは、OpenMenu()を呼び出して、メニューアイテムの処理を行います。OpenMenu()の引数には、テーブルに格納されているフォーム名/レポート名/関数名を指定します。
Sub OpenMenu()の処理について
このサブプロシージャでは、引数で指定された内容を調べて、フォーム/レポートを開いたり関数を実行します。引数の先頭1文字が”=”のときは、関数名を取り出してEval()関数経由で実行させます。引数の先頭3文字が”frm”のときは、DoCmdのOpenFormメソッドでフォームを開きます。尚、フォームはダイアログモードで開いて、フォームが閉じられるまでDoCmd.OpenFormが待ち状態になるようにしています。このテクニックを応用して、DoCmd.OpenFormの前後にVisible=False, Visible=Trueを挿入するとフォームが開いている間、メニューを非表示にすることができます。引数の先頭3文字が”rpt”のときは、DoCmdのOpenReportメソッドでレポートをプレビューモードで開きます。
Sub SetFormCaption()/ Sub
SetReportCaption()
SetFormCaption, SetReportCaptionは、フォーム固有のメソッドです。これらのメソッドは、引数で指定されたフォーム/レポートの標題を設定します。frmSample/rptSampleからこれらのメソッドを使用するには、次のように記述します。
Forms("frmMenu").SetFormCaption Me
Forms("frmMenu").SetReportCaption Me
リスト1-1-1 frmMenuのフォームモジュール
|
Option Compare Database Option Explicit ' メニューアイテムをシングルクリックで選択するときは "True" ' ダブルクリックで選択するときは "False"を設定します。 #Const Single_Click = True Private Sub Form_Load() Call SetAppTitle_FS("Data-Driven Menu (C) " _ & Year(Date) & " by Akio Kasai") Call SetVersion_FS(Me) End Sub #If Single_Click Then Private Sub lstMenu_Click() Call OpenMenu(Me.lstMenu.Column(2)) End Sub #Else Private Sub lstMenu_DblClick(Cancel As Integer) Call OpenMenu(Me.lstMenu.Column(2)) End Sub #End If Private Sub tabMenu_Change() Dim strRowSource As String ' タブに該当するサブメニューを表示するSQLを生成して ' リストボックスのRowSourceを書き替えます strRowSource = "SELECT MenuId, MenuTitle, MenuName FROM tblMenu" Me.Painting = False With Me.tabMenu strRowSource = strRowSource _ & " WHERE (((MenuId) Between " & .Pages(.Value).Tag & ")" _ & " AND (Not (MenuName) Is Null))" End With strRowSource = strRowSource & " ORDER BY MenuId;" Me.lstMenu.RowSource = strRowSource Me.Painting = True End Sub Private Sub OpenMenu(strMenuName As String) Dim strFuncName As String Dim strFormName As String Dim fOK As Boolean ' メニューアイテムに対応したフォーム/レポートを開きます。 ' "="が付加されているときは関数を実行します。 On Error Resume Next If Left(strMenuName, 1) = "=" Then strFuncName = Mid(strMenuName, 2) fOK = Eval(strFuncName) ElseIf Left(strMenuName, 3) = "frm" Then Me.Visible = False DoCmd.OpenForm FormName:=strMenuName, _ WindowMode:=acDialog Me.Visible = True ElseIf Left(strMenuName, 3) = "rpt" Then DoCmd.OpenReport ReportName:=strMenuName, _ View:=acViewPreview End If End Sub
'------------------------------------------------------------------------------------ ' フォーム/レポートの標題を設定するフォーム固有のメソッド
'------------------------------------------------------------------------------------ Public Sub SetFormCaption(frm As Form) frm.Caption = Me.lstMenu.Column(1) End Sub Public Sub SetReportCaption(rpt As Report) rpt.Caption = Me.lstMenu.Column(1) End Sub |