• 締切済み

Access2013Dir関数について

Access2013でフォームを開くときにDir関数を使い、リンクテーブル先(共有フォルダ)にlaccdbがないかを確認しています。 その際に誰も開いてないのにファイル存在有と出てしまうのですが、どうしてでしょうか。 また、laccdb確認をせずに意図的にリンクテーブルの元ファイルを開きlaccdbを作った状態でテーブル更新などを行いましたが、排他的エラーのメッセージが出ませんでした。ldbの時はうまくいったのですが、どうすればlaccdbを確認できますでしょうか。 何人かで共有するシステムのデータテーブルなので競合をスルーしてしまうと運用するのが怖く質問させていただきました。

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

laccdbやldbはプロセスが異常終了すると残ったままに なりますので、これをもって排他制御に使うのは問題が あります。一番簡単なのは普通のファイルを排他的に 開くことです。共有フォルダが仮に"Z:\"ならば Open "Z:\排他" For Output Lock Read Write As #1 とします。 後から同じファイルを開くプロセスはエラーになります。 On Error でエラーハンドリングを行い、エラーを検出 したら、それなりの処理をすればよいでしょう。 Dim エラー有無 As Long On Error Resume Next Open "Z:\排他" For Output Lock Read Write As #1 エラー有無 = Err.Number On Error GoTo 0 If エラー有無 = vbNormal Then   正常時の処理   Close #1 ’★Closeすると排他制御は解除される Else   異常時の処理 End If プロセスが終了した場合、そのプロセスが使用していた 資源(ファイル、メモリなど)はOSが解放してくれるます。 従って、「正常時の処理」の中でプロセスが異常終了した としても、排他用のファイルは自動的にCloseされるので、 運用上の対策は不要です。ファイルは内容を見る訳では ないので、容量も0です。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

2003の時の話ですがまれにldbファイルが残ったままの時がありましたので、いまでもそのような状態なのかもしれません。 ただ、テーブルのレコードを排他的に処理するように設定(デフォルトの設定はそうなっているかもしれません)しておけば、別に同時に同じテーブルを開いて別レコードを編集することに問題はないと思います。ただし、該当レコードの前後のレコードも排他的になっていたので、その部分は編集ができなくなります。かなり昔なのであいまいな記憶ですが、レコードの排他処理をしていない場合は、同一レコードを編集したときには後から編集を終了した側に他の人が編集し変更を加えた旨の警告が出て、自分の変更を有効にするかクリップボードにコピーするかの選択肢が出たと思います。 もし、laccdbの有無でアクセスの可否決定をしているのでしたらレコード単位の排他処理でよろしいのではないかと思います。

関連するQ&A