<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>MS-Accessを使いこなすために・・
  (←別ウィンドウでサブメニュー)



4.複数のテーブルからなるクエリ

では次に何をやるかというと・・・。
いちおう、第一目標地点はまず、

  「毎日の労働時間を入力するフォーム」
  「社員ごとに今月どれくらい働いているか見るフォーム」

のふたつを作ろうと思うんです。どっちも基本となるテーブルは「労働テーブル」です。
このふたつは、もしかしたらひとつでもいいのかもわかりませんが・・・。とりあえず「入力」と「参照」の二つに分けて考えてみようと思います。いろいろ工夫しながらやってみましょう。



まずは入力画面のほうを・・・
「労働テーブル」だけを使ってこんなふうにしてもいいのかも分からないですが、「社員番号」だけじゃなくて「社員名」も出るようにしたいという場合は、「社員テーブル」とくっつけましょう。
複数のテーブルをくっつけるのはクエリの仕事です。

じゃ、クエリを新規に作成しましょう。デザインビューっていう方法で作ります。

次に出てくるこの画面で、テーブルをふたつ選ぶ感じになります。

慣れないと分かりにくいんですが・・・まず「労働テーブル」をクリックして「追加」ボタンをクリックしましょう。これで、「労働テーブル」が選択できましたよね。
次に続けて「社員テーブル」をクリックしてから「追加」ボタンをクリックします。
(社員テーブルから選んでもいいです。どっちが先でも)
そうすると、ふたつテーブルを選んだことになります。
何回も追加ボタンをクリックしちゃうといっぱいダブっちゃいますからね。気をつけてくださいよ。
追加できたら、テーブルの表示のウィンドウだけ閉じます。
閉じるっていうボタンがあるからそれ押せばいいですよね。



そうすると、こんなふうになると思います。
二つのテーブルの間に線が出てませんか?

お互いのテーブルに正しく主キーが設定されていて、フィールド名前をそろえてれば、こんなふうに線が出ると思います。
太字で表示されてるのが、主キーですね。「社員ひとりに対して、労働日が何日分か入力されるのね、一対多だわね」と、MS-Accessがちゃんとわかってくれたという証拠です。
この線のことを「結合線」と呼んだりします。これで、社員番号が同じものどうし横に並べてくれるので、ふたつのテーブルをあたかもひとつのテーブルのように扱うことができるわけなんです。
この線のことを「結合線」と呼んだりします。
これで、社員番号が同じものどうし横に並べてくれるので、ふたつのテーブルをあたかもひとつのテーブルのように扱うことができるわけなんです。



じゃあ、こんなふうにフィールドを選んでみましょうか。

こういう結びつきの場合、「社員番号」って両方のテーブルにありますけれど、どっちのテーブルから選んだらいいのかな・・・。
まあ、例外は多々あると思いますが、「中心となるテーブル」の方から選ぶようにするとよいでしょう。
今回このクエリは、「労働時間の入力をするためのフォーム」用に作ってるので、このクエリでリーダーシップを取るのは「労働テーブル」ですよね。「社員テーブル」は名前を参照したいがためだけにくっつけてる添え物です。なので、社員番号は「労働テーブル」から選ぶようにしたほうがいいでしょう。
できましたですか?
レコードの並び順は・・・社員番号順に並べて、その中でさらに日付順に並ぶようにしましょうか。
どっちも昇順でオッケーです。
もうひとつ、大切なことをお話します。



もし、仮に、「社員テーブル」に登録漏れがあった場合・・・。たとえば、01002という社員番号の登録をし忘れたか間違えたかで、「社員テーブル」に01002が存在しない場合・・・。

たとえ、労働テーブルの中に01002の人のデータがあったとしても、

今回作ったこのクエリだと、

結果はこうなります↑


01002の人の労働時間は出てこなくなってしまいます。
そう・・・「両方のテーブルに存在している社員番号だけ、出す」ようになるんです。確かに社員テーブルに登録し忘れた人が悪いんですけれど、でも、入力するのは人間の仕事だし、うっかり忘れとかもありえますよね。
でも基本は「社員テーブルのような、他のテーブルが参照するために用意しているテーブルの入力し忘れはタブー」です。それでも忘れちゃったりしたときのために、「かたっぽのテーブルに該当レコードがなくても、とりあえず出す」ように、結合の仕方を工夫しておくのです。



結合線をダブルクリックしてみてください。

二つのテーブルの「結合の状態」をあらわす画面が出てきます。

通常は「単純結合」という結合方法になります。「1:両方のテーブルの結合フィールドが同じ行だけを含める」っていうところに黒丸がついてますよね。これをデータベース一般用語で「単純結合」って呼びます。
「両方のテーブルに存在している社員番号だけ、出す」っていう、それですね。

これを「3:労働テーブルの全レコードと社員テーブルの同じ結合フィールドのレコードだけ含める」というやつにしましょう。こういうのを「左結合」または「右結合」と呼んでいます。左、右とは、デザインビュー上の位置のことです。今は多分、左側に労働テーブルを選んでいると思いますんで、今回は左結合ということになります。
だいたい一般的に、「基準となるテーブルを左側に」置くのがふつうです。どっちでもいいんですけれど、左側に置くようにしておけば、「左結合」にすればいいわけで、あれこれ考えなくても間違えるようなことはなさそうですから・・・。常に左側に頻繁にレコードが入力されてくるテーブル、右側に名前とかを参照するために設けた台帳みたいなテーブルを置くようにしておけば、何かと分かりやすいと思いますよ。

たまに、「なんかあるごとに頻繁にレコードが入力されてくるテーブル」のことを「トランザクションテーブル」、「名前とかを参照するために設けた台帳みたいなテーブル」のことを「マスターテーブル」なんて呼んだりします。
別に特別なテーブルというわけじゃなくてどっちも普通のテーブルなんですけど、まあ、役割というか、入ってくるデータの様子によってこんな呼びわけをしたりします。

設定できたら、OKボタンをクリックして戻りましょう。
OKボタンをクリックすると、「労働テーブル」から「社員テーブル」に向かって矢印が出るようになりましたね。



ちょっとだけテスト・・・クエリをデータシートビューに切り替えてみましょう。左上のツールボタンですよね。

で、1行入力してみましょう。一番下の空行のところに「社員テーブル」に登録してある社員の社員番号を何かひとつ入力してEnterキーを押してみてください。

すると・・・。

社員の名前が自動的に出てきます?出てくればOK。
二つのテーブルはきちんと結びついてますね。
この時点で、インデックスがどうのとか何かしらエラーが出るとか、そもそも入力できる状態になってないとかいう場合は、テーブルの主キーの設定か、クエリの中でのテーブル同士の結びつきがどこかしらおかしいことになります。もう一度振り返ってひとつひとつ確認してみてくださいね。

もう一点確認しましょう。また、入力途中の行は、左端にエンピツマークが出てますね。
出ているうちは、入力途中のこのレコードを取り消すことができましたよね。
Escキーを押せば、なくなると思います。これは、テーブルもクエリもフォーム上でも同じことです。
フォームだとレコードセレクタを非表示にする場合もありますからちょっと分かりにくいですけれどね。
ここで1行登録してもいいんですけれど、ついでですんで「エンピツマークが出てるときは取り消せる」っていう動作、再確認しておいてください。多分、こういう操作は、あちこちでいろいろ今後かかわりが出てくると思いますんで・・・。


んではとりあえずこのクエリ、名前を付けて保存をしてください。
名前は何でもいいですよ。わたしは「Q_労働時間入力」にしました。まあなんかわかりやすい名前をつけてください。