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

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

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

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


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

Windows2000sp2
VB6sp5
ADO2.5
DAO3.6

A 回答 (2件)

説明が足りなくて申し訳ありません。

(__) (あくまで、自分で作るなら)具体的には

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

おおまかに、上記のように作成します、参考になれば幸いです。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2001/12/27 14:00

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

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

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

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

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

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


色々な方の意見も聞きたいのでしばらくの間、締め切らずに置いておきます。

お礼日時:2001/12/25 13:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報