|
初めて質問させていただきます。
現在、社内システムをAccessで構築していますが、
INSERT INTOやDELETEのSQLをVBAから実行する際、
実行方法によってはデータベースへの反映に
時間がかかり、SQL実行直後にデータを拾おうと
すると更新前のデータになってしまうことがあり、
困っています。
具体的には、ある帳票フォームにレコードの削除・更新等のボタンを配置し、
そのクリックイベントとして以下のようなものを書いています。
−−−−−−−−−−−−−−−−−−−−−−−−−−
環境
Windows 7 Pro 32bit
Access 2013
※説明の簡略化のためエラートラップは省略しています
Dim strSQL As String
Dim WSP As Workspace
Dim DB as DAO.Database
strSQL = "削除クエリ、追加クエリ等"
'↓↓Execute使用パターン↓↓
Set WSP = Workspaces(0)
Set DB = CurrentDb
WSP.BeginTrans
DB.Execute strSQL
WSP.CommitTrans dbForceOSFlush
DBEngine.Idle dbRefreshCache
Set DB = Nothing
Set WSP = Nothing
'↑↑Execute使用パターン↑↑
'↓↓DoCmd.RunSQL使用パターン↓↓
DoCmd.RunSQL strSQL
'↑↑DoCmd.RunSQL使用パターン↑↑
Me.Requery
−−−−−−−−−−−−−−−−−−−−−−−−−−
実は元々DoCmd.RunSQLを使っており、その際は問題なかったのですが、
複数のSQLを連続して使う際にあまりよくないと聞いたもので、
Database.Executeを使うパターンに切り替えたのです。
しかし、そうすると、Me.Requeryをしたにも拘わらず、更新前の
ままになってしまいます。また、別のフォームで、
Me.RequeryのところにDLookupを使っているものがあるのですが、
そちらでも、更新前のデータしか得られません。
ただ、Me.RequeryやDLookupの前にMsgBoxやSleepで
5秒程度(2〜3秒ではうまくいくことといかないことがある)
待ってやると、うまく更新後のデータが拾えるようです。
このことから、キャッシュによるラグが生じていると予想
されるのですが、その対策として
WSP.CommitTrans dbForceOSFlush
DBEngine.Idle dbRefreshCache
を入れているのに、改善されません。
なお、更新対象のテーブルはサーバー上のAccdb(データ専用)に
リンクしているものと、ユーザー側のAccdb(プログラム用)に
システムデータ用に使っているものがありますが、どちらの
テーブルでも同じことが起こります。プログラム用のテーブル
相手でも起こることから、少なくともそちらはサーバーとの
接続速度の問題ではないと思うのですが…。
一応、Sleepで待ってやれば対応出来るのですが、それは
うっとうしいし、なんとか即時反映させたいのですが…
どなたか、お知恵を拝借出来ないでしょうか。
|
|