<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--リレーションシップ序章
  1 → 2



今日はひとつ、「ふたつのテーブルの結びつき」ということについてお話をしようと思います。
唐突ですが、「交通費の精算入力フォーム」を作ります。作るんですっ

ええと、まず、誰がいつどこに行ったのかずーっと記録するテーブル・・・。
こんな感じのテーブルをこしらえます。
で、保存をしてテーブルに名前を付けて・・・。

ええと、「交通費精算テーブル」って名前にしますね。
ワレながらわかりやすい名前だ。で、OKボタンをクリックすると・・・。

なにをー???
主キーってなに?なにそれ。主キーなんかいらないよ。なんかわかんないけどEnterキー押しちゃえ。

・・・なんか、IDっていうフィールドが勝手にできた。
まあいいか。よくわかんないけど。
これでオッケー。とじまーす。

で、後は・・・。
よく行くところなんて大体決まってるし、いちいち料金調べるのめんどくさいから、よく行くとこのリストを作っておこうかなって思うんですよ。いいアイディアでしょ。

・・・これも、保存するときなんか主キーがうんたらって聞いてきました。
なんかわかんないけどEnterキーを押しました。
そしたらIDっていうフィールドができた。まあいいか。わかんないし。

このテーブルは、データシートビューに切り替えて(画面の左上のツールボタン)、なんか適当によく行くとこの地名とか入力しときました。

え?やる気ないだろうって?
・・・そ、そんなことありませんよっ。やる気ばっちりですって。
ちゃんと入力できますよね。
オートナンバー型って、入力しなくても次々番号がでてくるんですね。らくちんらくちん。


これでテーブルが整いました。
後はですねぇ。えー、行き先テーブルから自動的にぱーっと「金額」が出るようにしたいんですよ。
え?いつって、そりゃ「交通費の精算の入力してるときに決まってるじゃないですか!」

んで、このふたつのテーブルをくっつけて、「行き先テーブル」の「行き先」を指定したら、「金額」も出てくるようにクエリーを作っちゃおうと思うんです。
だって、「行き先」同士でくっつくはずでしょ。

クエリ、新しく作りましょう。
んでもって、テーブルをふたつ「追加」して、「テーブルの表示」ウィンドウだけ閉じます。

と、あれ?
なんか、自動的に「ID」ってフィールドがつながっちゃいましたけど・・・なんで?

つながって欲しいのは、いちおう「行き先」なんですけど・・・。
そうですよね。「交通費精算テーブル」の「行き先」は「行き先テーブル」の「行き先」ですよね。えーと・・・。

じゃ、この「ID」と「ID」を結ぶ結合線、クリックしてください。
クリックすると、ちょっとだけ線が太くなると思うんですけど・・・

んで、Deleteキーを押すと、消えちゃいます。
消しちゃいましょう。
んでもって改めて、片方の「行き先」からもう片方の「行き先」まで、ドラッグして引っ張ります。
そうすると、「行き先」と「行き先」の間に線が出るはずです。

これでクエリー完成。なんか適当な名前付けて保存しましょう。
で、このクエリーをもとにフォームを作れば一丁上がりってわけです。



フォームも、ウィザードかなんか使って適当に作っちゃいましょう。
今さっき作ったクエリーを選択してくださいね。

・・・・あ、あり???
なんで?何にもでない・・・。
下の、レコード移動ボタンも、一個もクリックできない状態になってます。

なんでー????

状況は違うかもしれませんが・・・こんな経験、ありません?
複数のテーブルを結びつけてクエリを作って、それをもとにフォームを作ったら、1件も出ない、追加入力ができない、数字変更することができない、削除できない、チェックボックスとかクリックしてもエラーが出る・・・。

フォームが悪いのではありません。もとになっているクエリに問題があります。
正確には、クエリが基にしているテーブルの構造、ですね。




じゃ、こののっぺらフォームは適当に保存して閉じて・・・。
改めて、さっき作ったクエリーを開いてみましょう。
ダブルクリックすれば、このクエリを開く操作になります。
つまり「データシートビュー」の状態になるんですね。

こんな感じになりません?
まあ、まだ「交通費精算テーブル」に1件も入力してないので、1件もないのはわかりますが・・・。
データシートビューの状態で、レコード移動ボタンの「新規」ボタンがクリックできない状態になっているのは、このクエリが更新を許さないクエリだからなんです。



なんで「更新を許さない」のでしょう。なにもやってないのに・・・。

クエリとは、テーブルとほとんど同じ感覚で利用することができます。が、所詮はクエリです。クエリを通じて入力/更新/削除されたデータは、クエリに保存されるのではなくて、結局基になっているテーブルたちの中に反映されるわけです。
ひとつのテーブルを使って作っているクエリなら全く問題ないですけど、複数のテーブルを結びつけて作ったクエリだと、その結びつき方によっては「このレコードを更新してしまってよいのかしら???」と、Accessが疑問に思うことがあるのです。

いちおう、このふたつのテーブルは、「行き先」というフィールド同士で結びつくようにしています。
「行き先テーブル」の方を見てください。
「行き先」のフィールドは、このテーブルの構造上、絶対ダブらないはずですよね。同じものを2回入力しちゃうようなことはやらかしちゃうかもしれませんが、それはあってはならないことで、本来なら、「行き先の一覧表」なわけですから、「東京-大阪」が2件あってはおかしいのです。
「東京-大阪」が150000000円の場合と2100000000円の場合がある、というなら、このテーブルへの入力も「東京-大阪A」「東京-大阪B」とかにしとかないと、一覧にしてる意味、ないと思いません?
結局人間が「どっちだっけ」と調べないとならなくなっちゃうじゃないですか。
つまり、データベースがどうとかAccessがどうとかいうことを抜きにして、ノートに書いた表とか紙に書いたメモとかのレベルで考えたとしても、「行き先」の同姓同名が存在することはありえない、と考えるべきでしょう???そうですよね。

Accessもそう考えるわけです。
「行き先テーブル」と他のテーブルを「行き先」というフィールドで結びつける以上、「行き先テーブル」に同姓同名の「行き先」が何度も入力されちゃ、どう結びつけてよいかわからなくなっちゃいますよね。
だって・・・もし、「交通費精算テーブル」の方に「東京-大阪」って入力されたとして、じゃあ、値段はいくらかなーと思って「行き先テーブル」を見たら、1行目と8行目と27行目に「東京-大阪」って入力されてたとしたら・・・。一体、どれのことか、わかんないじゃないですか。。。

Accessはそういうことを心配するのです。

いくらみなさんが「間違えて2回入力したりしないから、ぜったいダブらないから」って念を押しても、Accessには通じません。
間違いがあってはいけません。皆さんからお預かりした大切なデータです。頑なに守ります。

今の、上の状態は、まさにその状態。今のこの状態では、「行き先」がダブって登録される可能性があるので、この結合の状態では入力/更新/削除を許さないのです。それで、レコード移動ボタンがクリックできなくなってるんです・・・。

では、どうしてAccessは、信用してくれないのでしょう。
どうすれば、信用してもらえるのでしょう。

絶対に「同じ行き先を行き先テーブルに2回以上入力しない」っていう保証があればいいんです。
どう保証します???

「行き先テーブル」に主キーをつければいいのです。
「行き先」もしくはそれに対応するフィールドを設けて、それを主キーにすればいいのです。

主キーって、同じもの2回以上入力できないですよね。
テーブルに主キーが設定されていて、それを使って他のテーブルと結合するのであれば、Accessは理解してくれます。

主キーって、そういう意味でつけるんですよ。少なくとも、こういう場合は・・・。
テーブルの中にあればいいってもんじゃないんです。

主キーはダブって入力できない、んじゃなくて、ダブって入力されることを許さないフィールドを主キーにすんです。




ほんとは、ちゃんと意味のある番号を付けたほうがいいのかもしれないんですけど・・・。
まあ、オートナンバー型のフィールドでもなんとかなりそうですよね。

「行き先テーブル」の「ID」を、「行き先コード」というフィールド名に変更してわかりやすくしてから、主キーにしましょう。
主キーにするには・・・画面上のほうのツールボタンですよね。
このへん方法については基本操作のコースでおさらいしておいて下さいね。

自分で好きな番号を振りたい、となると、オートナンバー型は入力できないので、Accessにお任せでいいや、という場合だけ・・・ですけど・・・。
「行き先」を主キーにしてもいいんですけど、何となく気分的に、何桁何文字入力されるかわかんない日本語漢字かな混じりのフィールドより、数字のフィールドの方がしっくりくるような気がしません?
Accessもきっとこの方が楽だと思うな・・・。

で、このままだと・・・「交通費精算テーブル」の方とつりあいがとれなくなっちゃうんで・・・。
Accessはデータベースソフトですんで、「データ型」ってきちんとしないとなりません。さっきまで「行き先」で結びつけるようにしてて、これはテキスト型だったですけど、これから「行き先コード」を使って結び付けます(これからそれ、やります)。
なので・・・「交通費精算テーブル」の「行き先」フィールドと「行き先テーブル」の「行き先コード」のデータ型をそろえておかないとなりません。

具体的には・・・。
「オートナンバー型」というのは、ぶっちゃけた話「数値型」です。
なので、「数値型」にします。