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



後は・・・「返却日」をお知らせしたい、知っておきたい、という場合のお話ですが、たとえば貸し出し期間が10日間と決まっていて、返却日を過ぎてもまだ返却されてない本の一覧とか見たい場合はどうしたらいいでしょう。今は、ただ返却されたかどうか、しか、わかんないですよね。YesNo型のフィールドがいっこあるだけだし。

テーブルの中のレコード、全部削除して、新たな気持ちでテストしましょう。
あ、別に残っててもいいんですけど、わかりにくいんじゃないかなって思うんで・・・。実はね、フィールドのデータ型を変更しようと思うんですよ。

[返却]フィールドを、日付時刻型に変更します。フィールド名も、[返却日]ってわかりやすく変えてみました。
既に何件か入力している状態でこういうことすると、今までYESNo形式だったのに(内部的には0か-1でしたよね)、それを無理やり日付時刻型に変更すると、0:00:00とかわけのわかんない値になっちゃいます。ほんとは、途中からデータ型かえるようなことはしない方がいいんですけど、その辺承知しながらであれば、問題は起らないと思います。

まあ、その辺は適当にやりましょう。何事も「チャレンジ」ですもんね。

さて、で、返却日なんですけど・・・。借りるときに、「何月何日までに返してください」って口頭で伝える必要があるなら、貸し出し時にどこかに表示させたいですよね。
本によって貸し出しの期間が異なったりすると結構難しいんですけど・・・今日はとりあえず一律10日間として、しかも休日祝日もひっくるめた単純計算でいこうかなと思います。祝祭日含めたやり方なんかは、また機会がありましたらお話しようと思いますんで・・・。

こりゃもう、非連結のテキストボックス作って、コントロールソース欄で10足せばいいですね。貸出日に。
貸出日がなんか入力されたら、返却予定日も表示される、っていう感じでいこうと思います。

こんな感じになりました。
まあ、あとは、[入力完了]ボタンをクリックしたらフォームを閉じるようなイベントを作って、右上の×ボタンとかを隠しちゃう(フォームの書式プロパティで「コントロールボックス」を隠せばよいと思います)と、なんかそれっぽい入力画面になるんじゃないかなーと思います。この辺はお好みで調節してください。フォームのプロパティをいろいろ研究すると、いろんな工夫ができますよ。研究してみてくださいね。


さてさてそしたら、返却リストの方も、手を加えないといけません。[貸し出しテーブル]のデザインを変更しましたからね。

[返却日]は、YesNo型のフィールドじゃないので、「返却日がNull(値なし、未入力)だったら、まだ返却されてない」っていうふうに考えようと思います。
ついでに、[返却予定日]を、フォームと同じ計算方法で出しておきましょう。クエリで計算式作るやり方、オッケ-ですよね。

クエリを変更したら、フォームの方も整えてあげてくださいね。
本を返しに来た人がいたら、このフォームを開いて、返却日を入力します。つまり、今日の日付、ってことかな。




さてさて、もしも、もしももしも、一度に何冊も本を借りることができる、としたら???
仕事の単位がまた更に細かくなるわけですね。

でも、例えば、本5冊借りたら、5冊まとめて返さないとダメ、っていうルールであっても、「どの本が貸し出し中か」ってことを把握したいのであれば、仕事の最小単位は「そのとき借りた本1冊」です。なので、これを1レコードとするテーブルを用意しないといけません。

こういう小さなテーブルを設けます。[貸し出しテーブル]とくっつけて使いたいので・・・いちおう、「このフィールドの中の値を見てもらえれば、ダブったりせず各レコードの識別ができます」っていうフィールドを、[貸し出しテーブル]とくっつけないといけませんよね。[貸し出しテーブル]1件に対し、[貸し出し本テーブル]には1〜∞のレコードが入る可能性があるわけです。

こういう場合、[貸し出しテーブル]の[貸し出し番号]と、[貸し出し本テーブル]の[貸し出し番号]がくっつくイメージになるんですが、[貸し出し本テーブル]の中で、[貸し出し番号]が同じものが例えば3件あったとしたら、そのとき3冊本を借りた、ってことになるんですよね。なので、その3冊の本ひとつひとつを、このテーブルの中できちんと識別できるようにしておくのがポイントです。
ほんとは、「行番号」とか「枝番」みたいなフィールドがあるべきなんだと思うんですが面倒くさいので・・・このフィールドは一切表に出さない、っていうことで、オートナンバー型で間に合わせちゃおうかなと思います。

で、[貸し出しテーブル]の方には、本の情報は持たせないようにします。削除してもよいし、なんかコメント入れといて使わないようにしてもオッケー。

残しといても、「えっ、このフィールド、何のために作ったんだっけ???」なんて、後で、忘れちゃって混乱しちゃわなければ、問題ないと思います。
混乱しそうでしたら、忘れないうちに取っ払っておいたほうがいいかもしれないけど・・・。




では、こいつを使って、貸し出す本を入力できるようなフォームに作り変えましょう。
ええと・・・そうだな。番号を入れたら本の名前が出てくるようなクエリを作っときましょうか。こんな感じで・・・。

このクエリをもとにして、表形式のフォームを作っておきます。カンタンなのでいいですよ。あとで手直ししますので。

で、こいつをサブフォームとして、貸し出しフォームに埋め込みます。
手っ取り早い方法としては、下のようにデータベースウィンドウからドラッグしちゃいます。

で、サブフォーム部分ができたら、大きさや位置を調節してください。

一点だけ、確認してくださいね。
サブフォーム部分のデータプロパティの「リンク子フィールド」「リンク親フィールド」が、[貸し出し番号]になってればオッケー。フィールド名を気をつけてつけてれば、Accessがうまいことやってくれるはずです。

これで、メインとなるフォームの方で、次の貸し出し番号のデータを表示したら、それに伴ってサブフォームの方も次の貸し出し番号のデータを表示してくれるはずです。
この部分が確認できたら、サブフォーム内の[貸し出し番号]と[番号](オートナンバー型のやつ)は、どっちもテキストボックスを削除してしまってオッケーです。

あとは・・・サブフォーム部分のデザインを少し工夫すれば、そこそこみやすい画面になるんじゃないかな・・・。




返却リストの方も、調節しないといけないですね。忘れるトコだった。

テーブルの結びつきがちょっとばかり複雑になりますが、慎重に結びつけてあげてくださいね。

と、こんな感じで・・・。
3冊借りていったのに、そのうちの2冊だけ返却に来て、あと1冊は後で持ってくる、なんていう人がいても、これなら1冊ずつ管理できますよね。貸し出している本1冊が、仕事の最小単位となるところ、理解を深めていってくださいね。

ちょっとわかりにくいかもしれませんが・・・。
最終的には、テーブルの構造をしっかりと把握しておきましょう。
この場合、[貸し出しテーブル]と[貸し出し本テーブル]の中のレコードが、どういうつながりを持つか、が、とっても大切なポイントになります。

「リレーションシップオブジェクト」とか「テーブルの正規化」とかいう機能を使うのは、この辺をしっかり理解できてから、ですよ。
リレーションというのは、テーブル同士のつながりや関係のことを言います。機能だけ一人歩きしてしまわないよう、何のために、どうして必要なのか、を、まずは理解してしまいましょう。この例でもそうですけれど、皆さんの頭の中で、テーブル同士の結びつき方がしっかり組まれていれば、リレーションシップオブジェクトなんて作らなくても、こんな感じの仕組みを作ることはできるんです。

やたらめったらリレーションとか設定して、返ってわけわかんなくなっちゃった、なんていったら、本末転倒ですよ。
リレーションというのは、本来、コンピュータでデータを効率よく管理するための考え方のひとつなんです。この理論に基づいてテーブル設計していけば、コンピュータにとって効率のよいデータベースが出来上がるって寸法なんですよ。逆になっちゃわないように理解をしていってくださいね。



(オシマイ)