2015年1月22日木曜日

Accessで値を選択

データベースでは、あるフィールドに自由な文字列ではなく、
いくつかの選択肢から選ばせるようにしたいことが多々あります。
例えば発注伝票の発注先を既存の取引先から選ぶようなケースです。
その場合、発注テーブルの発注先フィールドと
取引先テーブルの主キーとの間でリレーションを結び、
発注先を取引先の名称から選ぶようにすることになります。

しかし、リレーションを設定するほどのことでもないこともあり、
例えば会議の出欠フィールドを"出席"、"欠席"、"保留"から選ぶような場合には、
改めてテーブルを作るのも馬鹿らしく思えます。
Microsoft Accessではそういう簡易的な選択が容易にできるようになっています。

Access 2007なら任意のテーブルを[デザインビュー]で開き、
フィールドのデータ型で[ルックアップ ウィザード]を選択し、
[表示する値をここで指定する]を選択して、
そこに選択肢となる文字列をいくつか登録し、
そのテーブルを開いて先のフィールドを入力しようとすると、
ドロップダウンコンボボックスとして動作し、
先に登録した選択肢から1つを選べるようになります。
このときこのフィールドはテキスト型に設定されます。
ただこれだけだとフォームからはフリー入力になってしまうため、
フォームのほうでも設定する必要があります。
任意のフォームを[デザインビュー]で開き、
リボンのコントロールの[コントロールウィザードの使用]を有効にした上で
コンボボックスをフォームに置くと[コンボボックス ウィザード]が立ち上がります。
そこで[表示する値をここで指定する]を選択し、
テーブルのときと同じように選択肢を登録して、
[次のフィールドに保存する]で先のフィールドを指定すれば完了です。
フォーム経由でもそのフィールドを変更しても、テーブルに反映されます。
ただし、このフィールドはデータ上はあくまでテキスト型であり、
選択肢はテーブルやフォームで後付けしているだけなので、
予期せぬ文字列が入る可能性はあります。

以上のようなことで簡易に選択肢を設けることはできますが、
そのフィールドの文字数が多いと冗長でデータベースのサイズをむやみに大きくしてしまいます。
文字数が1〜2文字ならデータサイズ的には問題ないでしょうが、
これはつまり第1正規化さえされていない、
エンジニアからすると非常に気持ち悪いデータベースということになります。
となればやっぱり選択肢のテーブルを作るのがよいことになります。
新規テーブルを作成して、第1フィールドをオートナンバー型、
第2フィールドをテキスト型にして第2フィールドに選択肢を登録します。
で、先の[ルックアップ ウィザード]、[コンボボックス ウィザード]で、
[表示する値をここで指定する]ではなく
[テーブルまたはクエリの値をルックアップ列に表示する]、
または[テーブルまたはクエリの値をコンボボックスに表示する]を選択し、
先に作成したテーブルを指定して、すべてのフィールドを選択し、
並べ替え順を行うフィールドに第1フィールドを選べば、
上記と同様のことを第3正規化(他の事情が整っていれば)できます。

私ならやっぱり第3正規化はしておきたいですね。

0 件のコメント:

コメントを投稿