Accessで自動採番処理で採番テーブルを作成する方法と注意点について

このQ&Aのポイント
  • Accessで自前の自動採番処理で採番テーブルを作成し、新規レコードの主キーの自動採番処理結果として設定する方法を考えています。
  • 質問1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合に、採番はうまくいくのかについて検討しています。
  • 質問2) 一行または複数行を削除した場合に、採番は既に登録済みの最後のNo.から自動採番するのかについて確認したいです。
回答を見る
  • ベストアンサー

Accessで自前の自動採番処理で採番テーブルを

Accessで自前の自動採番処理で採番テーブルを作り、その採番テーブルに格納してある最後の主キーのNO.を取得して、それに1加算したものを、新規レコードの主キーの自動採番処理結果として設定するやり方を考えていますが、その場合に 1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合には、採番がうまくいくのでしょうか?行かない場合には、その対処策はありますでしょうか。 2) 一行、または、複数行を削除した場合には、採番は既に登録済みの最後のNo.から自動採番するようになると思いますが、通常のアクセスのシステムでは、このような挙動で宜しいのでしょうか? ご回答のほうよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答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 私からは以上です。

superwonderful
質問者

お礼

ご回答ありがとうございます。マルチタスクなら忘れてと言われましても、なかなか忘れられませんのですが・・・ このリンクの先のソースを見ましたけど >' テーブルを排他オープン (テーブルが使用中の場合はここでエラーが発生) > Set rs = db.OpenRecordset(TableName, dbOpenTable, _ > dbDenyRead Or dbDenyWrite) このOptionのおまじないで、レコードセットを閉じるまでは他のユーザがそのテーブルを開く事は出来ないようですが、これを使えば、例えば、採番テーブルの更新を、例えば、単票Form(非連結)のもので、新規レコードの登録をスル場合に、行えば、邪魔されずに+1した番号を採番テーブルにセットできるということでしょうか?でも、同じデータの新規レコードを他のユーザも登録しようとした場合に、問題が起きるということでしょうか。これを考えだすと、混乱してしまいます。 例えば、単票Formにレコードを読み込む時、そのレコードの最終更新時間を取得しておき、登録処理で、再度、同じレコードの最終更新時間を取得して、その2つの時間を比較して、同じであれば、保存、違う場合、ユーザに知らせ、保存するか、キャンセルするか決めてもらうような処理を普通するのでしょうか? なんとかならないものでしょうか。 忘れて下さいというのは、つまり、オートナンバーを使えということでしょうか。困りました。

その他の回答 (1)

回答No.1

とりあえず取り込んでおいてから 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 のようなのを走らせればよろしいかと。 >エクセルなどから複数行データをコピーして貼り付け ということはめったに行いませんけど。 一意の番号であれば問題ないので欠番があっても問題ありません。

superwonderful
質問者

お礼

ご回答ありがとうございます。 採番テーブルから主キーの値を取得して、それに+1したものを、例えば単票フォームの新規レコードの主キーにセットスル場合、単票フォームのロード時にこの処理をやればよいでしょうか? そして、そこで入力したデータを「登録」ボタンを押して、テーブルAに登録する処理の時に、採番テーブルの主キーを更新する処理をやる・・・このような感じで宜しいのでしょうか?→取消ボタンを押した場合には、採番テーブルは処理しない あと、帳票フォームの場合には Form_BeforeUpdateの処理でこの採番テーブルから値を取得する処理を実行すれば良いのでしょうか? 帳票のAフォームにて、レコードを修正した場合、登録ボタンにて、採番テーブルを更新し、Aテーブルに変更内容を登録する・・・という感じで考えていますが、これで宜しいでしょうか? 次々に質問してしまい申し訳ありませんが、 よろしくお願いいたします。

関連するQ&A

  • 自前の採番処理をするとリレーションが

    自前の採番処理を作成するのが初めてなので質問したいのですが 自前の採番処理をしてオートナンバー型を主キーで使用しないようにすると、リレーションが、参照整合性のところが設定出来ません。自動連鎖更新など。 これは、普通のことでしょうか? あと、MainとSubのFormがある場合、Subフォームでの自動採番処理はどのようにすれば良いでしょうか? よろしくお願いします。

  • 自前採番処理について

    Access2013で、自前で採番処理をスル場合 以下のどちらが正しいでしょうか? 1) フォームの保存ボタンで、採番管理テーブルを参照して、現在の主キーのID番号を取得して、それに+1したものを採番管理テーブルに保存し、エラーがなければ、画面にセットして保存。 2) フォームのレコードソースのID番号の最大値を取得して、それに+1加算したものを採番管理テーブルに保存し、エラーがなければ、画面にセットし保存。 1) 2)どちらも、採番管理テーブルに+1した番号を保存する時にエラーが起きたら、画面は Me.Undoする。 よろしくお願いします。

  • アクセス2013で自前の自動採番をする時の主キーの

    アクセス2013で自前の自動採番をする時の主キーのデータ型を現在、十進型の18桁にしています。 他の人達は、自前の自動採番をする場合、テキスト型でするという質問を他のサイトで見かけた事がありますが、数字で自動採番処理を自前で作成する場合は、どのデータ型が宜しいのでしょうか? よろしくお願いします。

  • access 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 WinXP  access2002 顧客管理のシステムを作っています。 テーブル 顧客テーブル(主キーは顧客番号 テキスト型) 請求テーブル(主キーは請求番号 テキスト型) 明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。 顧客情報を入力するフォームを作りました。 主キーは顧客番号(テキスト型,入力モードON,インデックス いいえ)で 他のテキストボックス(例えば名前)に何かしら文字を入力すると自動で顧客番号を採番してくれます。 例:0001 0002 0003~ そしてそのフォームから請求書作成フォームに飛ぶように 「請求書作成ボタン」を作り、顧客情報も一緒にひっぱっていってくれる 請求書作成フォームを作りました。(入力したばかりの情報も最新の情報で更新してくれます。) ・・請求書作成フォームはサブフォームを使い3つのテーブルからなっています。・・ 親フォーム:顧客テーブルから。 子フォーム:請求テーブルから。 孫フォーム:明細テーブルから。 主キーは請求番号で(テキスト型,入力モードON,インデックス はい(重複なし)) 他のテキストボックス(例えば請求日)に何かしら入力すると自動で請求番号を採番してくれます。 例:A0001 そこで問題なのですが、顧客情報は入力する度、次々自動で採番してくれるんですが、 請求番号は一番最初のレコードの”A0001”だけ採番してくれて、 新しいレコードで請求書を作ろうとテキストボックスに文字を入力すると「型が一致しません」というエラーが出ます。 ○ エラー内容 アクションエラーの実行 条件 true アクション名 値の代入 引数 [請求番号],Format(DMax("請求番号","請求マスタ")+1,"A0001") マクロは・・(参考書を参考にしています、マクロ名:自動採番マクロ) ------------------------------------------------- 条件 : DCount("請求番号","請求テーブル")=0 アクション : 値の代入 アイテム  : [請求番号] 式     :"A0001" ------------------------------------------------- 条件    : ... アクション : マクロの中止 ------------------------------------------------- アクション : 値の代入 アイテム  : [請求番号] 式     : Format(DMax("請求番号","請求テーブル")+1,"A0001") ------------------------------------------------- となっています。 念のため、主キーの入力モードを切り替えたり、式の"A0001"を単純に"1"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • 自動採番について

    初心者です。 Access2000で銀行管理DBを作っています。 (1)テーブルを入金用と出金用それぞれに作成 (2)データ入力用フォームもそれぞれに作成します。 入力にあたって入力番号を自動採番にしたいと考えてますが、番号の構成は数値10桁で、"年" + "月" + "連番"の組み合わせにしたいのです。例:2003070001 入金用と出金用それぞれ別に入力番号をつけます。 これを実現するために「採番テーブル」を別に作成しなければいけないようですが、 (1)採番テーブルの定義の方法 (2)入力フォームで自動採番するためのVBA記述の方法 についてアドバイスいただけないでしょうか? よろしくお願いします。

  • Accessのテーブルへのデータインポートについて

    Accessのテーブルへのデータインポートについて Access2002で、A.mdbのTESTテーブルからB.mdbのTESTテーブル(構造は同じ)へテーブルデータをインポートしたいのです。 TESTテーブルの主キーはSEQ(オートナンバー)しかありません。 そのときに、コピー元とコピー先の主キーに重複があった場合、オートナンバーなので自動で再付番しデータが追加して欲しかったのですが、 Accessの機能のエクスポート、インポートでは、コピー先に主キーに重複があったデータは上書きされてしまいます。 テーブルを開き、データをコピー&ペーストしますと、ペーストしたときにオートナンバーで自動で再付番されます。 この方法でもいいのですが、データが数百万件あるので、現実的ではありません。 Accessのインポート・エクスポートで、オートナンバーで主キーを再付番してから、B.mdbのTESTテーブルにデータ追加する方法はないでしょうか? よろしくお願いいたします。

  • Access 複数テーブルのレコード自動更新

    Access初心者です。会社で業務の進捗状況を、Access2002を使って管理しています。 フィールド数が増えたので、以下のようにテーブルを分けることになりました。 Aテーブル(メイン)   管理No.(主キー、オートナンバーではない)    カテゴリ    作業内容    : Bテーブル   管理No.(主キー、オートナンバーではない)    チェック項目B-1   チェック項目B-2    : Cテーブル   管理No.(主キー、オートナンバーではない)    チェック項目C-1   チェック項目C-2    : という形式で、AとB・Cはクエリのリレーションシップで、「管理No.」を1対1で関連づけています。 AテーブルのもとのデータはExcelからインポートしますが、 Aテーブルのレコード数は増えますが、クエリには反映されません。 Aのレコードが増えたら、BやCも同時に増やすことはできますか?

  • ACCESS+SQL Serverで主キーを自動採番する

    ACCESS+SQL Serverで主キーを自動採番する ACCESSを独学で勉強を開始しているものです。 顧客管理のようなものを作りたいと思っているのですが、 オートナンバーではない主キー(顧客コード)を設定しているテーブルがあります。 顧客コードの構成はアルファベット1文字+数字8桁です。 そのうち、数字は西暦2桁+月2桁+日2桁+下2桁は連番です。 ACCESS2007プロジェクトで、SQL Server 2005 Express Editionへ接続しテーブルは作ってあり、既に顧客データが10件ほど入っています。 新規に顧客データを追加する際に、必要事項を入力し、登録ボタンを押した段階で顧客コードを自動生成し、重複チェックし、採番したいと考えています。 アルファベットは必要事項入力時に入力済み、日付もその日の日付を6桁設定し、とりあえず「01」と下2桁を採番して、現在のデータに同じものがないかチェックします。 そして、同じものがあれば「01」+1を繰り返しながらチェックしていくというようなコードはどのようにすればいいでしょうか? わかりづらいとは思いますが、よろしくお願いします。

  • Accessの主キーについて

    お願いいたします。 Accessの主キー設定について教えてください。 主キーの役割は、テーブルの中のレコードを区別 するための機能だと思いますが、 フィールドのデータ型をオートナンバー型にして おけば主キーの設定は必要ないのではないでしょう か? 主キーを設定する理由としては、参照整合性のため に行うという考え方で良いでしょうか? また、複数の主キーを設定するという場合のテーブ ル構成はどのような場合のシステムなのでしょうか? どうぞ教えてください。

  • 文字を含むIDの自動採番

    Access2013を使っています。 IDはテキスト型で、 A00000000 っていう書式なんですが、 新規レコード作成時のイベントで、ID自動採番(連番をふる)をしたいのですが、下記だと最初の1レコード(A00000001)以降がエラーになってしまいます。 Format(Nz(DMax("ID", "T_テーブル名"), 0) + 1, "\A00000000" ) もちろん、すでにあるIDがA00000001なので、DMaxが使えないんですが、どうやって分けてやったら良いのかわかりません。 やりたい結果は、新規レコード作成時に、IDが"A"&"8ケタの最大値+1"が自動に振られて、テーブルのIDフィールドにA00000001、A00000002・・・とデータ保持したいのです。 説明が判り辛くて恐縮ですが、ご教示お願いします。