OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Access2000データベースのロックについて

  • すぐに回答を!
  • 質問No.188539
  • 閲覧数1199
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 100% (32/32)

実は少し前ASPのところで質問した内容に似ているのですが
いまだ解決できず困っています。

内容は社員番号入力し表示された詳細を編集させる
処理なのですが、既に別のマシンから開かれている(表示されている)
社員番号の情報を取得する方法はないのでしょうか?

「既に別の人が編集中です。」のようなメッセージや
開く事はできてもなんらかのメッセージが画面上のどこかに表示
されて保存ボタンを押せなくなる等の処理をさせたいのですが。

社員番号等のデータをロック情報として別テーブルにもつ方法が
あると思うのですが異常終了時に情報が残ってしまうような気がして
気がすすみません。(データベースの構造はなるべく変更したくない)


参考になるホームページやキーワードだけでも構いませんので
よろしくお願いします。

Windows2000sp2
VB6sp5
ADO2.5
DAO3.6
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル4

ベストアンサー率 20% (1/5)

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
のコードを処理させる事で、編集中の状態にさせる事が出来ます。

この方法ですと、不具合等で更新処理が走ってしまった場合もレコードの内容は安全だと思います。
お礼コメント
sienna

お礼率 100% (32/32)

お礼が遅くなり申し訳ありません。

1.ユーザがフォーム上で社員番号を入力しEnterキーを押す
2.社員番号に対する詳細が表示
3.ユーザが編集作業を行う
4.保存

というように考えているのですが
要するに2と3の間はupdateやデータベースのクローズを
行わないということなのでしょうか?

試してみます。ありがとうございました。


色々な方の意見も聞きたいのでしばらくの間、締め切らずに置いておきます。
投稿日時 - 2001-12-25 13:49:41
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2
レベル4

ベストアンサー率 20% (1/5)

説明が足りなくて申し訳ありません。(__) (あくまで、自分で作るなら)具体的には 1. 社員番号の入力確定 2. DBからレコードセット取得(adLockPessimistic) 3. Recordset.Fields("社員コード").value = Recordset.Fields("社員コード").value を処理 4. 3.でロックエラーな ...続きを読む
説明が足りなくて申し訳ありません。(__) (あくまで、自分で作るなら)具体的には

1. 社員番号の入力確定
2. DBからレコードセット取得(adLockPessimistic)
3. Recordset.Fields("社員コード").value = Recordset.Fields("社員コード").value を処理
4. 3.でロックエラーならば、ユーザーに報告後、ReadOnlyにて再度取得後表示
5. 3.でエラーが発生しなければ、表示
6. 内容の編集
7. 確定処理(内容が変更されていればUpdate 内容が変更されなければ、単にClose)

おおまかに、上記のように作成します、参考になれば幸いです。
お礼コメント
sienna

お礼率 100% (32/32)

お礼が遅くなり申し訳ありません。

多少理解するのに時間がかかってしまいました。
なんとなくですがわかったような気がします。

ありがとうございました。
投稿日時 - 2001-12-27 14:00:59
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ