<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--基本操作をさらに考える
   >00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 



じゃあどうするか???というと、「伝票番号単位にレコードが入ってくるテーブル」を作ればいいわけですね。

例えばこんな感じのテーブルはどうでしょう。
まあ、とりあえず作ってみてくださいな。

「社員テーブル」を作り変えるんじゃないですよ。あれはあれ。
こちらは「売上の情報を蓄積するための」新しいテーブルです。

わたしは「売上明細」という平凡な名前にしましたが・・・皆さんも何か適当な名前を付けてください。

あ、ここまでくどくどお話したのでオッケーかもしれませんが、主キーは「伝票番号」ですよ。設定してくださいね。設定はー・・・ツールボタンがありましたよね。カギのマークの。

できました???んじゃ、テーブルのウィンドウは閉じましょう。

そしたらー・・・データシートビューで伝票入力してもいいんですけど、なんか味気ないんで専用のフォームを作ろうかと思います。
こんな感じの↓ フォームの名前は、なんか適当に付けてください。わたしは「売上入力」にしました。

わたしはもう、オートフォーム機能を使ってさくっと作っちゃいました。
そうすると、左上の「フォームの標題」が、テーブル名になっちゃうんですけど、これはまあ、後でプロパティを変えましょう。フォームプロパティの中に「標題」っていうのがありますから、そこ適当に変更してくださいね。


まだテキストボックスの大きさとか調節してないですけど・・・。これもお任せします。
まだ1件も入力してないから、まっさらですよね。
デザインビューに切り替えるには、左上の青い三角定規ボタン・・でしたよね。


で、まあ、ちょっとだけかっこよく、こんな感じに編集してみました。
デザインはお任せします。いろいろ挑戦してみてください。
で、いちおう、後で使っていこうと思ってるんで、コマンドボタンをふたつほど作っておいてください。細かいことは後でやりますんで、ボタンだけとりあえず。

後は、フォームの標題とか、テキストボックスの位置とか、もろもろ・・・。
お好みで変更していってください。

わたしのフォームは、デザインビューにしてみるとこんな感じになってます。
例えば、「売上日」はしっかりと4桁で西暦を表示してくれるように、書式の設定をしました。日付はできるだけ、書式の設定する癖をつけておいた方がいいと思います。

 yy/m/d =00/6/12
 yyyy/m/d = 2000/6/12
 yyyy/mm/dd = 2000/06/12
 yyyy年mm月dd日 = 2000年06月12日
 ggge年m月d日 = 平成12年6月12日
  (ggge\年m月d日となるかも。でもこれでオッケー)
 yyyy/m/d hh:nn:ss = 2000/6/12 0:00:00
 yyyy/m/d aaaa = 2000/6/12 月曜日
 yyyy/m/d (aaa) = 2000/6/12 (月)



いろいろ工夫できると思います。試してみてくださいね。

で、なんか適当にデータ入力してみましょう。
伝票番号は主キーですから、絶対入力しないといけないですよ。それと、ダブっちゃいけないってことだけは頭に入れていただいて・・・。数値フィールドですからね。1,2,3・・・と順番に半角の数字を入れていけばよいでしょう。

まだ使い勝手の良くないフォームですけど、とにかくデータがテーブルにちゃんとたまるようにしないといけませんから、テストも含めてそっとそっと、4〜5件入力してみましょう。


で・・・少し入力したら、とりあえずフォームを閉じて、「売上明細」のテーブルの方、あけてみましょう。
わたしのパソコンは今、和暦の表示にしてるので売上日がなんか変ですけど、まあ、そこんとこは気にしないでください。


どうです?データ、入ってきてますか?
テーブルの設計のポイント、何となくつかんでいただけたでしょうか。といっても、繰り返しお話するようになっちゃいますけど、これはソフトの操作方法とか、暗記する事柄でもないんで、焦らずゆっくり、考え方を養っていただきたいって、思うんです。


さて、テーブルの設計に関してのお話はこれで一段落なんですが・・・でも・・・これで終わりにはしないっすよ〜。
せっかくですからね。もうちょっと入力しやすいフォームにしようじゃありませんか。テーブルの仕組みが変われば、フォームの入力に関することだっていろいろ変わってくると思います。
ついでに、もしかしたらみなさんのデータベースの中でもすぐお役に立つかも・・・ってことも盛り込んで、いろいろお話していきますね。

まずは・・・・。このフォーム、何が不便だと思います?それから、どうすればもっと便利になると思います?
できるできないはともかくとして(笑)、とにかく「こうなったら便利そうだけどなー」という感じで、考えてみてください。


んでは・・・まず、自前の「次の入力ボタン作り」をやってみましょうか。

「次の入力」のコマンドボタンのプロパティをみましょう。
おなじみの、「イベントプロパティ」を作ります。
クリック時のイベントです。

マクロでもコードでもいいんですが、今回は少々工夫していきますので、ぜひ「コードビルダ」を使ってコードで記述してみてください。

「レコードの移動」というマクロアクションを書きます。移動先は「新規レコード」です。こんな風に・・・。

DoCmd.GoToRecord , , acNewRec

と入力します。
カンマの数に注意してくださいね。

これで、「次の入力」ボタンをクリックすることで、新しい売上伝票の入力ができるようになるわけです。


で、ついでに、「新しい伝票の入力をするときは必ず、「今日の日付」が売上日のテキストボックスの中に入っている状態にしてみましょうか。
違ってたら入力しなおせばいいし。

テキストボックスのプロパティの中に「既定値」というのがあって、新しいレコードの入力時にあらかじめ入力されていたら楽だな〜という値を入れておきます。関数とか式も使えますから、

=Date()

と入れておきましょう。「今日の日付」を拾う関数です。

「今日の伝票じゃないんだけどなぁ」って時は、入力しなおしちゃえばいいんですから。
「コントロールソース」のとこに=Date()って入力しちゃうと、このテキストボックスは「今日の日付」以外受け付けなくなっちゃって入力もなにもできなくなっちゃいますけど、「既定値」のプロパティを使えば、=Date()関数が働くのは「新規レコードの入力時」だけなんですよ。このプロパティ、なかなか利用価値あり、ですよ。

それに、この関数も・・・レポートでも使えるし、いろいろ便利です。覚えといて損はなし!って感じで。


じゃ、あらためて・・・。1件入力してみましょうか。
フォームビューに切り替えるか、あるいはいったんフォームを閉じて、もう一回開きなおしてください。

何度かお話していると思うんですけれど・・・フォームというものは、何も指定しない状態だと、開いたときってかならず「レコードソースにしているテーブル化クエリーの1件目のレコード」を表示します。

なので、「次の入力」ボタンをクリックして、新規レコードの入力をいたしませウ。

どうよ〜。今日の日付、入ってくるでしょ?
6月14日の伝票なんだけどなーっていうときは、ほれ、売上日、書き換えることができるでしょ?こういうとき便利ですよね。こんなかんじで日付の入力をちょっと楽にしちゃおう!なんてとき、よく使うプロパティです。

他にもいろいろ工夫できそうですけど・・・。とりあえずこんな感じで、他のことやってみましょうかね。後どんなトコ工夫しましょうか。




では、次に・・・。
「伝票番号」なんですけど、「自動的に1,2,3・・・」ってついてくれたら楽だなぁって、思いません?

これは、よくいただくご質問のナンバー3くらいなんですけど、まず、こういう機能はないと思ってください。
オートナンバー型のフィールド?まあ、それでもいいですけど、ここではご自分でカウントアップできるような仕組みを考えたいと思います。
オートナンバー型のフィールドでもいいですよ。わたしはこのデータ型、一回も使ったことないですけどね。

仕組みを作ることは簡単ですが、状況によってはいろいろなところに影響が出る場合もあります(バグとかそういうことじゃなくて)。
ここでは、そんなことも踏まえながらいろいろお話していきますね。もし、みなさんが作っているデータベースの中でおなじような仕組みを動かすことができそうだったら、挑戦してみてください。


ぶっちゃけた話、単純明快です。
売上明細のテーブルの中の伝票番号というフィールドの中の値をざっと見て、一番大きな値に1を足して、それを新しいレコードの伝票番号にする」っていうことです。
ここで「じゃあどうやって・・・」と焦ってはいけません。順を追って考えましょう。

まず、「売上明細のテーブルの中の伝票番号というフィールドの中の一番大きな値」を探す方法を考えます。

いろいろな方法が考えられるのですが、ここではDMaxという関数を活用してみたいと思います。

開いていないテーブルやクエリーからでも値を探してくることのできる便利な関数です。
Maxって、最大の、っていう意味ですよね。そういう関数です。

これの書き方は、細かいことはヘルプを見てくださいね。ヘルプ、おっくうがっちゃいけませんよ。表示されるの遅いことも多々ありますけど・・・。


DMax("フィールド名","テーブル名","条件式(あれば)")


という構文になります。
半角のダブルコーテーションで囲み、それぞれ半角のカンマで区切って、半角のカッコで囲みます。カッコやダブルコーテーションは対になってないとダメ。かたっぽかけちゃったり多すぎたりしてないか、慎重にに入力しましょう。画面の文字、ちょっと細かくて記号の区別がつきにくいですけどね。
今回は、テーブル全体を通じて一番大きな伝票番号を拾ってくればよいので、条件式はいらないです。もし、「さくら組の人の中で一番大きな伝票番号」とかやりたい場合は、そういう条件式を3番目に継ぎ足します。この条件式って、書き方が結構難しいんですよ。慣れるまでは、とりあえずテーブル全体、クエリー全体で一番大きな値をとってくるときだけDMax関数を使いましょう。

で、今回の場合は、どうなりますか???
実際のフィールド名、テーブル名を当てはめて考えてみてください。

次に・・・。このままじゃ、永遠に「同じ伝票番号」しか発生しないですよね。しかも「売上明細」テーブルって、伝票番号を主キーにしてるから、同じ伝票番号を2回使うことできませんよね。
・・・なんでだかもう既にワケがわかんなくなってる人いません???1足さなきゃなんないですよね。


DMax("フィールド名","テーブル名") + 1


プラス記号も数字の1も半角です。

で、この式で出た値、つまり新しいレコードが使うべき新伝票番号をどうするか、ということを考えます。
テーブルの中の伝票番号フィールドに直接書き込んじゃうって手もあるんですが、これは難易度が高い・・・。そこで、フォームの中のテキストボックスに代入します。
上のフォームの、「伝票番号」のテキストボックスの名前を確認してください。多分、ウィザードで作ったフォームなら、フィールド名がそのままだと思うんですけど・・・。


Me!テキストボックス名 = DMax("フィールド名","テーブル名") + 1


と、こうなります。
なんでMeかというと、フォームが開いている状態なら、Meとはそのフォームの名前のことですんで、まあ、書くのが楽かな・・・と。
ほんとは

Forms!フォーム名!テキストボックス名= DMax("フィールド名","テーブル名") + 1

って書くんですけど、できれば短い方がいいですよね。