<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--自動採番の巻
   1 2 3 4 5



伝票番号とか、会員番号とか、そういうの、1件入力するごとに自動的に番号を付けていくにはどうしたらいいんでしょう?

データベースにはたいてい、新規にレコード入力する際に通し番号をつけるようなデータ型があったりします。MS-Accessにも「オートナンバー型」というデータ型があります。これを使えば、自動的に1,2,3・・・と番号がついていきます。
まあ、ただ単に番号がつけばよいのなら、オートナンバー型のフィールドを作ればよいでしょう。

んでは話が終わってしまうので、ここでは自動的に番号を振っていく方法についていくつかお話をします。

基本的に、オートナンバー型フィールド以外で、自動的に番号を振るような機能や設定はないと考えてください。
がんばって仕組みを作るしかないのです。



他のコーナーでも何度かお話をしていますが、Accessに限らず、データベースというものの考え方の単位は「レコード」です。
したがって、テーブルというものは、全体を広げて表計算ソフトのワークシートのように扱うのではありません。
データシートビューでテーブルを開いて見てみると、なんとなく表計算ソフトと似てますが、違います。

なので、「前のレコード」とか「ひとつ後のレコード」とか「40番目のレコード」とか「最後のレコード」とかいう考え方は、ほとんどありません。
ですんで、レコード単体でもちゃんと識別ができるような、目印となるフィールドが必要なのです。それが「主キー」というやつです。

この時点で「Accessって使いにくい、不便、わかりにくい」と言う人もいますが、それだからこその利点もたくさんあるのです。こういうところは、ソフトウェアの特性を活かして、うまく使い分けていってくださいね。決して表面的にMS-Excelと比較してはいけません。絶対損です。


例えばこんなテーブルがあったとします。名前をテーブルAといいます。
数値型の「番号」というフィールドと、あとひとつ他に適当なフィールドを持ってます。
主キーは作ってませんが、いずれ実験が成功したら、「番号」というフィールドを主キーにしようと思ってます。通し番号つけますから、主キーにピッタリですしね。

まあ、でも、主キーにするために通し番号を付けようとしているわけじゃないので、今回の操作と「主キー」というものとはべっこに考えた方がよいかもしれませんね。

で、このテーブルを基にしたフォームを、オートフォームとかフォームウィザードとかで適当に作り、フォームAという名前を付けて保存しました。

改めて開いてみると、まあ、こんなちっこいフォームになりました。

このフォームを通じて、「番号」に自動的に番号を振っていく仕組みを作ります。


まず、どういうタイミングで番号を付けるか、イベントについて考えます。
くどうようですが、テーブルそのものには、自分で好きなように番号をつける機能はありませんので、フォームとうまく組み合わせて仕組みを作ります。したがって、フォームでどんなことができるのか、その辺をしっかり把握しておく必要があります。

まずは・・・フォームの「挿入後処理」というところを利用してみましょう。

コードビルダを使って、こんな感じのコードを作ります。

フォーム内の[番号]という名前のテキストボックスに、[テーブルA]というテーブルの中の[番号]というフィールドの中の値の中で一番大きい値をDMax関数という関数で取り出してそれに1を足した数を代入する、という処理を、VBAで書いたことになります。VBAで、っていうか、まあ、そんなもんですね。

Me![番号]というのは、もうみなさんオッケーだと思いますけど、[番号]というフィールドのことではなく、フォーム上のテキストボックスのことです。
ここに数字を代入すると、このテキストボックスのコントロールソースは[テーブルA]というテーブルの中の[番号]というフィールドですから、そのタイミングで番号がつく、というわけです。

その辺がミソですね。

じゃ、テストしてみましょう。
フォームを保存し、フォームビューに切り替えましょう。いきなり切り替えてもよいですし、一度閉じてからもう一度開いても、どっちでもいいですよ。

↑最初はこんな感じじゃないかと思います。
[番号]は飛ばして、[名前]の入力をします。

入力できたらEnterキーをおしましょう。

・・・あれー・・・入力したのに、消えちゃったぞ・・・。
[番号]もゼロのままだし・・・。



まあ、とりあえず気にせず、ガンガン名前の入力&Enterキーを押して、適当なところでフォームを閉じましょう。
エラーが出ることがあるかもしれませんが、まだ試作段階ですんで、エラーメッセージに従ってフォームを閉じてください。

で、テーブルを見ると・・・。
なんか、番号ついてません???

なーんだ。成功してるじゃないですか。でもなんでフォームではゼロのままだったんでしょうね。
その辺はおいおい謎解きしていくとして・・・。

ほんとうにこの番号付けが、みなさんのリクエストを満たすことができるものなのか、その辺をひとつ見てみましょう。

どれかひとつ、適当なレコードを削除してください。
左端の「レコードセレクタ」をクリックします。
でもってDeleteキーを押して、メッセージに答えれば削除できますよね。

わたしの場合は、3番目のレコードを削除したので、1,2,4,5,6,・・・となりました。



で、テーブルは閉じましょう。
変わってフォームをもう一度開いて・・・。

新しくもう1件、レコードの追加をしましょう。えー、まだ何の仕組みも作ってないですから、フォーム開くと必ず一番最初は「1件目のレコード」が表示されてますので、ウニみたいな絵のついたボタンをクリックして新規レコードの入力状態にします。こういうトコはみなさんもうオッケーですよね。

相変わらず「番号」はゼロのままだなぁ・・・。まあ、気にせず「名前」の入力しましょう。

で、Enterキーを押すと・・・やっぱりまた「番号」はゼロになりますねぇ・・・。
まあいいか。とりあえずフォームを閉じて、テーブルを開きましょう。

こうなります。

ここで、「3番が空いてるんだから、3ってつくもんじゃないの?」って思った人、いますか?
でも、みなさんさっき、「テーブルAの[番号]のフィールドの値の中の一番大きい値に1を足した数」っていう仕組みを、作りましたよね?
それじゃ、「6に1足した、7」がつくのは、当然ですよね。

最初にもお話したとおり、Accessの処理の単位は「レコード」です。テーブル全体でゾロゾロ動いているわけではない。なので、「テーブルAの中で1つ飛ばしになって空いている番号」を探すのってすっごく大変です。っていうか、ひとつふたつ処理を作ったところでどうなるもんでもないんです。
でも、どうしてそんなに難しいのか・・・上のようなフォームやテーブルの仕組みを少し理解することで、なんとなく見えてくるんじゃないかと思います。

「通し番号を付けたいなぁ」と思うこともありますけれど、テーブルというものは、レコード単位で物事考えます。テーブル開いたときに縦にずらっと見て「通し番号」になっててほしい・・・って考え方は、Accessに限らずデータベースにはあまり存在しないことなのかもしれませんね。

でも、フォームから離れて、テーブルだけで考えれば、[番号]は数値型ですんで、別に自分で入力してもよいフィールドですよね。

なので、「オニヒトデ」を7から3に書き換えちゃいましょう。

一度テーブルを閉じて、もう一度開けば、

ホラ、並び変わってるでしょ。

あ、でもね、これって、必ずしも「データシートビュー開いたときに見た目並び変わってくれる」ってわけじゃないんですよ。何度もお話してますけど、データベースってのはレコード単位でものを考えます。なので、「どういう順番でレコードが並んで見えるか」というのは、ちゃんとそれなりの設定とか指示をしてやらなければなりません。

Accessって、フィールド名で「あ、これってもしかして、並べ替えとか検索とか似後で使うんじゃないの??」って勝手に判断して「インデックス」ってものをつけることがあるんです。データベースの世界では、比較的件数の多いテーブルで、なおかつ検索とか、並べ替えとかを頻繁に行う可能性のあるフィールドに「インデックス」っていう設定をすることが多いです。いわゆる「索引」ですね。[番号]っていうフィールドを使って並べ替えとか検索とかをすばやくできるよう、あらかじめ心積もりしておいてくれよ、と、テーブルに指示しておくんです。

設定は、テーブルのデザイン画面で行います。

テーブルデザイン画面で、[番号]のプロパティの中に、「インデックス」というのがあります。(一番下の方にあると思います。ちょっとわかりにくいところにあるんですが)

これがどういう設定なのか、は、ヘルプを覗いてみてくださいね。「インデックス」欄にカーソルを置いた状態でF1キーを押せば出てきます。

で、なんで自動的に「インデックス」の設定がつくかというと・・・。

メニューバーの[ツール]→[オプション]→[テーブル/クエリ]を見ると、「ID」「番号」「コード」というフィールド名にすると、そのフィールドにインデックスの指定をする、という意味ですね。


ちょっとお話がそれちゃいましたが・・・ついでにもうひとつ。オートナンバー型のフィールドについてもちょっとだけお話します。

「オートナンバー型」のフィールドでも同じことなんです。

例えば別のテーブルをちょっと作ってみたとして、オートナンバー型のフィールドを作ったとします。

このフィールドは、フィールドそのものに「番号」を付けていく能力があるので、「名前」だけ入力していくことで勝手に番号がつきます。そのかわり「ID」のフィールドに何か入力することはできません。

できません。

なので、例えば、3番目の「イヌワシ」を削除したとして、

次に「サーベルタイガー」を入力すると、サーベルタイガーには「7」とつきます。
仕組みとしては、さっき皆さんに作っていただいた「DMax関数を使った処理」と同じなんですね。

皆さんに作っていただいた仕組みの方なら、番号を振るのはフォーム上でやってますから、フィールドのデータ型はただの数値型ですよね。
なので、「あ、ひとつ飛ばしになっちゃった。自分で手入力しちゃえ」って、なんとかごまかすこともできちゃうわけです。

だがしかし、「オートナンバー型」はどんなにがんばっても、自分で数字を入力することはできません。できません。


じゃあ、とびとびになっちゃったオートナンバー型の番号を、ぴしっと通し番号にするには、どうしたらいいの???

http://support.microsoft.com/default.aspx?scid=kb;ja;404069
↑「オートナンバー型のデータを連続番号に再設定する方法」を参考にしてください。Microsoftの技術情報サイトです。
この記事はAccess97の時の情報ですが、原理は同じだと思います。

いちおう、テーブルのコピーを取ってからやったほうがいいかもしれません。。。まあ、壊れてしまうとかそういうことは極まれですけれど・・・。