• ベストアンサー

自前採番処理について

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

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

  • ベストアンサー
回答No.2

> また、テーブルと画面とで分割しようと考えています。 というのが、どのようなことを想定しているのか、理解できません。 もう少し具体的に説明してもらえますか。 とりあえず、これは無視して、 > ・連結フォームの場合でネットワークで複数ユーザ(二人~三人ほど)が使用する。 > ・非連結フォームの場合で、ネットワークで複数ユーザ(二人~三人ほど)が使用する。 複数ユーザーが同時接続するなら、採番管理用のテーブルを利用したほうがいいでしょう。 採番管理テーブルには現在の主キーの最大値を格納しておきます。 新規追加するときに、採番管理テーブルを排他ロックをかけて開き、取得した値に+1して、その値を入力テーブルの主キーに設定して、採番管理テーブルの値も更新します。 もし、採番管理テーブルを開こうとしてロックがかかっていた場合は、しばらく待って、再試行をするというようにします。 非連結テーブルの場合は、上記の処理を保存コマンドボタンに設定します。 連結フォームなら、フォームの更新前処理で、NewRecord のときに実行します。

superwonderful
質問者

お礼

>> また、テーブルと画面とで分割しようと考えています。 私の説明不足ですみません。これは、サーバーにテーブルだけを起き、その他のフォーム、クエリー、モジュールなどをクライアント側に分割したものを配置するということです。 そのやり方ならば、複数で使用しても大丈夫だと考えています。 Accessのオプションで、複数利用時の設定にチェックもいれます。 また、PG側でも、Db.OpenRecordsetの実行では、Optionに、DenyRead, DenyWriteのようなものを設定し、採番テーブルへの他のマシーンからのアクセスを回避する設定にしています。 あと、採番管理テーブルにアクセスする時に、ロックがかかっている場合には、処理をdelayさせる記述も入れいます。 ただ、最初に採番管理テーブルにアクセスするときに排他的にアクセスし、それから更新するまで行うのは、コーディングに工夫しなくてはいけないかなと言う気がしています。 最初にレコード数の確認をスル場合、普通に確認するのであれば、 SQL="select max(*) from テーブル名 as MaxNo;" として、取得したRECに対して Rec.Closeをしなければいけませんが、そうすると、次のアクセスまでのコンマ秒の間に他の人のアクセスがありえますので、それでは排他的になりませんので SQL="Select * from 採番テーブル名;" としておいて、そのRecをPG側で操作して最後の更新まで行うと言う風に考えています。 hatenaさんがご紹介の保存、取消処理をイベントに入れるやり方と、採番テーブルの処理を合体させものをつくっています。 複数の人での使用の場合には、採番テーブルでの操作にしたほうがよい、また、採番テーブルのMAXの値を取得してそれに+1したほうがよいというのがわかりましたので、この件はクローズさせて頂きたいと思います。 ありがとうございました。

その他の回答 (1)

回答No.1

フォームは連結フォームなのか、非連結フォームなのか。 運用は、シングルユーザーなのか、ネットワークで複数ユーザーが共有しているのか。 どちらでしょうか。それによって、最適な方法は変わってきます。 とりあえず、連結でシングルユーザーなら、フォームの更新前処理で、DMax関数で最大値を取得して+1して代入するという処理で大丈夫でしょう。 If Me.NewRecord Then Me.ID = Nz(DMax("ID","テーブル名"),0)+1 End If

superwonderful
質問者

補足

ご回答ありがとうございます。 フォームは、 ・連結フォームの場合でネットワークで複数ユーザ(二人~三人ほど)が使用する。 ・非連結フォームの場合で、ネットワークで複数ユーザ(二人~三人ほど)が使用する。 の場合を想定しています。 また、テーブルと画面とで分割しようと考えています。 よろしくお願いします。

関連するQ&A

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

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

  • 自動採番について

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

  • 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"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • 2回目に画面のレコードセットの値が読めない

    メインフォームとサブフォームの画面゛て レコードソースは、ワークテーブルを参照し メインフォームの保存ボタンの処理で、 Private Sub 保存ボタン_Click()  Set mySubFm = Me![テーブル子].Form  Set myParFm = Forms(Me.name) '<== 親フォーム  Set Rec1 = myParFm.RecordsetClone  Set Rec2 = mySubFm.RecordsetClone  Lng受注ID = Rec1.Fields("受注ID").Value  Dim Rtn As Integer  ・レコードセットのデータを、本テーブルに更新する処理  ・自動採番した番号を、レコードセットのIDのフィールドにセット   Rec1.Edit   Rec1.Fields("ID").value = newID   Rec1.Update  ・Me.Requery '<== メインフォームの画面を更新  ・mySubFm.Requery '<==サブフォームの画面を更新  Set Rec1 = Nothing   Set Rec2 = nothing End Sub この処理を一度行い、更に、画面のサブレコードの値を変更して、保存ボタンを再度押すと、 Lng受注ID = Rec1.Fields("受注ID").Value の行で、 「オブジェクトが正しくないか、現在設定されていません」というエラーになります。 この原因はどうしたら解決出来ますでしょうか? よろしくお願いします。

  • Accessで指示書番号の自動採番

    入力フォームで指示書番号が自動採番され、テーブルにも保存されるようにするための方法を教えていただけないでしょうか。 テーブル:T_指示書 フィールド:指示書番号 フィールドはテキスト型で、番号の構成は8桁の番号で "年(二桁)" + "月(二桁)" +"部署番号(一桁、固定の数字)"+ "連番(三桁)" (例:09091001) という感じで、 年月が変われば、連番が001になるようにしたいです。 どなたか、ご教授いただければありがたいです。 よろしくおねがいします。 Access2002 winXP

  • MS Access 入力フォーム:自動採番

    Access2013での自動採番に関して2パターン教えて下さい。 質問(1):"顧客番号"の自動採番 【テーブル名】 顧客情報 【フィールド】 "顧客番号"、"顧客名"、"顧客名かな"、"顧客住所"、"電話番号"、"担当者"、"メール"・・・ <"顧客番号"の採番方法> 顧客名の頭文字を五十音順の「あかさたな」で行ごとに連番をつけて管理している。 例)) 「ABC商事」→エービーシーしょうじ→「あ‐01」 「東京印刷」→とうきょういんさつ→「た-01」 《やりたい事!》 入力フォームに新規で、「東西工業」を入力する際に "顧客名かな"を入力したら、"顧客番号"が自動的に採番されるようにしたい。 顧客名:東西工業 顧客名かな:とうざいこうぎょう 顧客番号:た-02 ←ココを自動採番にしたい ------------------------------------------------ 質問(2)"取引番号"の自動採番 【テーブル名】 取引情報 【フィールド】 "顧客番号"、"取引番号"、"顧客名"、"顧客名かな"、"住所"、"電話番号"、"担当者"、"メール"・・・ <"取引番号"の採番方法> 取引が発生した順で、"顧客番号"ごとに枝番をつけて管理している。 例)) 「ABC商事」→1/10の取引→"顧客番号":あ‐01、"取引番号":01 「ABC商事」→1/31の取引→"顧客番号":あ‐01、"取引番号":02 《やりたい事!》 入力フォームに新規で、「ABC商事」の2/15の取引情報を入力する際に "顧客番号"を入力したら、"取引番号"が自動的に採番されるようにしたい。 顧客名:ABC商事 顧客番号:あ‐01 取引日:2016/02/15 取引番号:03 ←ココを自動採番にしたい 説明がうまくできず、分かりにくいかとは思いますが 何とかお知恵をお借り出来れば助かります。 よろしくお願い致しますm(__)m

  • Accessで、ある行を並び替えた後に採番したい。

    初心者です。よろしくお願いいたします。 ACCESSで顧客データがあります。 部署、名前、住所・・・・といったテーブルを元 にして作成した入力フォームがあります。 ところが、最近になってデータごとにIDを振る ことになりました。しかも「まずは部署でソートを かけてから採番する」ということになりました。 通常でしたら、テーブルにオートナンバー型のフィールドを作成すればいいと思うのですが、その前に「部署」フィールドでソートをかけないといけないのです。 (1) データを追加する (2) 部署でソートをかける (3) (2)の状態で採番 ・・・・という流れにしたいのです。なので データを追加するたびに必ず最後に最新の状態 で採番し直す!と言った感じです。 上記のような方法はありますでしょうか。 よろしくお願いたします。

  • 【Access】区分別の採番方法の続き

    前回から質問させてもらっている採番の件です。 テーブルの情報は添付の通りなのですが、 今までの仮テーブルとは状況が少し違うのです、 たとえばA2LA校正という業務案件が1件ありましたら、 FR番号台帳のA2LA_FR_Numberと 校正情報番号台帳のA2LA校正番号の二つの番号を採番したいです。 FRNumberとは案件管理の番号です。 右の校正番号とは各校正業務に割振られる固有の番号で、 A2LA/Standard共に別々で番号を取りたいです。全ての採番の番号は受け付け順に 採番したいです。 すみませんが、よろしくお願いいたします。

  • 【Access】区分別の採番方法

    A、B、C区分別の採番方法について なるべくシンプルな方法で出来る方法がありましたらお教えください。 何度かACCESSも作成していますが、初心者に近いので、簡単な方法だと ありがたいです。 今業務管理テーブルと区分マスタテーブルと二つのテーブルがあります。 業務管理テーブルには 【業務管理番号】【A受注番号】【B受注番号】【C受注番号】【区分】【機器名】 【001】【19000】【-】【-】【A】【SIMULATOR】 【002】【-】【-】【19000】【C】【GENERATOR】 【003】【-】【-】【19001】【C】【SIMULATOR】 【004】【19001】【-】【-】【A】【SIMULATOR】 【005】【-】【19000】【-】【B】【AMPLIFIER】 【006】【-】【19001】【-】【B】【AMPLIFIER】 区分テーブルには 【区分コード】【区分名称】 【A】【簡易点検】 【B】【精密点検】 【C】【修理】 業務管理番号は1業務ごと連番で番号を採っています。 A/B/C受注番号は各区分ごとに番号を採ります。 区分はA/B/Cのどれかです。 機器名は点検・修理の対象となる機器名が入ります。 上段の業務管理テーブルを元に入力フォームを作成し、そのフォームから区分Aを入力して登録した時に業務管理テーブルのA受注番号に1が足されるようにしたいです。区分は一つのみしか選択しません。 よろしくお願い致します。

  • ISOで文書番号を品質記録に必ず採番しなければならないか

    小さな会社でISO取得にむけて、取り組んでいます。 文書管理規定では、採番するのが普通のように本に記載されていますが、必ず全ての文書に番号をつける必要があるのでしょうか? 外部文書は、文書名、発行年月日、版を管理して採番はしないと本にあります。 品質記録については、番号をつけずに文書名で管理したいと思うのですが、必ず番号をつけなければダメでしょうか? 記録をしっかりとっていて、台帳で管理していればOKになるでしょうか?