dポイントプレゼントキャンペーン実施中!

Accessで自前の自動採番処理で採番テーブルを作り、その採番テーブルに格納してある最後の主キーのNO.を取得して、それに1加算したものを、新規レコードの主キーの自動採番処理結果として設定するやり方を考えていますが、その場合に

1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合には、採番がうまくいくのでしょうか?行かない場合には、その対処策はありますでしょうか。

2) 一行、または、複数行を削除した場合には、採番は既に登録済みの最後のNo.から自動採番するようになると思いますが、通常のアクセスのシステムでは、このような挙動で宜しいのでしょうか?

ご回答のほうよろしくお願いします。

A 回答 (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= …

私からは以上です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。マルチタスクなら忘れてと言われましても、なかなか忘れられませんのですが・・・

このリンクの先のソースを見ましたけど
>' テーブルを排他オープン (テーブルが使用中の場合はここでエラーが発生)
> Set rs = db.OpenRecordset(TableName, dbOpenTable, _
> dbDenyRead Or dbDenyWrite)

このOptionのおまじないで、レコードセットを閉じるまでは他のユーザがそのテーブルを開く事は出来ないようですが、これを使えば、例えば、採番テーブルの更新を、例えば、単票Form(非連結)のもので、新規レコードの登録をスル場合に、行えば、邪魔されずに+1した番号を採番テーブルにセットできるということでしょうか?でも、同じデータの新規レコードを他のユーザも登録しようとした場合に、問題が起きるということでしょうか。これを考えだすと、混乱してしまいます。

例えば、単票Formにレコードを読み込む時、そのレコードの最終更新時間を取得しておき、登録処理で、再度、同じレコードの最終更新時間を取得して、その2つの時間を比較して、同じであれば、保存、違う場合、ユーザに知らせ、保存するか、キャンセルするか決めてもらうような処理を普通するのでしょうか?

なんとかならないものでしょうか。

忘れて下さいというのは、つまり、オートナンバーを使えということでしょうか。困りました。

お礼日時:2014/11/15 23:05

とりあえず取り込んでおいてから


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
のようなのを走らせればよろしいかと。
>エクセルなどから複数行データをコピーして貼り付け
ということはめったに行いませんけど。

一意の番号であれば問題ないので欠番があっても問題ありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

採番テーブルから主キーの値を取得して、それに+1したものを、例えば単票フォームの新規レコードの主キーにセットスル場合、単票フォームのロード時にこの処理をやればよいでしょうか?

そして、そこで入力したデータを「登録」ボタンを押して、テーブルAに登録する処理の時に、採番テーブルの主キーを更新する処理をやる・・・このような感じで宜しいのでしょうか?→取消ボタンを押した場合には、採番テーブルは処理しない

あと、帳票フォームの場合には
Form_BeforeUpdateの処理でこの採番テーブルから値を取得する処理を実行すれば良いのでしょうか?
帳票のAフォームにて、レコードを修正した場合、登録ボタンにて、採番テーブルを更新し、Aテーブルに変更内容を登録する・・・という感じで考えていますが、これで宜しいでしょうか?

次々に質問してしまい申し訳ありませんが、

よろしくお願いいたします。

お礼日時:2014/11/15 10:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す