2014年5月27日火曜日

Accessのパラメータクエリをカスタムフォームで

先日Microsoft Accessパラメータクエリについて紹介しました。
その際の抽出条件の入力形式はフリーワードでしたが、
選択式の方が便利な場面は多々あります。
作るのはわりと面倒ですが、そうすることも可能です。
ということでちょっとやってみます。
なお使っているのはAccess 2007です。

ここでは[顧客テーブル](顧客IDフィールド(主キー)、顧客名フィールド)、
[取引テーブル](取引IDフィールド(主キー)、顧客IDフィールド)の2つのテーブルに対し、
顧客名を選択して該当取引を抽出し、
[取引クエリ]をデータソースとする[取引フォーム]を開くような、
インターフェイス[顧客選択フォーム]を考えることにします。

メニューの[作成]-[フォームデザイン]で新機フォームを作成し、
そこに[リストボックス]を置くと[リストボックスウィザード]が立ち上がります。
[テーブルまたはクエリの値をリストボックスに表示する]を選択し、
[顧客テーブル]を選び、そのすべてのフィールドを選びます。
このリストボックスは[リスト顧客]と名付けておきます。
またフォームに[ボタン]を置くと[コマンドボタンウィザード]が立ち上がります。
[種類]を"フォームの操作"、[ボタンの動作]を"フォームを開く"とし、
開くフォームには[取引フォーム]を選択します。
その後は多分[特定のレコードを表示する]を選べばいいのでしょうが、
なぜかうまくいかないので[すべてのレコードを表示する]を選んでおきます。
これでできるのが[顧客選択フォーム]です。
最後に[取引クエリ]の取引IDフィールドの"抽出条件"に
[Forms]![顧客選択フォーム]![リスト顧客]
を設定します。
これはパラメータの一種で、[リスト顧客]の値へのフル修飾での参照を示します。
あとは[顧客選択フォーム]を開き、顧客を選択して実行すると
指定した顧客に関する取引のみが[取引フォーム]に表示されます。

あるいはクエリ側に特殊なことをしなくても抽出条件を指定することができます。
[顧客選択フォーム]をデザインビューで開いて、
先に置いた[ボタン]のコンテキストメニュー(右クリックメニュー)でプロパティを開き、
[イベント]タブの[クリック時]プロパティの右にある[...]ボタンを押すと、
Visual Basic for ApplicationsのIDEが開いて
イベント発生時に動作するコードが表示されます。
ここにあるstLinkCriteria文字列変数が条件であり、
ここにSQLのwhere句を書けば抽出条件に採用されます。
これを利用することでより柔軟に抽出条件を指定できます。
例えば[リスト顧客]の[複数選択]プロパティを"しない"以外にした上で、
以下のようなコードを追加することで、各顧客の情報の表示オン/オフを指定できます。
    Dim i As Long
    Dim v As Variant
    
    i = 0
    stLinkCriteria = vbNullString
    For Each v In リスト顧客.ItemsSelected
        If i = 0 Then
            stLinkCriteria = stLinkCriteria & "顧客id=" & リスト顧客.ItemData(v)
        Else
            stLinkCriteria = stLinkCriteria & " or 顧客id=" & リスト顧客.ItemData(v)
        End If
        i = i + 1
    Next v

もし参考のため顧客idの最大値をテキストボックスに表示しておきたいなら、
表示するテキストボックスの[コントロールソース]プロパティまたは[既定値]プロパティを
=DMax("[顧客id]","顧客テーブル")
とすることで対応できますし、
いろいろなことがわりと簡単に実現します。
私はAccessより先にVBでDAOとか使ってた口なので、
Accessが思ったように動いてくれないとイライラするのですが、
Accessというベースがある分、やりやすい部分は確かにあります。
ただし、日本語名のプロパティや関数名に馴染むことは今後もないでしょう。

ところで、これら方法はマクロを利用しているためセキュリティ的に実行できないケースがあります。
もしリボンメニューの下に
セキュリティの警告 データベースの一部の内容が無効にされました
と表示されていたら、その右の[オプション]を押して
[このコンテンツを有効にする]を選択することで実行できるようになります。
ただしこれはAccessを立ち上げるたびにせねばなりません。
いちいち面倒なら永続的に許可する方法もあります。
Accessのメインウィンドウ左上のofficeアイコンをクリックし[Accessのオプション]を押し、
[セキュリティーセンター]タブの[セキュリティーセンターの設定]をクリックし、
[マクロの設定]タブで[すべてのマクロを有効にする]を選択すればそうできます。

0 件のコメント:

コメントを投稿