実は少し前ASPのところで質問した内容に似ているのですが
いまだ解決できず困っています。
内容は社員番号入力し表示された詳細を編集させる
処理なのですが、既に別のマシンから開かれている(表示されている)
社員番号の情報を取得する方法はないのでしょうか?
「既に別の人が編集中です。」のようなメッセージや
開く事はできてもなんらかのメッセージが画面上のどこかに表示
されて保存ボタンを押せなくなる等の処理をさせたいのですが。
社員番号等のデータをロック情報として別テーブルにもつ方法が
あると思うのですが異常終了時に情報が残ってしまうような気がして
気がすすみません。(データベースの構造はなるべく変更したくない)
参考になるホームページやキーワードだけでも構いませんので
よろしくお願いします。
Windows2000sp2
VB6sp5
ADO2.5
DAO3.6
No.1ベストアンサー
- 回答日時:
ADO+Microsoft.Jet.OLEDB.4.0+adOpenDynamic+adLockPessimistic条件下での回答とさせていただきます。
ご質問の内容から一般的なマスタメンテナンスを想定したのですが、1レコードを画面に表示して編集するのか、複数レコードを(リスト形式で)画面に表示するのかで回答を2つとさせていただきました。
1.1画面1レコードの場合
ADOで、悲観的ロックの場合、他のタスク(タスクA)が編集中のレコードを(タスクB)編集しようとした場合 「実行時エラー -2147467259 現在ロックされているので、更新できませんでした」が発生します。これは両タスクが同じレコードの場合のみ発生します。(編集を行わないと、開いただけでは発生しません)
これは逆に考えれば、今タスクBが編集を行おうとしたレコード自体がすでに、ロック中にあるわけですから、目的の処理を行えると思います。
2.1画面複数レコードの場合
上記を応用して、リストにマスタを展開した後、リスト上の現在編集カレント行を悲観的ロックで開き直します。 カレント行が変更になった場合には、変更になる前のオープンを破棄し、新カレント行を開き直してください。
この方法で、ロックのエラーを発生させる事が可能です。
----------
エラーを発生させる為。レコードをオープンした後に
Recordset.Fields("Key").value = Recordset.Fields("Key").value
のコードを処理させる事で、編集中の状態にさせる事が出来ます。
この方法ですと、不具合等で更新処理が走ってしまった場合もレコードの内容は安全だと思います。
お礼が遅くなり申し訳ありません。
1.ユーザがフォーム上で社員番号を入力しEnterキーを押す
2.社員番号に対する詳細が表示
3.ユーザが編集作業を行う
4.保存
というように考えているのですが
要するに2と3の間はupdateやデータベースのクローズを
行わないということなのでしょうか?
試してみます。ありがとうございました。
色々な方の意見も聞きたいのでしばらくの間、締め切らずに置いておきます。
No.2
- 回答日時:
説明が足りなくて申し訳ありません。
(__) (あくまで、自分で作るなら)具体的には1. 社員番号の入力確定
2. DBからレコードセット取得(adLockPessimistic)
3. Recordset.Fields("社員コード").value = Recordset.Fields("社員コード").value を処理
4. 3.でロックエラーならば、ユーザーに報告後、ReadOnlyにて再度取得後表示
5. 3.でエラーが発生しなければ、表示
6. 内容の編集
7. 確定処理(内容が変更されていればUpdate 内容が変更されなければ、単にClose)
おおまかに、上記のように作成します、参考になれば幸いです。
お礼が遅くなり申し訳ありません。
多少理解するのに時間がかかってしまいました。
なんとなくですがわかったような気がします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessのリンクテーブルのパスを相対パスにする方法について教えて頂きたいです 1 2023/02/08 13:29
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- gooのスマホ スマホF-51Bに緊急時情報画面でロックが掛かって解除できません。 3 2023/06/18 23:05
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- gooポイント gooポイントをdポイントに交換できない。 3 2022/04/22 20:39
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) Excelで、社外秘(閲覧のみ)と表示され、共有者が編集出来ないのですが 4 2023/06/20 17:54
- その他(プログラミング・Web制作) vbaで座標を指定してコマンドプロンプト画面を表示させる。 1 2023/01/09 16:06
- その他(開発・運用・管理) おんどとりWebStorage APIから温度情報を取得し表示したい 2 2023/08/03 09:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコードが存在しなかった場合
-
ヘッダレコードとトレーラレコ...
-
Access でレコードセレクタが押...
-
ワードの差込印刷で教えて下さ...
-
wordのマクロで思うように行き...
-
アクセスでレポートの1印刷内...
-
ADO VBA 実行時エラー3021
-
ACCESSで大量の更新を行うと「...
-
カレントレコードが無い事を判...
-
差し込み印刷のレコード数について
-
ADODBのRecordset.Deleteのエラ...
-
JSPのNULLレコード表示について...
-
データセットのレコード更新が...
-
ファイル書込みで一行もしくは...
-
DataGridViewの内容をDBに反映...
-
COBOLでのランダムアクセス
-
ロータスアプローチで、Aのアプ...
-
ACCESSのフォームで複数レコー...
-
DataGridViewの、選択されてい...
-
[VBA] ADOの Clone と AddNew
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
カレントレコードが無い事を判...
-
レコードが存在しなかった場合
-
ファイル書込みで一行もしくは...
-
DataGridViewの内容をDBに反映...
-
差し込み印刷のレコード数について
-
ワードの差込印刷で教えて下さ...
-
レコードセット(ADO.Recordset)...
-
アクセスでレポートの1印刷内...
-
JSPのNULLレコード表示について...
-
Access でレコードセレクタが押...
-
Line Inputで文字化け(助けて...
-
ヘッダレコードとトレーラレコ...
-
DataGridViewの、選択されてい...
-
サブフォームに新規レコードを...
-
ACCESSで大量の更新を行うと「...
-
[VBA] ADOの Clone と AddNew
-
DataGridViewにてセル以外をク...
-
サブレンジ分割されたNDB(富士...
-
VB6.0のIsNull関数に相当するもの
おすすめ情報