- ベストアンサー
Accessで自動採番処理で採番テーブルを作成する方法と注意点について
- Accessで自前の自動採番処理で採番テーブルを作成し、新規レコードの主キーの自動採番処理結果として設定する方法を考えています。
- 質問1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合に、採番はうまくいくのかについて検討しています。
- 質問2) 一行または複数行を削除した場合に、採番は既に登録済みの最後のNo.から自動採番するのかについて確認したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の サンプルです。 ※最後に採番テーブルの番号の値を変更するのが抜けてました。 rs.close:set rs =nothing の前に currentdb.execute("update 採番テーブル set 番号 =" & maxnum) を追加してください。 1レコードずつ手入力で行っている場合はまた別の話になります。 フォームのレコード移動時イベントに if me.newrecord then me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1 ・・・とかになりますが 採番テーブルの方の番号を更新するタイミングは更新前処理に行えば 良いでしょう。 が、もしかしてマルチユーザー環境で・・・と考えているのなら 全部忘れてください。ハードルがぐっと上がりますので確かな回答は出来ません。 こちらが参考になるかと思いますけど。。。 [VB] DAO でユーザー定義カウンターを実装する方法 http://support2.microsoft.com/default.aspx?scid=kb;ja;191253 私からは以上です。
その他の回答 (1)
- NotFound404
- ベストアンサー率70% (288/408)
とりあえず取り込んでおいてから dim db as database dim rs as dao.recordset dim MaxNum as long set db=currentdb set rs=db.openrecordset("select 番号 from 採番テーブル where 番号 is null",dbopendynaset) maxnum=dmax("番号","採番テーブル") do until rs.eof rs.edit maxnum=maxnum+1 rs!番号 = maxnum rs.update rs.movenext loop rs.close:set rs =nothing set db=nothing のようなのを走らせればよろしいかと。 >エクセルなどから複数行データをコピーして貼り付け ということはめったに行いませんけど。 一意の番号であれば問題ないので欠番があっても問題ありません。
お礼
ご回答ありがとうございます。 採番テーブルから主キーの値を取得して、それに+1したものを、例えば単票フォームの新規レコードの主キーにセットスル場合、単票フォームのロード時にこの処理をやればよいでしょうか? そして、そこで入力したデータを「登録」ボタンを押して、テーブルAに登録する処理の時に、採番テーブルの主キーを更新する処理をやる・・・このような感じで宜しいのでしょうか?→取消ボタンを押した場合には、採番テーブルは処理しない あと、帳票フォームの場合には Form_BeforeUpdateの処理でこの採番テーブルから値を取得する処理を実行すれば良いのでしょうか? 帳票のAフォームにて、レコードを修正した場合、登録ボタンにて、採番テーブルを更新し、Aテーブルに変更内容を登録する・・・という感じで考えていますが、これで宜しいでしょうか? 次々に質問してしまい申し訳ありませんが、 よろしくお願いいたします。
お礼
ご回答ありがとうございます。マルチタスクなら忘れてと言われましても、なかなか忘れられませんのですが・・・ このリンクの先のソースを見ましたけど >' テーブルを排他オープン (テーブルが使用中の場合はここでエラーが発生) > Set rs = db.OpenRecordset(TableName, dbOpenTable, _ > dbDenyRead Or dbDenyWrite) このOptionのおまじないで、レコードセットを閉じるまでは他のユーザがそのテーブルを開く事は出来ないようですが、これを使えば、例えば、採番テーブルの更新を、例えば、単票Form(非連結)のもので、新規レコードの登録をスル場合に、行えば、邪魔されずに+1した番号を採番テーブルにセットできるということでしょうか?でも、同じデータの新規レコードを他のユーザも登録しようとした場合に、問題が起きるということでしょうか。これを考えだすと、混乱してしまいます。 例えば、単票Formにレコードを読み込む時、そのレコードの最終更新時間を取得しておき、登録処理で、再度、同じレコードの最終更新時間を取得して、その2つの時間を比較して、同じであれば、保存、違う場合、ユーザに知らせ、保存するか、キャンセルするか決めてもらうような処理を普通するのでしょうか? なんとかならないものでしょうか。 忘れて下さいというのは、つまり、オートナンバーを使えということでしょうか。困りました。