<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関数のヘルプを見てくださいね。