<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97超入門>自動採番?
 簡単な自動採番 複雑な自動採番 クエリで連番 レポートで連番 コードを書かずに連番



■コードを書かずに連番

クエリーを使って自動採番をすることも可能です。
この場合は更新クエリーと追加クエリーとマクロを駆使します。

ですので、まず、更新クエリーと追加クエリーの役割と作り方をおさらいしておいてください。
ここではさらにちょっと特殊な使い方をしますので、あらかじめ整理しておいていただいた方がよいと思います。

では、細かくお話しながら進めていきますので、みなさんのデータベースの中で活用いただけるかどうか、その辺も合わせてご覧になってください。



まず、こんなテーブルがあったとします。

伝票番号を自動的に採番させて、入力の手間を省こうと思っていて、その仕組みをこれから作ります。
イメージとしては、アタマにRを付けて、うしろに6桁の数字をくっつけます。この数字の部分を、
自動的にカウントアップさせようと思っています。

で、今回は、追加クエリーを使って直接このテーブルに1件レコードを追加して、そのレコードを
フォームに表示するようなイメージになります。

上の図では7件データが入ってますけど、みなさんは入力する必要ないです。テキスト型のフィールドを持つテーブルを作って、そのままでオッケー。ゼロ件のまま先に進みましょう。

このテーブルの名前を、仮に[テーブルD]とします。

そしてもうひとつ。「最後に使った番号」をしまっておくテーブルを用意しましょう。

こういうテーブルです。

数値型のフィールドいっこだけ。主キーは作ってません。
まあ、いらないでしょう。
ぜったい1件しかないテーブルになります。
で、1件だけ入力しておきましょう。えーと、上のテーブルの中身がゼロ件だったら、
ゼロ、7件だったら7と入れておきます。

見ためには2行あるみたいに見えますけど、これでオッケーです。

なんか長ったらしい名前を付けてしまいましたが、こっちは[最後に使った番号テーブル]という名前にしました。なりゆきで・・・。


で、これらのテーブルを基に、クエリーをふたつ作ります。ひとつは更新クエリーで、もうひとつが追加クエリーです。

まずは更新クエリーの方から。これの目的は[最後に使った番号テーブル]の中の数字を、1ずつ増やすというものです。
ちょーっと変った更新クエリーですよね。これだけ見たんじゃ、何に使うのか全然わからないって感じがします。

レコードの更新欄にどういう式が入っているかというと、

[テーブル名].[フィールド名] + 1

この更新クエリーを実行すると、[最後に使った番号テーブル]の[最後に使った番号]が1ずつ増える、っていうわけです。
これが自動採番の基になります。ちょっと実行してみましょうか?
ツールボタンの[びっくりマークボタン]が実行ボタンでしたよね。これクリックしてください。

こんなメッセージ出てきますよね。失敗じゃないんですよ。

いちおう、アクションクエリーを実行するときは必ず確認のメッセージが出ますんで、
それのひとつです。
[はい]のボタンをクリックしましょう。

と、ほんとにテーブルの中身に1を足して更新するけど、いい?というメッセージが出ます。ここでびびってはいけません。
勇気を出して[はい]の方をクリックしましょう。ファイトファイト。

すると、テーブルの中身は更新されているはずです。
そっと[最後に使った番号テーブル](もっと短い名前にすりゃよかった)を開いてみましょう。

ほら。増えてるでしょ。

え?意味がぜんぜん分からない?うーん、ちょっとわかりにくいですかねぇ。
上の更新クエリーを実行する度に、左のテーブルの中の数字が1ずつ増えていく、
っていう仕組みなんですけど・・・。

とにかく一通りやってみましょう。こっちのクエリーには[クエリーD_1]と名前付けてみました。後で分かる名前ならなんでも結構ですよ。


さて、次に作るのは、追加クエリーです。こっちがメイン処理ですね。追加先のテーブルは[テーブルD]です。
[テーブルD]の[伝票番号]に追加します。

追加する値を、フィールド欄に書きます。

"R" & Format([最後に使った番号],"000000")

Format関数については、オンラインヘルプを参考にしてください。こうすることで、[最後に使った番号テーブル]の中の[最後に使った番号]の中の数字を使って、R000001、R000002...と順番に採番されていくんですね。

もっと複雑な番号にしたい場合は、このクエリーをもっと工夫しないとイケナイですけど、今回はとりあえずこれでいきましょう。

こっちは[クエリーD_2]と付けてみました。


で、こんな感じのフォームを、[テーブルD]を基に作ってみました。ちょっとわかりにくいですが、赤い印のついてる方がテキストボックスです。

このフォームを開く前にクエリーをふたつ実行し、[テーブルD]の中に新しい伝票番号のレコードを1行作っておくわけです。

さて、必要なものは全部そろいました。
でも、番号を自動的に採番するとき、いちいち[クエリーD_1]を開いて、その後[クエリーD_2]を開いて、ってやるのもばかばかしいですよねぇ。

なので、これらを自動的に実行できるようにマクロを作ります。

え?もういやだ??そんなこと言わないでまっとうしましょうよ。

マクロの中身はざっとこんな感じになります。それぞれのアクションの詳細はヘルプを見てください。

5番目の「レコードの移動」では、引数は「最後のレコード」に移動することだけ設定すればオッケーです。
オブジェクトの種類やらオブジェクト名やらはいりません。空欄のままでオッケーです。

6番目の「コントロールの移動」は、言うなればカーソルの移動といったところです。[いいたいこと]というおおきいテキストボックスの中にカーソルを移動させておいて、即入力できるようにしよう、という、サービス精神ですサービス精神。

このマクロを使ってフォームを開くようにすれば、新しい番号を作ってその番号のレコードを表示した状態でフォームが開いてきますよね。

上のフォームでは、右下に[次の入力]っていうボタンを作りました。続けて次の入力をすることもありますよね。
でも、今のままだと、フォームを開くときしかクエリー動かしてないじゃないですか。

なので、もうひとつ左のようなマクロを作って、こっちは[次の入力]ボタンのクリック時のイベントにしようと思うんです。
再クエリーってのがちょっとミソかな。状況によってはこれはやらなくてもいけるかもしれませんので・・・。
いろいろ試してみてください。

こんなメニューを作ってみました。ここで作った他のフォームとかレポートを呼び出すための簡単なメニューです。
黄色い印を付けたボタンのクリック時のイベントに、最初に作った方のマクロを指定してみました。

このボタンをクリックすると、マクロが働いて、クエリーがふたつ実行されて、でもメッセージは一時的に出なくなってて・・・。
で、フォームが開いて、なんかちょっと怪しげな動きをしますけど、最終的に伝票番号がつくと思います。

で、[次の入力]というボタンのクリック時のイベントに、後で作った方のマクロが動くように指定して、これをクリックすると

うわーい。次の番号が出てきました。成功だー。みなさんはいかがでしょう。


VBAのコードを書かずに、クエリーとマクロで自動的に番号をカウントアップしていく方法は、だいたいこれが基本になります。
いろいろ応用できるはずです。

Accessの1.1や2.0の頃は、今のAccessほどコードの記述が楽ではなかったので、更新クエリーやマクロを工夫してこんな仕組みを作っていました。
でも、今のAccessは、フォームの中に手軽にコードを記述することができるので、抵抗はあるかもしれません。
コードを記述する方法を極めた方が、結果的に効率がよいような気がします。

みなさんはどんな風にお考えになりますでしょうか。

なんか、もっと簡単な方法があるんじゃないの???ってお思いの方もいらっしゃるかもしれませんね。
まあー、そうかもしれませんけど、基本的にAccessというものはレコード単位に物事を考えますので・・・。
その辺の構造をアタマにおいて、新しい方法を見出していってみてください。