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



「連番」の考え方--実験2

これから何をするかというとですね・・・。
「ねこ」が3行目に見えているということは、どういうことなのかを考えます。

なんでかっていうと、

こうして考えてみると、どうでしょう。この、最後の「3件」っていう数を、Dcount関数を使って拾ってくることができれば、たとえ[番号]が飛び飛び番号になっちゃったとしても、「番号順に並べ替えたときに3行目に出てくるならそいつの[連番]は”3”」っていう仕組みを作ることができるんじゃないでしょうか。
「[番号]順に並べ替えたとき、自分より小さい[番号]を持つ人が何人いるのか数える」っていうのが、基本的な考え方です。

そうすると、この方法を用いる場合には、[番号]にあたるフィールドの存在が非常に重要なポイントになります。

こういう↓フィールドがなかったら、できないわけです。

■数値か、それ相応に並べ替えができる値を持つフィールド
■ダブってない(同じ値がない、みんな違う番号とか持つような)フィールド

[番号]が主キーでなくてもオートナンバー型じゃなくても、絶対ダブらないという保証があれば同じ仕組みを作ることはできますが、「絶対ダブらないようにするから」なんて人間が口約束しても意味がないってことは、みなさんご承知ですよね。
間違ってダブって入っちゃうこともありえるわけで。
操作とか入力面じゃなくて、データベース的にダブった値を持たないよう、レコード1件1件きっちり識別できるようなフィールドを持たせるようにするために、主キーって考え方があるんでしたよね。

伝票番号とか、人間側である程度意味を持って入力していきたい値には、オートナンバー型ってのはあんまりお勧めじゃないですけど(自由につけられないし)、こういう場合、つまり、なんでもいいからとにかく重複しない数値を割り振りたいって場合は、オートナンバー型ってけっこう便利でお手軽です。こういうときこそ、うまいこと活用したいもんです。



で、どうやるか、というとこなんですが、Dcount関数に詳しい方なら、もうお分かりですよね。

式は上のようになります。

Dcount関数はある程度条件式をつけることができるので「[テーブル1]の中の[番号]が、自分自身の[番号]と同じか、ちっさいのは、何件?」っていう条件をつけてやればいけるはず。
この場合の「自分自身の[番号]」っていうのは、「そのレコードの[番号]」っていう意味合いになります。
つまり、4件あるのならDcount関数は4回動くわけです。
300件あるのなら300回動きます。
「ねこ」のレコードで動くDcount関数が参照する[番号]とは、「ねこ」の[番号]である”3”なのです。
慣れないとこういうの考えるのはややっこしいかもわかんないですが、とりあえず少ない件数でじっくりあっためて考えてってみてくださいね。

どうでしょう。とりあえず、[連番]に連続した番号が出ます?

え?[連番]を一番左にもってきたい?
別に横の並び順なんてどっちだっていいじゃないですかー。えー?だめ?
じゃあ、デザインビューで、上の赤いしるしのところあたりを(フィールドセレクタ)そっとそっとドラッグして、左に移動させてください。



さて、ここからが正念場です。[連番]がどんなふうに変わっていくか、しっかり見てってくださいね。
1件レコードを削除したとしましょう。左端のレコードセレクタをクリックして、3行目の「ねこ」のレコードを削除したとします。
クリックして1行黒くなったら、↓Deleteキーを押してください。削除の確認メッセージに[はい]と応答すれば、1レコード消えます。

どうでしょう。わたしは、↑上のようになりました。[連番]は1,2,3となってます。皆さんの画面ではどうですか?

で、続けて新しくデータの入力を↓↑していくと、いちおう、[連番]もそれっぽくついていきます。みなさんの画面ではどうでしょう。

ふむ。ここまでは問題なさそう。↓じゃあ、2レコードいっぺんに削除したら、どうなるかな。

ふむ。これも思惑通りです。↓このままいけそうです。みなさんはいかがですか?

じゃあ・・・何件か入力しておいて・・・。↓

途中のレコードを削除した場合は・・・。↓

ああ・・・こういうとき↓はちょっとずれちゃうんだな・・・。

ここまで確認していただけたら、このクエリ一度閉じるか、デザインビューに戻ってください。
んでもって、再度開くか、またデータシートビューに切り替えてみてください。
そうすると・・・。多分、飛んじゃった[連番]、ちゃんと連続した番号になってると思います。
やっぱり、完全に手放しで使えるわけじゃなさそうですね。フォームで使用する場合は、「再クエリ」をする必要がありそうです。

じゃあ、ここまで確認できましたら、このクエリ、いったん閉じましょう。




ここまでのところ、いかがでしょう。
ポイントは「件数を数える」っていうトコですね。
んじゃもうひとつ実験を・・・。

テーブル1の件数が少し多い場合、どうなるかっていうお話なんですけど・・・。
35件くらい入力してみました。

あ・・・余談ですが・・・。
なんで[番号]が飛び飛びになるのか、は、みなさん理解なさってますよね?????
オートナンバー型って、そういうもんですからね。
レコード削除しても、空いてる番号を使ってくれるわけではありません。自分で入力しなおすこともできません。

だから、表立って利用するような番号(伝票番号とか、業務的に意味のある番号)に使うのは、あんまし好きじゃないんですよ。オートナンバー型って。
で、「オートナンバー型のフィールドの飛び飛びの番号を詰めたいんですけどどうしたらいいんですか?」なんてことをここで聞くなぁ〜!!!!!
話がどんどんそれるじゃないのよっ!
んも〜どうしても知りたいという人はマイクロソフトの技術情報サイトの「404069 - [AC97] オートナンバー型のデータを連続番号に再設定する方法」を見るよろし!




そしたらテーブルは閉じて、さっき作ったクエリを開きましょう。
と、出ます?

いちおう、[連番]は出ますよね。でも、なんか表示が遅くないですか?

少なくとも、レコード移動ボタンのところの「35」っていう数字が出るまでに、ちょっと時間がかかるんじゃないかと思うんですけど・・・。
もちろんこれは、お使いになってるPCのCPUとかメモリ搭載量とか、現在使用可能なシステムリソースとかハードディスクの空き容量とか、そういうのが影響しますから、パワーのあるマシンならぱっと出るでしょうがパワーのないマシンならちょっと時間がかかると思います。
また、すごく高級なPCを使っていたとしても、変なスクリーンセイバーとかチューチューマウスとか(笑)、常駐しているソフトがいろいろあればそれだけシステムリソースっていうもんが減って、MS-Accessがのびのび活動するスペースが少ない場合もあります。
一概にCPUとかOSの種類とか搭載しているメモリの量とかだけじゃ、処理速度とかって測れないもんなんですよ。パソコンって。

あと、「遅い!」って感じるのも、人によってそれぞれ好みとか感覚的なもんがあると思うんで、まず、このクエリを開いてみた瞬間、皆さんご自身がどう思ったか、そいつを大切にしてください。
遅いことは遅いんです。Dcount関数が35回動くわけですし・・・。

つまり、もし、この方法を用いて、何かしらフォームとか作るとした場合、連番をつける対象となる件数が何件くらいまでなら「みなさんが耐えられるのか」を、皆さんご自身が判断する必要があるわけです。
何千件あったって、このクエリはきちんと仕事をしますよ。何千回もDcount関数を動かして、ちゃんと[連番]を表示してくれるはずです。結果は出ます。でもおそらくある程度時間はかかるでしょう。あとは、それを皆さんがよしとするかどうか、だけです。それは第三者には判断できない。こうしたちっこいテストを繰り返してみて、「うーん20件くらいにしておこうかな」とか、考えてってみてくださいね。