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



さて・・・ここまで、いかがでしょう。

こうした単純な仕組みをうまく活かせば、貸し出し状況を知るためのデータベース、いろいろな分野でつかえるんじゃないかと思います。
で、ここでまたいろいろと考えます。

ここまでの「仕事の最小単位」って、なんでしょうね。
これを読み取れるようになると、テーブル設計ってものすごく身近なものになりますよ。
まあ、もうあらかた作っちゃったんでわかりやすくなってますが、本1冊が、仕事の最小単位ですね。その本が、貸し出されてるかどうか、誰の手元にあるか、ということを、日々やり取りするわけです。だから、テーブルの中身も、本1冊分が1レコードになってますよね。
今度、「その本をいつ誰が借りたのか」という、いわゆる履歴を残していきたい場合は、どうすればよいか?ということを考えようと思うんですが、こうなると、仕事の最小単位はなんでしょう。

時間の流れがプラスされます。「1回の貸し出し」が、最小単位になり、これを1レコードとするテーブルを持たなければ履歴を残していくことはできないわけです。
したがって、[本マスター]だけでは、履歴を取ることはできませんよね。

じゃあ、「貸し出し1回分」を1レコードとするテーブルを作りましょう。
とりあえずこんな感じかな・・・。↓

まあ、無理に主キーとかつけなくてもいいかもしれないですが・・・。
たとえば、借りている人からなんか問い合わせとかあったとき・・・あと何日くらい借りててもいいのか、とか、返すのが1日遅れちゃうけど、とか・・・そういうとき、借りている人と担当者の間で、わかりやすい間違いのないやりとりをするために、「貸し出し番号」みたいなのがあった方がよさそうじゃありません?まあ、本の番号がわかればなんとかなりますけれど・・・。でも、その本って、入れ替わり立ち代りいろんな人が借りるんでしょうし、「12月22日に牛田さんが頭のよくなる本を借りた」っていうこと自体に、何か番号を振っておくのがよいのではないでしょうか。このテーブルの中で、「12月22日に牛田さんが頭のよくなる本を借りた」ということを、そんな長ったらしい文章にしなくてもぱしっと指差せるような、そんな番号を、主キーと呼ぶのです。
そんなのがないのであれば、オートナンバー型のフィールドでもいいかもしれません。が、自分で好きな番号を入力することはできませんし、番号を付け直すこともできません。内部的な処理番号であればオートナンバー型でもいいかもしれませんけれど、「12月22日に牛田さんが頭のよくなる本を借りた」ときに牛田さんに「貸し出し番号は4です。何かお問い合わせの際は4とおっしゃってください」という具合にご本人にお知らせするような番号としては、ふさわしくないです。とにかくばばばばっとナンバリングされるだけなので<オートナンバー




で、このテーブルを中心に、物事を考えます。

[本マスター]は、あくまでも、このテーブルの[本]というフィールドに本の名前か番号を入力する手間を省くための、補助情報的な扱いになります。[会員マスター]もそうですね。
こんな感じの↓フォームを作って、このフォームを通じて貸し出し/返却を行うようにします。

基本的に、借りるときは本そのものが手元にあるわけだし、借りる人もその場にいるわけですから、入力は「番号」で行うのがいいですね。本の名前を、一覧から検索して入力したり、借りる人の名前を検索したりする仕組みが必要な場合はいろいろやらなきゃいけないかもしれないですが、手元に本があって、目の前に本人がいるのなら、番号を直接指定した方が手間省けると思いません?
っていうか、こういうデータベースの場合は、そうした方がいいと思うな。




で、本の名前や、借りる人の名前などを確認したい場合は、じゃあ、Dlookupを使いますかね。また。
透明で非連結なテキストボックスをひとつ作って、[本]テキストボックスの更新後処理イベントで

で、本の番号を入力してEnterすると、本のタイトルが出てくる、って寸法です。

あ、まだ試さなくていいですよ。まだ中途半端ですから、「本」のとこだけ入力すると、なんかエラーになっちゃうかも。
「借りた人」に関しても、同じような仕組みを作っておくと、確認しながら入力することができますね。




後は、入力したものを取り消す、再入力するために内容をクリアする、っていう仕組みを、[入力しなおし]っていうボタンでやっちゃおうかなと思うんですが、これはですね。
これで、↓新規入力途中のレコードを取り消すことができます。



それから・・・「貸し出し番号」も、なんかしら自動的に番号付けちゃいましょうか。
ええと、もう、借りるって決めたときに番号振っちゃいますね。フォームの「挿入前処理」イベントで、

こうかな。↑

DMax関数、Format関数をうまく組み合わせて、「貸し出しテーブルの中の貸し出し番号の中で一番大きな数に、1を足して、桁をそろえるために000000000000とゼロを左側に入れて書式を整える」わけです。でも、貸し出しテーブルが空っぽの場合、つまり、最初の1件目の場合は、からっぽに1を足すわけにいかないので(コンピュータは空っぽとゼロは違うものと考えます)、貸し出しテーブルがゼロ件の場合を想定して、If文で処理を分けます。と、こういうのはみなさんもうお手の物ですよね。いちおう、おさらいってことで。

もし、日付とかをうまく貸し出し番号に反映させたい、という場合は、もう一工夫しないといけないですね。
「貸し出しテーブルの中で一番大きな貸し出し番号」っていうのを、うまく拾うために、いろいろ考えないとならないです。

たとえば、3月1日に借りたのなら、

20010301 と 00000001 を組み合わせて、2001030100000001という貸し出し番号にしたい、なんてときは、貸し出し番号のうちの右から8桁分が、自動的に増えていく部分、左側が今日の日付から作成される部分、っていうことになりますよね。

日付の部分は、ハイフンとかスラッシュいらないのなら、Format(Date(),”yyyymmdd”)でイケますが、なんかやたら長ったらしい処理になっちゃいそうなんで、Format(Date(),”yyyymmdd”)を一時的に変数に入れて↓すっきりわかりやすく作ってみましょう。

これで、↑この3行目を通過するとき、hidukeという名前の変数に、今日の日付がハイフンなしで連なって文字として入ってきます。

Private Sub Form_BeforeInsert(Cancel As Integer)
Dim hiduke As String
hiduke = Format(Date, "yyyymmdd")

If DCount("貸し出し番号", "貸し出しテーブル", "left(貸し出し番号,8)='" & hiduke & "'") = 0 Then
  Me!貸し出し番号 = hiduke & "00000001"
Else
  Me!貸し出し番号 = hiduke & Format(DMax("right(貸し出し番号,8)", "貸し出しテーブル", "left(貸し出し番号,8)='" & hiduke & "'") + 1, "00000000")
End If
End Sub

こんな感じかな。。。↑
フィールドの中の貸し出し番号と、直接比較することが難しいので、Left関数、Right関数を使って、比較させたい部分だけ取り出したりしています。
なので、貸し出しテーブルの件数が多くなってくると、だんだん処理が遅くなってくるかもしれませんね。

ためしに、貸し出しテーブルに26545件、テストデータを作って試してみました。え?暇人?・・・ええそうですとも、ええ。
うーん、本の番号を入力するとき、一瞬「う?」ってなってワンテンポあってから、貸し出し番号がつきますね。0.1秒とかそんなもんだと思いますが・・・。
わたしはそんなに気にならなかったです。4〜5万件くらいだったら、たいして遅くはならないんじゃないかなぁ。

ああ、でも、お使いになってるパソコンのパワーによっては、もうちょっと時間がかかる場合もあるかも。
まあ、検索とかじゃないんで、新しく貸し出しをするときだけのことですんで、あまり目くじら立てることはないかもしれないですが・・・。
将来的に、めっちゃくちゃデータ量が多くなりそうな場合は、もうちょっと工夫した方がいいかもしれないですね。

まあ、今日はこのままやろっと。




こういうシステムを作るとき、常に意識しなくちゃいけないことは、データはどこにたまるのか、ということです。
フォームにたまるわけじゃないですよね。データはテーブルにたまります。だから、たとえフォームから操作をしていたとしても、テーブルの中のデータを操作している、ということを忘れてはなりません。フォームにしてもレポートにしても、テーブルの中のデータを映し出す「枠」に過ぎないのです。これを常に頭に置いておかないと、いろいろ難しいんじゃないかと思うんですね。

では、返却時のことを考えますかね。
こんな感じのクエリを作っておきましょう。↓

[返却]がFalseになっているもの(チェックがついてないもの)だけを選ぶようにします。

こんな感じの結果を得ることができます。↓いまんとこデータ少ないですからいまいちピンとこないかもしれませんが・・・。
要するに、今貸し出し中の本の一覧になるわけですね。↓

で、このクエリを基にした表形式のフォームを作っときます。↓そのまんま、表形式のフォームにして、フォームプロパティの「追加の許可」だけいいえにしました。
本を返しに来た人がいたら、このフォームを開いて、該当するレコードの[返却]チェックボックスをクリックしてチェックつければ、それで「返却した」という印になり、次にこのフォーム開いたときはそのレコードは出てきません。チェックついたレコードは出しませんもんね。




で、上で作ったクエリと、[本マスター]を利用して、「貸し出し可能な本の一覧」なんかも作ることができそうです。

こんな風に、↑テーブルとクエリをふたつ並べたクエリを作って・・・。
[本マスター]と[Q_返却リスト]の間の結合線をダブルクリックし、「本マスターの全件と、対応するQ_返却リストのレコードだけを出す」っていう結合方法に変更します。
そうするとですね・・・。

マスターに登録されている本はすべて表示されます。んでもって、貸し出し中の本に関しては[会員名][貸出日]に何かしら出てくることになります。
で、もう一工夫・・・。↓会員名か貸出日、どちらでもよいので、どちらかの抽出条件欄に Is Null と書きます。

と、会員名がNull(値がない)のレコードだけ出します。つまり、貸し出されてない本の一覧が出来上がるわけです。