なんか、昔書こうと思ったネタ。
ただ、そのとき、目次を書いていたかもしれないけど、その目次とは違ってしまうかも知れないですが、ご了承くださいませ。手法は、まったく同じです。
なお、書く必要はないと思いますが、Accessとは、マイクロソフトのAccessのことで、NetFrontを出している会社のAccessとは、何一つ関係ございません。念のため。
■■ 前提条件
Accessが使えること(フォーム、レポート、テーブルが作成できる)
AccessのVBAが書けること
正規化の知識はあってもなくてもOK!
■■ Accessでの一般の開発
まずは、一般的なAccessの開発。
以下の「定期券の作成」を例に説明します。
<<例:定期券の作成>>
定期券を印刷する。項目は以下のとおり
定期券番号
種別(通勤、通学)
期間(1,3,6)
出発駅
到着駅
経由
開始日
終了日
金額
年齢
性別
発効日
名前
発行駅
●通常の方法
1.AccessはRDBなので正規化する
駅テーブル
経由テーブル
顧客テーブル
定期券テーブル
に分かれる(なお、この条件だけでは正規化の対象から外れるが、期間テーブルと、種別テーブルも作成可能。さすがに、性別テーブルを作るやつはいないと思うけど)
2.そのテーブルをJOINするためのビューを作る(定期券VIEW)
3.帳票を作成する(定期券VIEWを参照する)
4.お客さんのOKを得る。得られなかったら、1に戻る。
というようになる。
この場合、定期券のように簡単なものならいいけど、複雑なものはすぐに正規化できないし、これは、すでに決まっている定期券をだしているからいいけど、お客さんの帳票を出す場合、これで出来上がってからOKをとる。で、もし、仕様変更となったら。。。またDBから考え直して。。正規化して(>_<)となり、時間がかかる。
とっさにはできない。
その上、複数帳票あったら、1つの帳票変更により、正規化したDBもいろいろ移り、それが、現実的には、他のプログラム(VIEW)にも、問題を派生してしまうかもしんない(論理的には、この影響を受けないのがDBの特徴だが、Accessはうける。理由はあとで説明できたらする。次回になるかも)。
■■ Accessでアジャイル
では、これを、ウィリアムのいたずらならどうするか。
1.上記項目を項目名とし、そのまま1テーブルにしてしまう。
テーブル名:定期券レポートテーブル
→レポートとつけるところがみそ
2.ここからウィザードなどを使って、帳票をつくる
自動的に作った後、きれいにおきかえる。
3.ここでお客さんのOKをとる。
だめなら、1にもどるが、、実際は、お客さんのところにパソコンを持っていき
フォームをいじりながら、2で画面イメージを作ってから、1を調整する
→うそつけ(^^;)
本当は、お客さんに2の帳票を作っておいてもらって、1のテーブルを
後から作ってる(^^;)
4.全部の帳票ができてから、正規化した、テーブルを作成し、
メニューのフォームを作り、
メニューフォームで、この定期券印刷のボタンが押されたら、
・1.のテーブルの内容を削除し
・正規化したテーブルから、データを取り出し、
・1のテーブルに入れ、
・印刷する
VBAのプログラムを作成する
このプログラムは、だいたい似たような形になるので、製作しやすい
たぶん、みんなのほおけたすがたが、めにうかびます。
はあ、じゃあ、受注票をつくるときは、受注票レポートテーブルを作るの?
そうです
はあ、じゃあ、納品書をつくるときは、納品書レポートテーブルを作るの?
そうです
はあ、じゃあ、ピッキングリストをつくるときは、ピッキングリストレポートテーブルを作るの?
そうです
(注:ピッキングリストとは、空き巣に入るための無用心な家のリストという意味
。。じゃなくって、出荷等する際、出荷先に応じて、今回出荷するものが書いてあって、そのリストに沿って、倉庫からモノを取り出す(ピッキング)するためのリストのこと)
でも、Accessでの正規化論者は、次の言葉を言ったとたんに詰まる。
はあ、じゃあ、受注票入力フォームをつくるときは、受注票入力フォームテーブルを作るの?
そうです。。。作らないで、あなた、どーやってやる気なんですか??
■■ Accessの場合、1フォーム1テーブルにしないと困ることがある
もし、作らないと、VIEWをつくり、それとフォームを連結させ、入力することになる。しかし、ここで、困った問題が起こる。このようなつくりにすると、Accessの場合、VIEWから勝手にテーブルに直接追加できてしまったりするのだ。。
OKボタンを押してないのに。。
そりゃーまずいでしょー(^^;)
っていうことで、いったんデータをためて、OKボタンを押してから、テーブルに書き出すってするようにしないと、まあ、まずいよね。。
ほら、そーすると、ウィリアムのいたずらが提案した方法になっちゃうのよ。
で、そーすると、フォームが、このようにやるなら、帳票だって、こーやったっていいよね。
つーことで、ウィリアムのいたずらの方式でも、そんなにおかしなことをやっていないことになる。
■■ では、なぜこんな問題が起こるのか?
じゃあ、なんで、こんな問題が起こり、ウィリアムのいたずらが提唱するように、
1フォーム、1レポート1テーブルにして、
お客さんからの合意を取って、テーブルとレポートが完成してから、
正規化したデータベースから、データを取ってくるプログラムを作ったほうが
いいといえるのか?
っていうことだけど、これは、大きな勘違いから起きている。
それは、
AccessはRDBである
という前提に立っているということだ。
もしそうなら、RDBなので、まず正規化してテーブルを作ってという流れになる
これに問題はない。
しかし、ほんとーに、AccessはRDBなのかあ??
たしかにRDBの機能もあるが、もし、RDB以外のものも含んでいたら、その機能を使う分には、正規化理論を適用する必要はない。RDBでないのだから。。
ということで、AccessはRDBなのか?という、すんげい昔、「桐はRDBなのか?」というのと、おんなじような話題を展開しようとしているところではあるが、この話をすると、えらい長そうなので、ここで今日のところは、切っておきます。