Accessの利点はサブフォームに有り
Accessの利点がよくわからない。Excelより便利なの?という人は非常に多いです。下手にExcelがデータベース的使い方が出来るようになって来ている為、尚更Accessを勉強してみるものの、この両者の違いがよくわからず、メリットを感じられず、モチベーションがなくなり、Excelでいいやとなりがちです。
今回はそんな疑問に答えるべく、まず利点その1として「サブフォーム」というものをまとめてみました。薬剤師さん向けに作ってはいますが、一般的な内容なので、どなたでも利用可能だと思います。
目次
今回利用するAccessファイル
Accessファイルの構成
テーブル構成
今回のAccessファイルは最も基本的なテーブルの正規化を行ってあります。これには2パターンありますが、今回はシンプルな方法を作ってみます。正規化についてはまた別のエントリーで詳しくまとめてみるとして、以下のようなテーブル構成になっています。
- 病院マスタ - 親フォームの元になるテーブルです。
- 医薬品データ - サブフォームの元になるテーブルです。親1に対して複数のデータが登録される事になります。
- 病院タイプ - 親フォームの病院タイプのドロップダウンでだけ使うテーブルです。
- 都道府県 - 親フォームの都道府県のドロップダウンでだけ使うテーブルです。
リレーションシップ
また、今回のサブフォームの利点をさらに得るために、リレーションシップを張ってあります。リレーションシップについてもまた、別のエントリーでまとめてみましょう。
- 病院マスタ 1 ⇔ N 医薬品データ
図:病院マスタと医薬品データをつなげてみた
サブフォームを作り込む
テーブルを元にサブフォームを作る
親フォームを作る
親フォームは簡単です。今回は親になる「病院マスタ」を元に、フォームウィザードを使って適当に作ってしまいましょう。以下の手順で作成可能です。
- 作成タブのフォームウィザードをクリックします。
- テーブル/クエリでは、病院マスタを選択し、全レコードを選んで選択したフィールドへ登録します。
- 次へ進んだら今回は単票形式を選びます。
- フォーム名(病院名マスタ)を付けたら、完了をクリック
- テキストボックスなどが自動で生成されるので、フォームの上半分くらいの位置にレイアウトを組んであげます。
図:全フィールドを今回は使うので全部追加します。
図:単票形式で今回は作成します。
図:下を空けて、フォームパーツを上に配置してあげます。
サブフォームをつくる
さて、今回の主役サブフォームを作ります。その1では最も単純な、テーブルを元にしたフォームを作ります。以下の手順で作成し、作成後に親フォームにこのサブフォームを貼り付けます。データシートで作る事になりますが、フォームの配置デザインは意味がないので、適当に入ってればOKです。
- 作成タブのフォームウィザードをクリックします。
- テーブル/クエリでは、医薬品データテーブルを選択し、とりあえず、全部追加しておきます。
- 次へ進んだら今回はデータシートを選びます。表形式でも行けますが今回はこれで。
- フォーム名(病院名マスタ)を付けたら、完了をクリック
- テキストボックスなどが自動で生成されます。IDと病院IDは自動で入力されるので、フォームから削っておきます。
- 親フォームである病院マスタフォームをデザインビューで開きます。画面右下のアイコンをクリックでデザインビューになります。
- デザインタブの中のコントロールにて、サブフォーム/レポートというパーツをクリックします。
- 適当な大きさにドラッグする。サブフォームウィザードが開くので、作った医薬品データフォームを指定する。
- リンクするフィールドの指定では、今回は病院マスタ側はID、医薬品データ側は病院IDでつながってるので、独自に設定するを選ぶ。
- 親はID、サブフォームは病院IDをそれぞれ選んで完了。この作業はプロパティシート上でも、リンク親フィールド、リンク子フィールドでそれぞれ設定が可能です。
図:サブフォームもとりあえず全フィールドを追加
図:データシートを選ぶのがポイント
図:データシートの場合、デザイン配置は無意味なので適当でOK
図:赤枠のこれがサブフォームコントロール
図:デザインビューは非常によく使います
図:サブフォームウィザードでサブフォームを指定する
図:親と子それぞれ連結させるフィールドを選ぶ
入力用のコンボボックスを用意する
今回、都道府県とタイプについては、専用のテーブルを用意し、それぞれのフィールドは、文字列型ではなく数値型になっています。これは検索スピードを上げる為に行ってる正規化のうちの1つです。しかし、数値では人間の入力がしにくいので、コンボボックスにして、文字を選ぶと対応するIDが入るようにしてあげます。
- 都道府県のテキストボックスを右クリック⇒コントロールの種類で、コンボボックスを選びます。
- もう一度右クリックして、プロパティを開き、プロパティシートを開きます。
- 値集合ソースという項目の中にある...をクリック
- クエリ作成画面っぽいのが出ます。ここで、都道府県テーブルを追加。全てのフィールドを追加してあげます。
- 閉じるボタン⇒はいで、閉じます。
- 連結列はID列なので1を入力。1列目という意味です。
- 次にプロパティシートの列数を2にします。IDと都道府県名で2列ですね。
- 列幅では、ID列を0、都道府県名を8cmとする為、0;8と入力、Enterをします。セミコロンな点に注意。
- 同じような感じで、タイプについてもコンボボックス化しておくと良いでしょう。
- これでサブフォームの追加が完了しました。1つのフォームにいくつでも連結する形を作れるなら、サブフォームは追加可能です。
図:コンボボックス用のクエリ追加画面
図:入力しやすいコンボボックス化はよく使うテクニック
サブフォームのメリット
3次元以上のデータを一度に扱える
Excelは、2次元。つまり、縦と横の表でしか最大でも表現ができません。其のため、3つ目の要素となると、別のシートに記述する事になりますが、1度にこれらを連結した状態で表示できるわけじゃありません。
Accessの場合、今回のようなフォームを利用すると、親の病院マスタにぶら下がる形で、医薬品データといった3つ目の要素を表示させる事ができるのです(親マスタで縦横2次元を実現してますからね)。さらに、同じく病院マスタのIDと連結できるフィールドを持つ別のサブフォームがあれば、同一画面に4つ目、5つ目と加える事が可能です(通常はタブコントロールも合わせて使います)。
また、これらのフォームは実際にある程度入力して、下のほうにあるレコードバーで移動をすると、病院が変わる事に連動して、そのサブフォームの内容も変わるようになります。親と子がIDで連結している為です。また、サブフォームにデータをガシガシ入力すると、自動的にサブフォーム側のIDと親IDにはそれぞれ、連番と病院マスタ側のIDが入ってくれます。
入力者が意識せずとも、きちんと整備されたデータを紐つけた状態で入力が簡単にできるようになります。これがサブフォーム化の最大のメリットですね。Excelではできない芸当ですし、ここまで一切VBAを記述していません。
図:このレイアウトはAccessの全ての基本になります
連鎖更新・連鎖削除
今回、テーブル間でリレーションシップを貼りました。その際に連鎖更新・連鎖削除を付け加えてあります。この設定を施しておくと、以下のようなメリットがあります。
- フォーム上でレコードを削除すると、サブフォームのテーブルに於いて、同じIDを持つデータも一緒に削除してくれます。手動で削除する必要がありません。これもAccessを使うメリットですね。ゴミデータが残りません。
- また、病院マスタのIDを変更してみると(今回はオートナンバーなので変更できませんが)、これも連動してサブフォーム側のテーブルのデータのIDも連動して変更してくれます。変更忘れといったミスが防げます。
Excelではこれら連鎖更新、連鎖削除といったものがない為、基本人間が全部手直ししなければなりません。Accessではその必要がありません。マスタのデータを弄るだけで済みます。