<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--「連番」の考え方
   [実験1] [実験2] [注文表1] [注文表2] [注文表3]



「連番」の考え方--注文表を作ってみる2

基本的に、一番最初に作った練習クエリでいろいろ実験したようなことが、このサブフォーム上でも起こるはずですから、ここまでうまく動けば、あとはあまり難しく考えなくてもよいと思いますよ。
じゃあ、ちょっとおまけで、「金額」が出るようにしましょうか。やりかたすでに分かってる方は、挑戦してみてくださいね。

ざっくりとお話いたしますと・・・。
クエリで、「数量」×「金額」という計算式を作っておいて、↓

サブフォームの方に追加します。追加は、フィールドリストからやるとわりかし簡単ですよね。↓

あと、サブフォームのほうにはもう「注文番号」っていらないので、「注文番号」のテキストボックスとラベル、消しちゃっていいです。

「ID」はまだ残しておきましょう。
でもフォームヘッダーにラベルができるわけじゃないので、ラベルは手作りかな・・・。まあ、いろいろいじってみてください。



ついでにメインのフォームのほうとかもいろいろ調節して見やすく変えてみたりして・・・。

で、ためしに、もう1行分、商品の注文を追加してみますと・・・。
単価と数量を入力してEnterキーを押したときに、↓金額が計算されますよね。

で、Enterキーを続けて押したりして、カーソルが空白行に移動したりして、↓エンピツマークが消えると、[番号]がつきます。

タイミングは、皆さんオッケーですか?
このエンピツマークってやつが、いろいろクセ者なんですよね。
エンピツマークがついている間は、まだきっちりテーブルの中にデータが入ってるわけじゃないので、「まだ3件目のあんぱんの注文は存在してない」ことになります。
エンピツマークが消えて、初めてあんぱんが入力されたことになるわけです。だから、「番号」の値が2のままなんですよ。
この辺の様子、理解しておかれると、こういう感じのフォームを作るときいろいろ応用できると思います。



じゃあ、1レコード削除してみます。
「ぶたまん」のオーダーは間違いでした。この1行、削除したいです。
レコードセレクタをクリックして、Deleteキーを押します。

確認のメッセージが出ます。[はい]ボタンをクリックします。

「番号」、ちゃんとつきますか?↓

え?レコードセレクタじゃなくて、削除ボタンみたいなのを作りたい?
確認メッセージも出したくない?

それはー・・・うーん、削除クエリとマクロの組み合わせでできるはずですから、後でがんばって挑戦してみてください。
でも、わたしは、レコードセレクタクリックしてDeleteキーでも、そんなにかっこ悪くはないと思うんですけど・・・。
それに、あんまり気軽にクリックできるようなデザインにしちゃうと、うっかり削除しちゃう人続出になっちゃう可能性もありますし。
レコードセレクタ&Deleteキーなら、そうそううっかり間違えて削除しちゃう人もいないんじゃないでしょうかね。
それと、確認メッセージは、何らかの形で出るようにしといたほうが安全じゃないかなーって思いますよ。



そしたら、もうひとつ実験です。
あと2〜3行追加入力しておいて・・・。

「あんぱん」の行を削除してみてください。上から2行目くらいのところを削除してみるってわけです。
もしかしたら連番、ずれちゃったり、します?



さっき、練習のクエリでいろいろ実験したときも、クエリを開きなおさないと連番にならないときがありましたよね。
連番つったってDcount関数が一生懸命働いてるわけですから、Dcount関数が最新の計算結果を取ってくるためのきっかけを与えてあげないとならないはず。それが、「クエリを一度閉じてもう一回開く」「デザインビューに切り替えて、再度データシートビューにする」とか、そういう動作を取ると、そのときDcount関数が働きます。それは前に見ていただいたとおりです。

でも、こういうふうにきっちりフォームを作っておきながら、「連番」を正しく表示させるために一度フォームを閉じてもう一回開くとか、そういうのはなんだかかっこ悪いですよね。

そこで、フォームの場合は「オブジェクトの再表示」とか「リフレッシュ」とか「再クエリ」とか、そういうアクションをとってやるわけです。そうですよね。
今までいろいろ実験いただいた限りだと、連番がきちっとならないのは、レコードを削除したときだけみたいに思うんですが、どうでしょう。

そんなら、サブフォームの「削除後確認」とか、↓その辺のタイミングで再クエリすればいけるはず。

こんな感じでしょうか。↓

「再クエリ」っていうアクションを実行するマクロを作ってもいいですよ。同じことです。(コントロール名欄は空欄でオッケー)
多分これで、どのレコードを削除しても、削除したあとすぐ再クエリされて、正しい連番がつくようになると思います。

ここまでうまいことテストができたら、もうサブフォーム内に「ID」のテキストボックスはいらないんで、消しちゃいましょう。
わたしは、こんな感じにしてみました↓「番号」は入力できないフィールドですからね。色を変えて目立たなくしてみたってわけなんですが。

お好みでいろいろデザイン工夫してみてください。

1回の注文時の商品数が4つとか5つとかで、これくらいの行数ですみそうなら、けっこう使える方法なんじゃないかと思うんですけどどうでしょう。
たとえば、商品が30種類くらいになるのがザラだとすると、よほど大きなフォームにしないと、サブフォーム部分を何回もスクロールしないとならなかったりしますよね。それに、Dcount関数が連番をつけるのに、「ん?」って一瞬考え込むような間があいたり、しそうですよね。
まあ、それは別に「ん?」って一瞬考え込むくらいどうってことないって皆さんがそうお思いになるのなら、別に問題ではないです。

30件くらいの入力のうち、16件目を削除したときのこととかちょっと考えてみてください。
削除したあと、イメージとしては、16件目前後が表示されててほしいところかもしれないですが・・・・。
「再クエリ」しますから、サブフォーム内の商品は、1行目から表示されます。
これがいやだ、15行目くらいのところが表示されてる状態にしときたいとなると、こりゃまたいろいろ工夫しなくちゃならない・・・。
そんなわけで今回はここまでで勘弁してください〜。