<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--本の貸し出しシステムを作る
  1 > 2 > 3 > 4



テーブルの設計・・・難しいですね。

でも、データベースを作るとき、基本的にテーブルから設計していきますが、テーブルから考えてはいけません。

データベースに限らず、身の回りのいろいろな仕事をコンピュータ化しようとするとき、必ず考えなければならないことがあるのです。
もし、人間がやるとしたら、どうするか。

コンピュータっていうのは、はっきり言ってこちらが指示したことしかやりません。気が利かないし、あたりまえのこともいちいち言ってやらないとちゃんと働いてくれません。人間が手作業でやるなら簡単なことも、細かく指示してやる必要があります。人間が手作業でやってみてできないことは、コンピュータにもできません。つまり、説明のできない仕事はコンピュータ化できないのです。頭悪いし気が利かないですからねーコンピュータってのは。ホントに。
Accessで作りたいんだけど・・・。と思ったら、まずその仕事を、皆さんが、紙に書くとか、口頭で誰かに伝えるとか、一覧表から肉眼で探すとかして、ひととおりやってみることです。Accessで作るとかそういうことを最初に考えないこと。皆さんができないことは、Accessにもできませんし、皆さんがぜんぜん理解できてない業務はAccessにもできません。

で、紙に書いたことは、いずれテーブルになっていくし、一覧表から肉眼で探したときに皆さんの頭の中にあったことが、クエリやフォームの中に生かされていく。フォームに入力するのはいつか、レポートを印刷するのはいつか・・・少しずつ少しずつそういうことを考えていくのです。

処理の全体を見渡せないうちは、テーブルの設計なんてとんでもないです。これはどんなプロフェッショナルでもおなじです。むしろ、上級者になればなるほど、この部分に時間と労力をかけるものです。こういう、設計部分を専門に扱っている会社とかもあるくらいですから、そうそう簡単にはまいりません。というよりも、要するにその会社のその業務を熟知してないとテーブル設計なんてできないわけで、Accessに詳しいからテーブル設計ができる、というわけではないんです。
まずは、Accessで作りたい、と思っている業務を、しっかり分析することですね。

分析したことと、実際のAccessの中のいろいろな機能などとをひとつひとつ結び付けて、ひとつのシステムを作りこんでいくわけですけれど、これはなかなか簡単な作業ではありませんよ。できればあせらず、じっくり取り組んでいってください。時間をかける、ということは必ずしも長い時間を費やすということではないと思います。

難しいなぁ・・・とお感じになられたら、あまり欲張らず、すごくシンプルで小さなデータベースをいくつか作ってみて、テーブルの結びつきのパターンを何パターンか覚えてしまうといいかもしれませんよ。こういうテーブルの構造は、見積や請求書を作るときに使えそうだ、とか、こういうテーブルの結びつきは顧客管理などにありがちだな、とか・・・。あんまりフィールド数の多いでっかいテーブルをいきなり頭に思い浮かべても、なかなかイメージが固まらないと思うんです。

あとは鍛錬あるのみ!がんばりましょう!


そんなわけで(どんな)今日は、「本の貸し出し」に挑戦してみます。

こういう業務をデータベース化するときに、まず考えなくちゃいけないのは、「何のために?」ってところですね。まずはそこから考えましょう。

そして、本を貸し出しするタイミング・・・つまり、このデータベースのデータを入力・更新するタイミングを考えます。
本棚があって、みんなが勝手に持ち出していいような仕組みになってる場合は、いくら立派なデータベース作ったって、本が貸し出されたかどうかわからないから入力のしようがないですよね。

ただ漠然とテーブルの構造とか考えてもあかんです。

データベースは、普段の業務の中で、ごくごく自然にデータの蓄積が行われるように考えていかないと、せっかくすごいの作ったって長続きしません。そのデータベースが有効活用されるかどうかは、新しいデータがスムーズに入ってくるかどうか、入力や更新に無理が無いかどうか、にかかってきます。入力がめんどうくさい、忘れがち、わかりにくいシステムは苦しいです。特に、本の貸し出しなんかは、借りる人(利用する人)にとってみたら別にそんなのシステム化されてようがされてまいがどっちでもいいわけで、ずさんになりがちですよね。データベースはあるけど、いつも正確な情報が入ってるわけじゃない、なんていうシステムにならないよう、1にも2にも「現状分析」が大切です。
人間が、口頭で伝えたり、メモを残したり、台帳に記入したりする方が便利で有効な場合だってありますよね。


ある程度現状の分析ができたら、本が貸し出されてから返却されるまでの流れを追ってみましょう。

こういうのをデータベース化するのって、多分、「返却されてない本がどれくらいあるのか調べたい」っていうことからじゃないかなって思います。まずはもっとも大きな目的をひとつ定めて、その任務を遂行するためにはどうしたらいいのか、を、データベースとかAccessとかテーブル設計とかそういうことは忘れてとにかくできる限り書き出してみましょう。
10人いれば10通り、だと思います。ですんで、いくつかパターンをお話するような感じで進めていきますね。



その本が、貸し出し中か、そうでないかだけ知るために・・・

これは、要するに、貸し出しの履歴は必要なくて、「現在の本の状態」がわかればよい、という、非常にシンプルな業務の場合です。
テーブルは、蔵書のリストみたいな感じのテーブルがひとつあればよいでしょう。

すでに蔵書のリストがあるならば、それに[貸し出し]というような名前のフィールドを追加して、YesNo型にします。

Yesのときは貸し出し中、Noの時は本棚に戻ってきている、という感じで考えるといいのではないでしょうか。
[番号]っていう主キーをつけましたけど、このテーブルひとつだけで、貸し出し中かそうでないかの状況を知るためのリストを作るだけなら、主キーはなくてもいいかもしれません。ただ、誤解のないようにお願いしたいんですけども、テーブルたるもの、そのテーブルの中のデータの代表となるフィールドがあってしかるべきなのです。こういうのは、Accessの操作方法とは別に、「リレーショナルデータベースの基本知識」みたいなお話になりますね。。。主キーを設ける意味がよくわからないのなら、無理にオートナンバー型のフィールドなんか設けるんだったら、この場合はないほうがよいのではないかな、という感じで考えてくださいね。
本来は、主キーのないテーブル(主キーにすべきフィールドのないテーブル)自体、リレーショナルデータベースの世界では???なんです。データベースとかAccessとか、そういうことを考えずに、一枚の紙に一覧表みたいな形で本のリストを書き出して、本1冊1冊を識別するためにはどうしたらいいか???ってことから、考えていってくださいね。

とりあえず今回は・・・おなじタイトルの本があった場合に、なんかしら識別できるように、[番号]っていうフィールドを設けたような次第です。本についてるバーコードの番号とか入れてもいいかもしれないし、本を買ったときに背中に番号シールみたいなのを貼ったり、とにかく、実際の本と、テーブルの中の1レコードとが、誰が見てもちゃんと結びつくように、考えていきましょう。おんなじ本を3冊ぐらい所有している場合とかもありそうですもんね。本はおなじでも、固体は3つ存在します。3レコードないと、貸し出し状況の管理ができないですもんね。

あとは、[出版社]とか[著者]とか[購入日]とか[あらすじ]とか[しまってある棚の番号]とか、その本1冊に対してくっついてくるような情報が必要であれば、このテーブルの中に盛り込みます。

こんな感じにしておこうかな。
で、本のデータを入力しておきますかね。
まあ、適当に。。。

で、このテーブルを基にして、こんな感じのフォームを作ってみました。

まあ、ふつうの表形式のフォームなんですけど、あらすじとかははぶいといて、とりあえず本の一覧が出ればいいかな、と思います。
あと、本を新規登録するときの画面は他に作っとこうかな、と思うんで、フォームプロパティの「追加の許可」をいいえにしました。

もし、本の名前とかをうっかり書き換えちゃったりできないようにさせたい、ということでしたら、「貸し出し」以外の各テキストボックスの「使用可能/編集ロック」プロパティを変更すればよいでしょう。とりあえずカーソル入らなくなりますから、このフォーム上からはデータの書き換えができなくなりますからね。
誰かが「本を借りたい」といって持ってきたら、このフォームを開いて、その本の[貸し出し]のところをクリックしてチェックマークつければよいかな、と思います。あと、返しに来たら、[貸し出し]のチェックマークをはずせばよいですよね。まあ、このフォームは、貸したり返したりするとき専用ってことで、あまり欲張らず、シンプルに作った方がよいでしょう。


本を検索したいなら、ちょっとした仕組みを設けましょうかね。

このフォームは、本を借りたり返したりするとき専用なんで、必ず「借りたい本」が手元にあるはずだろう、と踏んで、本の番号でダイレクトに検索させる方法を作ってみました。これなら、フィルタで十分かな。コンボボックスで絞り込んだりするやり方とかは、他のコーナーでお話させてもらってますので、良かったら覗いていってください。

こんな感じかな。。。↑

ダイレクトに探し当てることができますよね。



「貸し出し中の本だけ一覧にしたい」なんて場合は、じゃあ、コマンドボタンを作りましょうか。

クリック時のイベントで、

[貸し出し]にチェックがついているものだけを出すようにすれば、

このボタンをクリックしたとき、貸し出し中の本だけ、一覧にして見ることができますね。



え?また全部表示させたい?
んじゃー、メニューバーの[レコード]の[フィルタ並べ替え解除]を選びましょう。

え?こんな操作かっこ悪い?
じゃーあ、同じくコマンドボタンを作って、クリック時のイベントで、フィルタを解除するような処理を作りますか。

と、これで、「どの本が貸し出し中か」がざっくりわかるようなフォームができました。
本の冊数が多くても、こんなふうに番号(主キー)でダイレクトに検索する場合なら、こんな感じのシンプルなフォームでもそこそこ使えるんじゃないかと思います。

つまり、番号(主キー)はダブってないですもんね。