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

このQ&Aのポイント
  • 既に別のマシンから開かれている社員番号の情報を取得する方法はないのでしょうか?
  • 「既に別の人が編集中です。」のようなメッセージや、保存ボタンを押せなくなる処理をさせたいのですが。
  • データベースの構造を変更せずに社員番号等のデータをロック情報として別テーブルに持つ方法があると思うのですが、異常終了時に情報が残ってしまうような気がしています。
回答を見る
  • ベストアンサー

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

実は少し前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 のコードを処理させる事で、編集中の状態にさせる事が出来ます。 この方法ですと、不具合等で更新処理が走ってしまった場合もレコードの内容は安全だと思います。

sienna
質問者

お礼

お礼が遅くなり申し訳ありません。 1.ユーザがフォーム上で社員番号を入力しEnterキーを押す 2.社員番号に対する詳細が表示 3.ユーザが編集作業を行う 4.保存 というように考えているのですが 要するに2と3の間はupdateやデータベースのクローズを 行わないということなのでしょうか? 試してみます。ありがとうございました。 色々な方の意見も聞きたいのでしばらくの間、締め切らずに置いておきます。

その他の回答 (1)

回答No.2

説明が足りなくて申し訳ありません。(__) (あくまで、自分で作るなら)具体的には 1. 社員番号の入力確定 2. DBからレコードセット取得(adLockPessimistic) 3. Recordset.Fields("社員コード").value = Recordset.Fields("社員コード").value を処理 4. 3.でロックエラーならば、ユーザーに報告後、ReadOnlyにて再度取得後表示 5. 3.でエラーが発生しなければ、表示 6. 内容の編集 7. 確定処理(内容が変更されていればUpdate 内容が変更されなければ、単にClose) おおまかに、上記のように作成します、参考になれば幸いです。

sienna
質問者

お礼

お礼が遅くなり申し訳ありません。 多少理解するのに時間がかかってしまいました。 なんとなくですがわかったような気がします。 ありがとうございました。

関連するQ&A

  • レコードのロックについて

    Access2000のデータベースにロックをかけることは 可能でしょうか? 具体的には 社員番号を検索して該当の社員データをHTML形式で表示し その社員データを変更する処理なのですが 該当の社員データを開いている(表示している)間は 別の人がその社員のデータを開けない (もしくは「他の人が編集中」のメッセージを表示)ようにするには どのようにすれば良いですか? 別テーブルに編集中のデータ(社員番号)等を入れておいたり しなければならないのでしょうか? EditModeやLockTypeにて試してみたのですが・・・ 別の人が編集中であるかどうかを取得できればと考えています。 参考になるホームページ等でも構いませんのでよろしくおねがいします。

  • Accessにテーブルロックがかかっている?

    wshからADOを経由してmdbファイルへの読み書きをする処理をしています。このタスクをシングルで動かしている間は問題ありませんでしたが、並列で動かしているときに次のエラーが出てくるようになりました。 「ロックがかかっているので、更新できません」 処理内容としては、並列で動かしても同じレコードを同時に更新するような処理はないです。しかしこのメッセージが出てしまいます。 もしかしてテーブルロックがかかっているということでしょうか? もしそうだとすると、明示的にテーブルロックを外す(あるいはロックそのものを外す)コントロールの方法はあるのでしょうか?

  • データベース接続について。

    Suclipt初心者です、わかりずらいかもしれませんが宜しくお願い致します。 今Sucliptにてデータベースより持ってきたデータを検索画面に表示し詳細ボタンを押したら詳細画面に移るというものを作っています。 JSP(検索画面)→Servlet(処理)→DAO(DB接続)→DB→DAO(DB接続)→JSP(検索画面)表示 ボタンを押すと→Servlet2(処理)→DAO→DB→JSP2(詳細画面、削除、更新)という流れです。 検索画面 例 社員番号  年齢  名前  備考  詳細 111     22  ああ  ああ  詳細←その列のボタンを押すと 222     33  いい  いい  詳細 333     44  うう  うう  詳細 詳細画面 社員番号  111   ←プライマリーキー 年齢    22 名前    ああ 備考    ああ 更新    削除  この様に表示される。 他のボタンも同様。 今の問題は 例えば検索画面にて for(int i= 0; i<projMemberList.length;i++){ ・・・ <td bgcolor="white"><%=projMemberList[i].getProjectCode() %><input type="hidden" name="prmProjectCode" value="<%=projMemberList[i].getProjectCode() %>">;<%=projMemberList[i].getProjNameDate() %></td> ・・・・ こんな感じで検索画面の社員番号をDBから表示してしているのですが、 ボタンを押したときに運ばれる情報は一番最初の111しか運ばれず、どのボタンを押しても111の詳細画面になってしまいます。 この場合222のボタンを押したときに222の情報を出すにはどうしたらいいでしょうか??? わかりずらくてすいません!! 宜しくお願い致します!!

  • ACCESS97でテーブルをロック

    ACCESS97を使用しています。 例えばEXCELを使用する時に、他の誰かが使っていた場合 「~によって編集中です。メッセージを表示しますか?」 といったメッセージがでてきます。 そのように、ACCESSのテーブル単位で使用を制限することは可能でしょうか? 要望することは Access97のDBを複数のユーザーで使用したいのですが あるユーザーが使っている時は、他のユーザーには使用を制限すると共に 何らかのメッセージを表示。 また、使用していたユーザーが終われば自動的に別のメッセージに表示したい のです。

  • Access2010についてです。

    Accessリレーショナルシップ 参照性でエラーがでて しまい、 1対1になってしまいます(泣) テーブル (1)手当請求(社員番号、日付、日数) (2)社員データ(社員番号、名前、等級、職場) (3)等級別手当( 等級、金額) (4)等級別日額(社員番号、名前、職場、等級、金額) この3つをなんとか 関連付けをしたいのですが エラーがでてしまいます(泣) リレーショナルシップ テーブル作成クエリを利用して (4)に(3)の情報を組み込んで 表示させたいです。 社員番号を入力すると 名前や職場が飛ぶようにしたいです。 最終的には、 社員番号、名前、職場、等級、等級 と入力した日数 から割り出した金額を表示するレポート を作成したいです。 どなたか教えてくださいおねがいします!!

  • アクセスのデータベース内のデータをエクセルでみれるように・・・

    以前にも同様の質問があったやもしれないのですが、見つける事が出来ず・・・。 同じ事聞いていましたらごめんなさい(TcT) アクセスのテーブルにあるデータベース(行には管理番号・氏名・住所・電話番号等の情報)を エクセルで見たいのですが、データベースの情報が50万件程あり、エクセルにコピー等の方法ではデータが多すぎて移行出来ません。 そこで質問なんですが、 アクセスデータベースの管理番号(10桁位の数)をエクセルのセルに管理番号を入力すると、 入力した管理番号の行の情報のみを表示出来るような方法がありますか? 宜しくお願い致します。

  • IE8で2つのタブで同じサイトのアクセスを防止する

    ASPサービスでシステムを運営しています。 ユーザーはログイン後、画面入力した情報を送信し、データベースに登録します。 1人のユーザーが2回ログインして、2つの画面(タブ)を表示して、操作すると、データベースアクセスエラーが発生することがあります。これを防止するために、2つの対応を考えています。 (1)現在ログイン中のユーザーが、再ログインしてきたとき、警告メッセージを表示する。 (2)警告メッセージを無視してログインした場合、  ユーザーがログインするごとに異なる「ログイン番号」を付与して、ユーザー情報DBに保存し、  画面情報の中にも「ログイン番号」をもたせてPCに送る。(hiddenで)  Submitするときは「ログイン番号」を一緒に送信する。  サーバーに送られてきたデータのユーザーIDと「ログイン番号」を、  保存してあるユーザー情報DBの内容と照合し、不一致の時は、  「ログインしている画面と異なるので画面を閉してください。」とメッセージを表示する。 教えていただきたいこと。 (1)もっと簡単な方法をご存知であれば教えてください。 (2)この方法ではこのような場合にうまくいかない(欠点)、考え不足の点、注意点 などありましたら教えてください。 よろしくご教授のほどお願いします。

  • アクセスについて 追加クエリーの処理が上手くいかない。

    追加クエリーをデザインビューで開こうとしたとき、メッセージが表示されました。 メッセージ内容は 「デザインビューで、連結式 Aテーブル.受付番号 = Bテーブル.受付番号 を表示できません。」 と表示しました。 どういう原因をこのメッセージが表示されますか? たぶん、これが原因で追加クエリーの処理がうまいいかないと思います。 ご回答よろしくお願いします。

  • レコードロックする方法

    Access2013 VBA 今、アクセスのシステムを作っていますが、おおまかに書きますと ・フロントエンドとバックエンド ・ワークテーブルを使用してデータの編集をして、元テーブルに反映する処理 ・4人ぐらいの利用者を想定 この場合に、 ・レコードロックのようなやり方が可能か ・DAOを使用する場合に、今変更をしようとしているレコードにロックをかける方法はあるのか ・既に他の画面で開いている画面のレコードソースのテーブルを、後から開いた別画面の処理でOpenRecordsetでレコードセットを取得し、そのレコードを編集・新規追加したいのですが、この場合には、Optionには何を使用すれば良いでしょうか? ※先に開いている人には読み取りは可能 ※後から開いた人は、データの編集が可能にする ※先に開いた人が、後から開いた人がデータの編集をしている時に該当レコードの変更は出来ないようにしたい よろしくお願いします。 よろしくお願いします。

  • マクロで、次のコードへ行く前に時間をおくにはどうしたらいいのでしょうか?

    いつもお世話になっております。 早速質問なのですが、ADOで一旦データベースの内容を取り出した後、別のワークブックへコピーするというマクロを作っています。 問題は、データベースの内容を取り終わる前に別のワークブックへコピーする処理が始まってしまい困っています。 マクロの処理だけを一定時間止める方法、またはADOの処理が終わるのを待って次の処理へ進む方法はないものでしょうか? ご存知の方がいましたら、アドバイスをお願いします。