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


■クエリで連番

  

新規に入力するときに、新しい伝票番号をふるような処理とはちょっと違うんですけど・・・。
クエリーを使って、その都度連続番号をふるサンプルを作ってみました。
これは、マイクロソフトのサポートデスクに掲載されていたコードを利用したものです。
ちょっと作ってみましょう。

<以下のページで紹介されています>

http://www.microsoft.com/japan/support/kb/articles/j031/7/13.htm


まず、こんな感じのテーブルを作ってみました。

で、中には適当に40件くらいデータを入力しておきます。
ただし、[番号]のフィールドは入力は必要ないです。


で、モジュールを新規作成します。
なんかまっしろなウィンドウが出て来てそれっきりだと思うんで、左上のツールボタンの、ちっこい三角の方のボタンをクリックしましょう。
作るのは新しいプロシージャです。

名前はなんでもいいんですが・・・。
とりあえずマイクロソフトのサイトにはこんな名前のコードが書いてありました。
まねしましょうかね。

ホントになんでもいいんですけどね。

コードは下の通りです。意外と少ないですよねぇ。

このウィンドウの中に、QCntrSetToZeroというふたつのプロシージャを作ったことになります。
で、このふたつに共通の変数が必要なので、それをOption Explicitという行の下にでもちょこっと書いておきます。

Option Compare Database

Option Explicit

 Public Cntr

Function QCntr(x) As Long

 Cntr = Cntr + 1

 QCntr = Cntr

End Function

Function SetToZero()

 Cntr = 0

End Function

やってることは、ただ1足してるだけですけどね。

で、QCntrというプロシージャの使い方は、というと、クエリーで使えと指示があります。下のように、3番目のグリッドに

QCntr([番号])

と書きます。式1:っていうのは、あとで自動的に付きます。とにかくQCntr([番号])だけ入力しましょう。
そうすると、式1:QCntr([番号])ってなります。これでOKです。
で、例えば[名前]の昇順に並び変るようにするなど、テーブルと異なった並び方を指示した場合でも、

こんな風に、そのレコードの並び順にしたがって、上から順に番号を付けていくわけです。

・・・でも・・・あれ???スクロールバーを上下に動かすと、どんどん番号が増えていくぞ・・・????
しかも、下から番号がついたりしてるぞ・・・。

おまけに、いったん閉じて、もう一回開くと、さらに番号が増えてるぞ・・・。

これはフォームでも同じです。
スクロールバーを使ってスクロールする度に、あるいはクエリーを開く度に、どんどん新しい番号を足し算して表示していってしまうわけです。

そのために、SetToZeroっていうプロシージャを別に作って、このクエリーを開く前に必ず実行してくれ、と但し書きがあったわけなんですが、残念ながら「スクロールバーを操作する毎に」このSetToZeroを実行するわけにもいきませんので、もうどうしようもないってことなんですね。

なぜか。クエリーが実データを持たない論理ファイルだからです。
え、意味が分からない??でも、そうなんですよ。
そもそも、クエリーがテーブルに存在しないデータを持つことができるのは、レコード単位の考え方。
横並びのフィールドの中の値を使って、足し算したり掛け算したり、そういうのはいくらでもできます。

でも、前のレコードの値に1を足すとか、そういう考え方は基本的にできないんです。
クエリーの中にちょっとした変数とか持てればいいんですけど、そういう機能はないので、どうしても他のレコードから値を取ってくるってことができないんですよね。

で、マイクロソフトのサイトでも、このクエリーを基にテーブルを作成したり、[番号]を更新したりというクエリーを作って、テーブルに書き出した方がいいだろう、とあります。

うーん、選択クエリーでは、これが限界のようですね。