<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002 なりきりデータベース設計
  1 2 



漕げよマイケル データベース作成 4_1

ところでマイケル、今、倉庫にはどれくらい在庫があるの?

わかんないの?
おいおい、そんなんで、急に大量の注文があったりしたらどうするのよ。
在庫を随時把握できるようにしておかなくちゃまずいんじゃない?



じゃあ、在庫を把握できるような仕組みをちょっと考えようかね。
前にお話をしたとおりで、基本的な「在庫」の概念は、「一番最初の在庫数」+「今までの仕入数」−「今までの売上数」です。
足し算と引き算で出すことを考えます。
もちろん、これだけでは出せない場合もあると思いますけれども、基本は、足し算と引き算です。
リレーショナルデータベースの基本は、「計算して出せるものは計算して出す。むやみにフィールドを設けない」です。
まず基本に沿いつつ考え、業務に照らし合わせてみて、合わないところを見出して行く・・・これが、データベース設計のポイントですからね。


マイケルは今のところ、「今日の仕入数」をぜんぜん記録していなかったので、まずこの情報を日々きちんと記録することにしました。
こういうテーブルを作って、毎日何をいくつ仕入れたか、書き込むようにしました。

同じ商品を一日に何度も仕入れる可能性もあるので、このテーブルには特に主キーを設けませんでした。
で、とりあえず、1日分の「仕入状況」を入力してみました。
データシートビューで入力を済ませてもよし、フォームを作って入力しやすくなるような仕組みを作ってもよし、です。

で、ここに入力された情報を「商品別に集計するクエリ」を作ります。

こんな感じ↑かな。

結果は↓こうなりますね。

次に、売上のほうを・・・。
テーブルにあんまりいっぱいデータが入ってるとわかりにくいんで、とりあえず1日分のデータだけ入っている状態にしました。

同じように、このテーブルから、「商品ごとの売上数集計」をするクエリを作ります。
前に似たようなの作ったことがありますが、あれはグラフ用のクエリなので、別に作ってください。

こんな感じかな↑

そして、商品マスターの中に、お店をオープンする前、一番最初に倉庫に入れた数を記しておくフィールドを設けて、数を入力しておきます。


で、上記のふたつのクエリと商品マスターをくっつけるクエリを作ります。
多分、「商品番号」というフィールド名がそろってれば自動的にうまい具合にくっついてくれると思います。
結合線は、「商品マスター」を中心に伸びるようになると思います。商品マスターの「商品番号」は主キーになってるからね。


  [商品マスター]の商品番号 (一) −−−−−−−−− (多) [Q_商品別売上数集計]の商品番号

  [商品マスター]の商品番号 (一) −−−−−−−−− (多) [Q_商品別仕入数集計]


ですよね。
各テーブル同士の結びつき方(リレーション)のあり方を、しっかり見ておいてくださいよ。
気をつけなくちゃいけないことは「リレーション」という言葉にとらわれないこと。リレーションという言葉は「結果」です。実際には、マイケルの店の商品と、売上と、仕入状況にどういう関係があるか・・・ということをちゃんと把握できてること、ですからね。その結果、テーブル同士の関係を見渡してみると、一対多というリレーションが浮かび上がってくるわけです。
リレーションをやるために、テーブル同士を結びつけるんじゃありませんよ。本末転倒になっちゃいますからね。


こんなふうに、とりあえず↓いりそうなフィールドを選んで・・・

右端の開いているグリッドに計算式を入力します。
たとえば、

こんな感じの式を作ります。



このクエリをデータシートビューにしてみると・・・。

あれ?
商品は今、7種類登録していて、仕入もやってるのに、6種類しか出てこないぞ・・。



テーブル同士の結び付け方によって、こうなるんです。
仕入は、7種類の商品全部やってるんですけど、0007のパイナップルだけ、2月5日には一個も売れてないんですよね。
つまり、[売上]のテーブルに、パイナップルのデータは1件もない・・・パイナップルの商品番号である0007という番号は、1つもない、ということになります。一対多の「多」が、「多」どころではなくて、「ゼロ」なわけです。

だから当然のことながら、[Q_商品別売上数集計]クエリの結果を見ると、0001から0006までの商品だけ集計されて、0007に関する行は存在してないと思います。1回も売れてないですから、集計結果もナジです。

クエリで、ただ単にふたつのテーブルを結び付けただけだと、「単純結合」と言って(データベースによっては違う呼び方をする場合もありますが)、「両方のテーブル(またはクエリ)に存在するレコードだけ」を表示します。つまり、[Q_商品別仕入数集計]が7種類分の商品のデータを出していても、[Q_商品別売上数集計]が6種類分のデータしか出さない限りは、この日売上がない商品のデータは出てこないわけです。


これを避けるためには・・・結合方法を変える必要があります。
「商品マスターに登録されている商品すべてと、それに対応する[Q_商品別売上数集計]の商品のデータ」という結び付け方に変更してみましょう。
結合線をダブルクリックします。

結合の仕方を指定する画面が出てくるので、「商品マスターの全レコードと・・・」というやつを選びます。

もう一方の結合線も同じように設定します。
そうすると、結合線の先に矢印がつきましたですね。

こうすることで、[Q_商品別売上数集計]にない商品(つまり一回も売り上げていない商品)があっても、とりあえずその商品の名前など(商品マスター側から選んだフィールド)については、結果が表示されるようになります。