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

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

 

Fig1-7-1

1-1-1 メニューアイテムをテーブルから読み込んで表示

 

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

 

Fig1-7-2

1-1-2 テーブル(tblMenu)に登録されたメニューアイテム

 

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

 

◆ タブコントロールの全てのページに表示されるコントロールを作成する方法

◆ タブコントールのタブをクリックしたとき、タブに対応したレコードを絞り込む方法

◆ テーブルに登録されている関数を実行する方法

 

   データドリブン型のメニューを作成するには

 

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

 

 データベースウィンドウからテーブルIcon_Tablesをクリックして、新規作成のボタンをクリックします。テーブルの新規作成ダイアログが表示されたら、デザインビューを選択してOKボタンをクリックします。テーブルが表示されたら、フィールド名にMenuId, MenuTitle, MenuNameを入力します。データ型とフィールドサイズは、表1-1-1のように設定します。

 

1-1-1 テーブル(tblMenu)の構成

フィールド名

データ型

サイズ

説明

MenuId(主キー)

数値型

整数型

メニューID

MenuTitle

テキスト型

50

メニュータイトル

MenuName

テキスト型

50

フォーム/レポート/関数名

 

MenuIdフィールドを選択したら、メニューから主キーのアイコンIcon_PrimaryKeyをクリックして主キーを設定します。

 

Fig1-7-3

1-1-3 テーブル tblMenuを作成

 

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

 

Fig1-7-4

1-1-4 テーブル tblMenuにスタッフ管理システムのメニューアイテムを登録

 

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

 

Fig1-7-5

1-1-5 フォームにタブコントロールを作成して先頭ページにリストボックスを移動した例

 

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

 

 

Fig1-7-6

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;

連結列

列数

列幅

0cm;6cm;0cm

立体表示

なし

境界線スタイル

透明

背景色

12632256

 

 フォームヘッダーに、ラベル(lblTitle)を作成して標題にスタッフ管理を設定します。lblTitleの下にバージョン番号を表示する、ラベル(lblVersion)を作成します。lblVersionの標題は、実行時に設定します。さらに、図1-1-7のようにアプリケーションのアイコンなどを貼り付けると、見栄えがよくなります。

 

Fig1-7-7

1-1-7 フォームヘッダーにアプリケーションのタイトルとバージョン番号を表示するラベルを貼り付けた例

 

 メニューからコードのアイコンIconコードをクリックしてフォームモジュールを表示させたら、CH1-1.mdbを開いてfrmMenuのフォームモジュールをコピーして貼り付けます。フォームモジュールのリストは、リスト1-1-1を参照してください。また、CH1-1.mdbのフォームからfrmSample、レポートからrptSample、モジュールからbasMyLibをインポートしてください。frmSamplerptSampleは、メニューからアイテムをクリックしたときに開かれます。basMyLibには、メニューをクリックしたときに、呼び出される関数が登録されています。

 

 フォームをfrmMenuの名称で保存してから開きます。タブコントロールのタブをクリックしてサブメニューを表示させたら、適用なメニューアイテムをクリックします。メニューアイテムをクリックすると、テーブルに登録されているフォーム、レポートが開かれるか、関数が実行されます。

 

Fig1-7-8

1-1-8 フォームを開いてメニューを表示させた例

 

 メニューアイテムをクリックしたときの動作が確認できたら、Accessを終了させます。

 

 

Sub Form_Load()イベントの処理について

このイベントは、フォームが開かれてデータをロードしたときに実行されます。このイベントでは、SetVersion_FS()を呼び出して、フォームヘッダーのラベル(lblVersion)の標題にバージョン番号を設定します。SetVersion_FSでは、テーブル/レジストリなどに格納さているバージョン番号を取得して設定します。

 

 

Sub tabMenu_Change()イベントの処理について

このイベントは、タブコントロールのタブをクリックしたときに実行されます。このイベントでは、リストボックスの値集合ソース(RowSource)を書き替えて、クリックしたページのメニューアイテムを表示します。SQLWhere句には、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”のときは、DoCmdOpenFormメソッドでフォームを開きます。尚、フォームはダイアログモードで開いて、フォームが閉じられるまでDoCmd.OpenFormが待ち状態になるようにしています。このテクニックを応用して、DoCmd.OpenFormの前後にVisible=False, Visible=Trueを挿入するとフォームが開いている間、メニューを非表示にすることができます。引数の先頭3文字が”rpt”のときは、DoCmdOpenReportメソッドでレポートをプレビューモードで開きます。

 

 

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

 

ダウンロード (CH1-1.lzh)