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



■複雑な自動採番

今度は、もっと複雑な番号作成に挑んでみましょう。
基本は、左隣の「簡単な自動採番」と同じです。
番号を作って、テキストボックスに代入します。

まずこんなテーブルを用意しました。

で、[区分]と[コード]と[登録日]と、自動採番で作った[ID]を組み合わせて番号を作り、[番号]に代入します。
これもおなじことで、残念ながらテーブルだけではどうすることもできませんので、フォームと組み合わせて考えましょう。

で、その仕事をするのが、こういうフォームです。

ふつうの単票形式のフォームです。
が、[登録日]に自動的に今日の日付が表示されるようにプロパティにDate関数を使ったり、
いろいろ細かい動作をするように作ってあります。
でも、メインは番号を作るところですので、そこのお話をいたしましょう。

こういう処理をするとき、一番問題なのが、どのタイミングで採番するか、ということですね。

わたしは、[コード]に完全に値が入力されたら、つまり、[コード]になんか入力された後他にカーソルが移動したら・・・
「更新後処理」イベントでいこうと思います。特に決まったやり方はありませんので、ケースバイケースで考えてください。

そしてもうひとつ。[番号]は主キーにしています。
[番号]が作られないうちにフォームを閉じようとしたりすると、「インデックスにNullはイケマセン」と、エラーになって怒られてしまいます。
[番号]は空っぽはありえないんですよね。
なので、あたしはこういうとき、とりあえず仮番号をふって、後で本当の番号を付けるような処理をしたりします。
必要なさそうだったら、ここんとこは飛ばして先に進んでください。

仮番号は、このフォームの「挿入前処理」に書き込みます。

Private Sub Form_BeforeInsert(Cancel As Integer)
Me![番号] = "Z" & Format(DCount("番号", "テーブルB") + 1, "00000")
End Sub

これで、[区分]を選んだり、[登録日]を変更しようとした瞬間に、

こうなります。ちょっとわかりにくいですが。。。。
[区分]を選んだ後、[番号]にZ00001って番号が入るようになります。

これで、とりあえずこのままフォームを閉じちゃったり電源を切っちゃっ
たりしても、テーブルの中に仮番号がつくので安心
(別の意味で安心じゃないですけどね)。

で、後で、Z〜っていう番号のレコードだけクエリーで抽出して。。。。
あとは、どうにかすればいいですよね。



で、この後、[区分]の更新後処理に、例えばこんな処理を書きます。

Private Sub 区分_AfterUpdate()
Me![ID] = DCount("番号", "テーブルB") + 1)
DoCmd.GoToControl "コード"

End Sub

すると、[ID]欄に、テーブルの中の件数に1を足した数が入ります。この方法なら、レコード件数がゼロ件でも大丈夫ですね。
でも、この段階では000001という表示ではないです。ふつうの数値です。これはあとで調節します。

で、[コード]に何か入力された後、Enterキーを押したり他のとこクリックしたりした後、番号が作られるように、以下のように書きます。
[コード]の更新後処理です。

Private Sub コード_AfterUpdate()
Me![番号] = Me![区分] & "-" & Format(Me![登録日], "yy") & "-" & Me![コード] & Format(DCount("番号", "テーブルB") + 1, "00000")
End Sub

青い字のところは1行です。途中で改行しないで、一気に入力してください。

つまり、区分 - 登録日の西暦下二桁 - コード00000x という番号を作っているんです。

不規則に記号が並んでいるように見えますけど、ちゃんと法則がありますよ。じっくり観察してくださいね。

さて、これで、[コード]を入力した後Enterキーを押すか、
[商品名]をクリックして商品名を入力しようとした瞬間に、
新しい長いナンバーが作成されて現れるはずです。

入力されたものは、ちゃんとテーブルの中に格納されますね。

テーブルの中だけで自動的に番号を生成することはできません。
フォームの中にデータを入力するときに、タイミングよく番号を作って代入します。

なので、番号をどうやって作るかよりも、いつ作るか、ということが重要な鍵を握ります。
こればかりは、ケースバイケース。作ってみないとわからないこともありますので、いろいろ取り入れて試してみてください。


<ひとくちめも>

ダブルコーテーションと&(アンパサンド)の使い方の法則に慣れてしまいましょう。

1)そのまま表示したいものはダブルコーテーションで囲む。

2)変数だったり、フォーム名やテキストボックス名はそのまま明記する。

1)と2)が混在する場合は、&でつなぐ。

<例>

フォーム内の[コード]と[区分]というテキストボックスの中の値を−(ハイフン)でつないで、[番号]というテキストボックスに代入する場合↓

Me![番号] = Me![コード] & "-" & Me![区分]

フォーム内の[ID]というテキストボックスの中の値(数値)を、先行ゼロを含めて6桁にして、先頭にRという文字を付けて、[ナンバー]というテキストボックスに代入する場合↓

Me![ナンバー] = "R" & Format(Me![ID],"000000")

Format関数のカッコの中のダブルコーテーションは、Format関数の引数の表記に習ったものですので、詳しくはFormat関数のヘルプを見てくださいね。