こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

自前採番処理について

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

よろしくお願いします。

投稿日時 - 2014-11-29 11:36:43

QNo.8841078

すぐに回答ほしいです

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

> また、テーブルと画面とで分割しようと考えています。

というのが、どのようなことを想定しているのか、理解できません。
もう少し具体的に説明してもらえますか。

とりあえず、これは無視して、

> ・連結フォームの場合でネットワークで複数ユーザ(二人~三人ほど)が使用する。
> ・非連結フォームの場合で、ネットワークで複数ユーザ(二人~三人ほど)が使用する。

複数ユーザーが同時接続するなら、採番管理用のテーブルを利用したほうがいいでしょう。

採番管理テーブルには現在の主キーの最大値を格納しておきます。
新規追加するときに、採番管理テーブルを排他ロックをかけて開き、取得した値に+1して、その値を入力テーブルの主キーに設定して、採番管理テーブルの値も更新します。
もし、採番管理テーブルを開こうとしてロックがかかっていた場合は、しばらく待って、再試行をするというようにします。

非連結テーブルの場合は、上記の処理を保存コマンドボタンに設定します。

連結フォームなら、フォームの更新前処理で、NewRecord のときに実行します。

投稿日時 - 2014-12-03 08:04:01

お礼

>> また、テーブルと画面とで分割しようと考えています。
私の説明不足ですみません。これは、サーバーにテーブルだけを起き、その他のフォーム、クエリー、モジュールなどをクライアント側に分割したものを配置するということです。
そのやり方ならば、複数で使用しても大丈夫だと考えています。
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したほうがよいというのがわかりましたので、この件はクローズさせて頂きたいと思います。

ありがとうございました。

投稿日時 - 2014-12-03 09:40:59

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.1

フォームは連結フォームなのか、非連結フォームなのか。

運用は、シングルユーザーなのか、ネットワークで複数ユーザーが共有しているのか。

どちらでしょうか。それによって、最適な方法は変わってきます。

とりあえず、連結でシングルユーザーなら、フォームの更新前処理で、DMax関数で最大値を取得して+1して代入するという処理で大丈夫でしょう。

If Me.NewRecord Then
Me.ID = Nz(DMax("ID","テーブル名"),0)+1
End If

投稿日時 - 2014-12-01 14:13:45

補足

ご回答ありがとうございます。
フォームは、
・連結フォームの場合でネットワークで複数ユーザ(二人~三人ほど)が使用する。
・非連結フォームの場合で、ネットワークで複数ユーザ(二人~三人ほど)が使用する。

の場合を想定しています。

また、テーブルと画面とで分割しようと考えています。

よろしくお願いします。

投稿日時 - 2014-12-02 10:24:19

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-