Access2013で、自前で採番処理をスル場合
以下のどちらが正しいでしょうか?
1) フォームの保存ボタンで、採番管理テーブルを参照して、現在の主キーのID番号を取得して、それに+1したものを採番管理テーブルに保存し、エラーがなければ、画面にセットして保存。
2) フォームのレコードソースのID番号の最大値を取得して、それに+1加算したものを採番管理テーブルに保存し、エラーがなければ、画面にセットし保存。
1) 2)どちらも、採番管理テーブルに+1した番号を保存する時にエラーが起きたら、画面は
Me.Undoする。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
> また、テーブルと画面とで分割しようと考えています。
というのが、どのようなことを想定しているのか、理解できません。
もう少し具体的に説明してもらえますか。
とりあえず、これは無視して、
> ・連結フォームの場合でネットワークで複数ユーザ(二人~三人ほど)が使用する。
> ・非連結フォームの場合で、ネットワークで複数ユーザ(二人~三人ほど)が使用する。
複数ユーザーが同時接続するなら、採番管理用のテーブルを利用したほうがいいでしょう。
採番管理テーブルには現在の主キーの最大値を格納しておきます。
新規追加するときに、採番管理テーブルを排他ロックをかけて開き、取得した値に+1して、その値を入力テーブルの主キーに設定して、採番管理テーブルの値も更新します。
もし、採番管理テーブルを開こうとしてロックがかかっていた場合は、しばらく待って、再試行をするというようにします。
非連結テーブルの場合は、上記の処理を保存コマンドボタンに設定します。
連結フォームなら、フォームの更新前処理で、NewRecord のときに実行します。
>> また、テーブルと画面とで分割しようと考えています。
私の説明不足ですみません。これは、サーバーにテーブルだけを起き、その他のフォーム、クエリー、モジュールなどをクライアント側に分割したものを配置するということです。
そのやり方ならば、複数で使用しても大丈夫だと考えています。
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したほうがよいというのがわかりましたので、この件はクローズさせて頂きたいと思います。
ありがとうございました。
No.1
- 回答日時:
フォームは連結フォームなのか、非連結フォームなのか。
運用は、シングルユーザーなのか、ネットワークで複数ユーザーが共有しているのか。
どちらでしょうか。それによって、最適な方法は変わってきます。
とりあえず、連結でシングルユーザーなら、フォームの更新前処理で、DMax関数で最大値を取得して+1して代入するという処理で大丈夫でしょう。
If Me.NewRecord Then
Me.ID = Nz(DMax("ID","テーブル名"),0)+1
End If
この回答への補足
ご回答ありがとうございます。
フォームは、
・連結フォームの場合でネットワークで複数ユーザ(二人~三人ほど)が使用する。
・非連結フォームの場合で、ネットワークで複数ユーザ(二人~三人ほど)が使用する。
の場合を想定しています。
また、テーブルと画面とで分割しようと考えています。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Access(アクセス) ACSESS初心者です マンション管理をACCESSで出来ないかとチャレンジしています。 リレーショ 3 2022/10/08 11:45
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
デザインビューで、連結式 を...
-
Accessでvlookupみたいなことは...
-
Accessの追加クエリで既存のテ...
-
3つの表を1つに縦に連結する
-
Accessクエリでの、LIKE条件
-
2つのテーブルを比較して一致し...
-
ACCESSに同時アクセス(編集)を...
-
Accessでテーブルにパスワード...
-
ACCESSで指定されたテーブルか...
-
Accessでテーブルからテーブル...
-
SQLで条件指定結合をしたいがNU...
-
DAOのTableDefs("TblName").Con...
-
Accessレコードの追加や変更が...
-
ACCESSで同じテーブルに...
-
SQL Serverでの検索時の文字の...
-
時間の足し算
-
ACCESS2000での円グラフ作成
-
MS ACCESS でのメッ...
-
アクセス2010 クロス集計クエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessレコードの追加や変更が...
-
ACCESSに同時アクセス(編集)を...
-
access テーブル内のレコード...
-
3つの表を1つに縦に連結する
-
Accessでvlookupみたいなことは...
-
Accessの追加クエリで既存のテ...
-
Accessクエリでの、LIKE条件
-
Accessでテーブルからテーブル...
-
ツリー構造をRDBで表現するには?
-
デザインビューで、連結式 を...
-
ACCESSで指定されたテーブルか...
-
2つのテーブルを比較して一致し...
-
リンクテーブルを CopyObject ...
-
SQLで日付を条件に削除したい
-
SQLで条件指定結合をしたいがNU...
-
時間の足し算
-
パススルークエリをテーブル作...
-
ODBCで接続するとDBに変更/追加...
-
INSERT時にデータ登録とmaxの発...
おすすめ情報