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



漕げよマイケル データベース作成 3_4

■パート2、売上テーブルにも商品マスターにも、どっちにも「値段」というフィールドを設ける方法

そこでマイケルは、値段の変動履歴を残すのではなくて、売上のテーブルのほうに「そのときの単価」を残していくようにしようと考えました。「商品の値段」のフィールドを、商品マスターにも、売上テーブルにも、両方のテーブルに設けることになるので、リレーショナルデータベースの考え方としては「無駄」があるように思えるんですが、基になるデータが日々変動するような業務の場合、こういうデータ管理のほうが何かと楽かもしれません。
イメージとしてはこんな感じですね↓。

もちろん、値段変動のテーブルと併用してもいいかもしれません。
もし、値段の変動の履歴も残していかないとまずいのであれば、それはそれでやっとくといいでしょう。
ただ、「商品一覧」のテーブルのほうに「値段」のフィールドを持っておかないと、結局難しいやり方をしないとならなくなっちゃいますよね。なので、「売上テーブル」にも「商品マスター」にも「値段変動テーブル」にも、3箇所に「値段」というフィールドを設けることになりますね・・・。

今回は、商品マスターと売上のテーブル、双方に「値段」のフィールドを持たせるということで進めてみようと思います。

パート1の方の作業を進めてこられた方は、多分余計わかりにくくなっちゃうと思うんですが、とりあえず読み進めてみてください。
このコーナーは、業務の分析とデータベース全体のデザインを固めるための練習なので、細かい操作方法などはあんまりこだわらずに読んでいただければと思います。



商品マスターテーブルに、「値段」フィールド復活↓です。

さらに、「売上テーブル」側にも、↓値段のフィールドを設けます。マイケルはどっちも「通貨型」にしました。

売上のテーブルは、3月22日までデータを入力しちゃってあるんで余計わかりにくいかもしれないんですけど・・・。
とりあえずこの状態でテストしてみましょう。



で、とにかくがんばって、何かしらの方法を使って、売上の入力をするときに「商品マスタ」から「値段」をとってきて「売上テーブルの値段」に入れてやる仕組みを考えるってわけです。
これ、今までもいろんな方法お話してきましたよね。
このコーナーでお話した以外でも、いろんな方法が考えられると思います。

まさか、何も思い浮かばないという人はいないと思いますが・・・・お願いです・・・何か思い浮かべてください・・・。
まず、パート1で、いろいろややこしいコードを書いて「値段」をはじき出すようにした「商品登録」フォームを元に戻しましょう

「値段」テキストボックスを 非連結 から「値段」フィールドコントロールソースにするようにプロパティを変更します。
さらに、下のほうにちょこっと作った「サブフォーム」も取っ払い「商品名」テキストボックスや「値段」テキストボックスの「更新後処理」イベントに書き込んだコードの中から、「埋め込みオブジェクトに値を代入するコード」を削除します。
手を加えた箇所はこれくらいでしたかね。

次に、「売上入力フォーム」の方も、「値段変動テーブル」を導入する前の状態に戻します。

「商品番号(商品名)」コンボボックスの値集合ソースに「値段」フィールドを加えます。
   これは、何度かお話しているところですし、書くまでもないと思いますんで挑戦してみてください。ヒントは↓下の図です。
   3列目(Column(2))が「値段」になるようにしておいてくださいね。
   つまり、元通り、ってことなんですけどね。

さらに、「商品番号(商品名)」コンボボックスの「更新後処理」のイベントも、元に戻します。
とにかく、テキスト18というテキストボックス↓(値段を代入するテキストボックス)に値段が入るようにしてやればOK。

で、テキスト18のプロパティのコントロールソース欄に、「値段」フィールドを選択してやります。

つまり、

   ・コンボボックスから商品を選択
   ・コンボボックスの3列目(Column(2))は「商品マスタ」の「値段」フィールド
   ・コンボボックスの「更新後処理」イベントで、3列目をテキスト18に代入
   ・テキスト18のコントロールソースは「売上テーブル」の「値段」

で、結果的に、「この売上の入力をしている時点での値段」が、「売上テーブルの値段フィールド」に代入されるわけです。



この売上入力フォームから通常通り売上の入力をして・・・。

売上のテーブルを見てみますと・・・。

これから入力したものに関しては、「値段」フィールドに↑商品の値段が入ります。
要するに、マイケルの場合、商品の値上げが変動することをちゃんと見極め、さらに、マイケル自身がどれくらいデータベースを扱えるかを見極めて、最初から↑こういうふうに設計してこういうふうに作っていくべきだった・・・ということ、でしょうかね。

この見極めが、難しいんです。
業務分析をしっかりやって、(MS-Accessを使うなら)MS-Accessの機能や特性をしっかり理解して、効率よくデータベースを作っていくことはとても技術のいることです。結局のところ、現状の「業務」と「データベースの機能や特性」が結びつかないうちに作り始めてしまうから、思うようにいかない、わけがわからない・・・という状況に陥りやすく、結果、「MS-Accessって難しい、バグばっかり」という不満しか浮かばない・・・。こうなっては悲劇です。



さて、それでは・・・。
たとえば、月別の売上集計をするクエリを作るならば、

こんな感じにして↑、データシートビューにしてみれば・・・
ん???ああ、そうか・・・↓

今まで入力しておいた売上データは、みんな値段が入ってないですもんね。
これから入力した分に関してはちゃんと出ますから・・・。え?それじゃいやだって?
んもーいいじゃありませんかっこのコーナーの目的はデータベース全体の設計に関するお話なんですからっ



わかりましたよ・・・。
んじゃあ、このクエリはいったん閉じて、新規にクエリを作ってください。
基にするのは「売上テーブル」です。

マイケルは、3月12日に1度、値上げを行っています。

(値上げ前)・・・3月11日までの値段はこう↓

(値上げ後)・・・3月12日までの値段はこう↓

3月11日までは、クヌギは100円、12日からは、120円なのです。
いっぺんにぱぱっと修正できればいいんですが、もう商品マスターは書き換えてしまっているので、ここはひとつ、更新クエリを使って手作業で進めてみましょう。



まず、こんなふうな↓クエリにします。

    「売上日」の抽出条件に、2003/3/11以前、という条件を入力します。
    そして、商品番号に対する抽出条件として、 0001(クヌギの商品番号)を入れます。

これで、どういうデータの抽出ができます?
「売上日が2003/3/11以前の、クヌギの売上データ」ですよね。
データシートビューに切り替えてみると、こんな感じになりました。

これらのレコードの、空白の「値段」というところに「100円」という値段が入っていればよいわけですよね。
じゃ、デザインビューに戻りましょう。
そして、クエリの種類を「更新クエリ」に↓変更して、

「レコードの更新」欄に 100 とだけ↓入力します。

で、このクエリを「実行」↓します。ツールバーのびっくりマークボタンをクリック、で、「クエリの実行」と相成ります。

このメッセージに「はい」と応答すれば↓、「3/11以前のクヌギの売上データの値段フィールドが全部100」になります。

これを、商品全部に対して繰り返します。
次は、商品番号が 0002 で、3/11以前は 250円だったから・・・。

次に、3/12以降のデータに関しては、値上げ後の商品の値段になるようにします。
こちらは、現在の「商品マスター」に入力されている値段ですので、いっぺんにやる方法もありそうですが、まあ、ここまでコツコツやってきたので全部この方法でやっつけてしまいましょう。
まずクヌギは120円になったから・・・。

めんどくさい?
VBAでやればすぐできるんじゃないかって?
はーそうですね。ぜひそうしてください。
どうやるんですか?ですって?ふざけるな。


で、このクエリは、保存せずに閉じてしまいましょう。
残しておいてもいいんですが、先々繰り返し使う予定のないクエリをいつまでも残しておくと、「え?このクエリ何だっけ?」ということになってしまいますんで、残す必要のないものは保存しないほうがいいと思います。なんかやる都度クエリを残していると、クエリばっかり増えてわけのわからない状態になりがちですからね・・・。



おまけで・・・。
こういうクエリを作って、商品別の売上日報といいますか、日ごとの売上の集計をしてみようと↓思いました。

が、このクエリ、このままですと開くとき、

こんなエラーが↑出ます。
これはですね。
「売上テーブル」にも「商品マスター」にも、どっちにも「値段」のフィールドがあるので、どっちのことなの?というエラーなのです。
どっちのことでしょう?

どっちでもいいのかな・・・と思ってる人いませんよね・・・。大丈夫ですね?
こういう場合は、

売上金額: [数量]*[売上テーブル].[値段]

(半角のドットで区切って、テーブル名とフィールド名を両方入力)

こう↑書きます。
これで、この式の中で使おうとしている「値段」というフィールドが、「売上テーブルというテーブルのほうのフィールドである」というしるしになるんです。

このクエリを基にしてレポートでも作ってやれば、結構立派な「売上日報」とか作れそうですよ。
マイケル、これでいつ値上げしても値下げしても、売上の集計はばっちりだよ。



ここまでの状態を、zip形式に圧縮してご用意しました。
mcl_donguri3_2.zip
「なんかわけわかんないんだけど」とかいう場合は、少しは足しになるかもしれません・・・。