![]() |
||
<HOME <お願い事項 <Access2002 TOP <Access2000 TOP <サイト内検索 | ![]() |
|
![]() |
||
MS-Access97超入門>自動採番? |
簡単な自動採番 複雑な自動採番 クエリで連番 レポートで連番 コードを書かずに連番 |
新規に入力するときに、新しい伝票番号をふるような処理とはちょっと違うんですけど・・・。
クエリーを使って、その都度連続番号をふるサンプルを作ってみました。
これは、マイクロソフトのサポートデスクに掲載されていたコードを利用したものです。
ちょっと作ってみましょう。
<以下のページで紹介されています>
http://www.microsoft.com/japan/support/kb/articles/j031/7/13.htm
まず、こんな感じのテーブルを作ってみました。
で、中には適当に40件くらいデータを入力しておきます。
ただし、[番号]のフィールドは入力は必要ないです。
で、モジュールを新規作成します。
なんかまっしろなウィンドウが出て来てそれっきりだと思うんで、左上のツールボタンの、ちっこい三角の方のボタンをクリックしましょう。
作るのは新しいプロシージャです。
名前はなんでもいいんですが・・・。
とりあえずマイクロソフトのサイトにはこんな名前のコードが書いてありました。
まねしましょうかね。
ホントになんでもいいんですけどね。
コードは下の通りです。意外と少ないですよねぇ。
このウィンドウの中に、QCntrとSetToZeroというふたつのプロシージャを作ったことになります。
で、このふたつに共通の変数が必要なので、それを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を足すとか、そういう考え方は基本的にできないんです。
クエリーの中にちょっとした変数とか持てればいいんですけど、そういう機能はないので、どうしても他のレコードから値を取ってくるってことができないんですよね。
で、マイクロソフトのサイトでも、このクエリーを基にテーブルを作成したり、[番号]を更新したりというクエリーを作って、テーブルに書き出した方がいいだろう、とあります。
うーん、選択クエリーでは、これが限界のようですね。
![]() |
![]() |
![]() |