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



まあ、それでもよい場合はそれでもいいんですけど、ここでひとつ問題が発生します。
[番号]が主キーだったら、ってことです。

テーブルからしてみたら、主キーはそのレコードを代表するフィールドになるわけなので、空っぽとかダブってるとか、いいかげんな入力されたら困るわけです。主キーの中の値を頼りに、テーブル全体の秩序を保とうとしますからね。その辺のことは、ヘルプで「主キー」のとこを見てみてください。

でもって、フォームからしてみたら今回の場合、レコードの挿入後に、番号を振ってます。
したがって、テーブルからしてみたら、主キーが空っぽのうちに、次のレコードの入力をしようとしてるじゃないの困るわよ!ってことになるわけです。


テーブルAを開いて、いちおう[番号]の確認をすると・・・。まだバラバラな感じがしますけど、とりあえずダブってはいないですよね。全部なにかしら「違う番号」がついてると思います。空欄のとこもなく、どのレコードにも何かしら「番号」がついてます。
わたしのはそうなってますけど・・・。もし、[番号]がダブってたり、空欄になってる場合は、そのレコード削除するか、別の番号を入力しておいてください。

そして、デザインビューに切り替えて・・・。
主キーの設定をして、保存しましょう。[番号]のフィールドをクリックして、ツールバーの「鍵の絵のボタン」、でしたよね。

データがダブってたり[番号]が空欄になってなければ、特に問題なく主キーの設定ができるはずです。

では・・・。
テーブルは閉じて、フォームを開きましょう。

えーと、1件、何か名前の入力をして、Enterキーを押して・・・あ、Enterキーでは次のレコードには移動しないようにしたんですよね。
んじゃ、ウニマークのボタンをクリックして、2件目の入力を・・・。

わたしのフォームだと、なんかエラーが出るんですけど・・・これ、なんです??
皆さんのはどうですか?なんか、こんな感じのエラーが、出ません?

どういうことかというと・・・さっきお話したとおりなんですが、要するに、この次のタイミングで[番号]はつく予定なんですけど、まだついてないんですよね。空欄のまま次のレコードに移動して、次のレコードに移動したら番号を付ける・・・フォームはそういうつもりでいるわけです。が、テーブル側ではそうは問屋が卸さない。このエラーは、「主キーが空欄のままかまたは値がダブっていて、主キーとしてふさわしくないので」というエラーが発生していて、そのために「レコードを保存することができません」と言っているわけです。
多分、皆さんの画面の中でも、そういう感じのエラーが続けて出てくるんじゃないかと思います。
イメージ的には、一時的にテーブルの内容がこうなるわけです。

で、この後、トビウオの次のデータを入力しようとしたとき、トビウオに番号がつくわけなんですけど、それじゃ遅い、主キーなんだから次のレコードに移動する前に入力してくれ、って言ってるわけです。



←[番号]が空っぽ(Null)は、困る〜と、言ってるわけです。

エラーは何とかしなくちゃいけないですけど、このエラーがどういう意味なのか、なぜ起こるのか、しっかり把握しておかないといけませんよね。これは、

 [番号]が主キーだから
 フォームの「挿入時」に[番号]がつくようにしているから


この二つの条件が重なったとき、起こります。[番号]が主キーじゃなければ特に問題ないはずです。今までそうでしたもんね。
それ以前に、


 番号を自動的に採番したい


なんてことを人間が考えるから、ややこしいことが次々起こるのです。

といっても、やらなきゃならんことはやらなきゃいけませんよね。「じゃあどうすればいいんですか」とかキレないで・・・(涙)
いきなりすっごく複雑でテキストボックスとかいっぱいあるフォームを作っちゃってからだと、問題の本筋が見えにくくなっちゃいますから、ちっちゃいフォームとちっちゃいテーブルで、しっかりその辺押さえていってください。


んじゃ、イベントのタイミングを変更してみましょう。
じゃ、その辺検討するとして、フォームの挿入後処理のイベント、もう一度見てみましょう。

「挿入前処理」に変更してみましょうか。
↓下の図の、ピンク色の部分をクリックして、BeforeInsertというイベントを選んでみてください。
すると、新しい行ができると思います。

で、AfterInsertの下に書いていた3行を、BeforeInsertの下に移します。もう一度入力しなおしてもよいし、切り取り/貼り付けをしてもオッケー。で、必ず、AfterInsertの方は削除しておきましょう。なぜって、残しといたら2回実行しちゃうじゃないですか。ねえ。
上のように、Form_AfterInsert() End Sub の2行は残しておいてもよいですし、この2行も根こそぎ削除しちゃってもオッケーです。具体的な処理内容3行を、BeforeInsertの下に移してください。


これでどうかな。少なくとも今度は「名前」の入力をした瞬間に、新しい番号が付けられるはずです。
フォームを保存しながらいったん閉じ、改めて開いてみて、名前の入力をしてみてください。1件入力できたら、ウニボタンをクリックして、新規入力行に移動して・・・今度はエラー出ませんよね。

BeforeInsertでなければならない、というわけではないのです。とにかく、次のレコードに移動する前に、何とかして番号をゲットできればよいので、後は、[名前]のテキストボックスの更新後処理イベントとか、他にもタイミングはいろいろ考えられると思います。っていうか、多分皆さんがこれから作るフォームってこんなに単純じゃないと思いますんで、そのフォームのデザインとか、入力のときの操作とかが、番号を振るタイミングに大きく影響してくる可能性大ですよね。
これから「自動採番させたいなぁ」と思っているテーブルがあるようでしたら、そのテーブルへの入力フォームとかをじっくり検討して、まずはいろいろテスト走行させてみてくださいね。


ウニボタンで新規入力行に移動するのが、イマイチかっこ悪いなあと思ったら、じゃあ、そういうボタンを自作しましょうかね。
なんか適当なコマンドボタンをフッター部分にでも作って(詳細部分でもいいですけど)、クリック時のイベントで、
こんな感じで。


いろいろ考えないとならないですけど・・・逆を言えば、いろいろな仕組みを作りこむことができるわけで、うまく利用しながら業務に合った仕組みを考えていってください。基本は「テーブルの中の値の最大値に1を足す」ですよ。後はそれを、どのタイミングでどうやって動かすか、数値なのかテキストなのか、主キーか、ということを、いろいろつめていきましょう。できれば、いきなり超複雑な番号をつけようとせず、まずは1,2,3、次に01、02、03、次にA01、A02、A03・・・という具合に、ちょっとずつ進化させながらテストを繰り返していってみてください。その過程で、もっとよい方法が見つかるかもしれません。


んじゃ、改めてテストを・・・。なんだか妙なレコードばっかりになっちゃったんで、テーブルの中のレコードを全部削除して、1からやり直してみましょう。

で、テーブル閉じて、もう一度フォームを開いてみましょう。

ありー・・・数字がない・・・。???AAA-しか出ないぞ・・・。


さて、これも「テキスト型」だから、なんですけど・・・。数値型のときって、番号の入力してないうちって、0ってなってましたよね。確か。
なので、テーブルに1件もレコードがないときは、[番号]の最大値は0で、0に1を足せば、1になります。1レコード目の[番号]は1になるはずです。
でも、テキスト型だと・・・空欄です。まだ入力がなされてない未使用のフィールド、ということで、コンピュータ業界ではNull値、と呼んでる状態であります。Nullに1を足しても、Nullです。っていうか、そんな計算は成立しません。

そこで・・・えー、めんどくさいけど・・・。
テーブルの中に1件もレコードがない場合は、無条件でAAA-00000001、レコードが1件でもある場合は従来の処理、という具合に、条件判断をさせて処理を分岐させます。きえーめんどくさい。
こんな感じかな・・・。

じゃ、フォームを閉じて、テーブル開いてください。中途半端なレコードが入力されちゃってるようでしたらそいつは削除して、再び1件もない状態にしましょう。

でもって・・・。
改めてフォームを開いて、実験です。カメは、何番?
番号、つきました?