| 
    
     |  | >実は元々DoCmd.RunSQLを使っており、その際は問題なかったのですが、 >複数のSQLを連続して使う際にあまりよくないと聞いたもので、
 >Database.Executeを使うパターンに切り替えたのです。
 
 同期・非同期の問題ですね。
 
 RunSQL メソッドは非同期実行、Execute メソッドは同期実行と言われています。
 
 非同期実行というのは、例えば、RunSQL メソッドで追加クエリを実行した場合、
 追加クエリが完了しないうちに、VBAにおける次行のコードが実行されてしまうものです。
 このため、次行実行時には、まだレコードが追加されていないということが起こり得ます。
 そうなると、あると思っていたレコードがテーブルにはないということになってしまうので、
 思っていた結果にならないということになってしまいます。
 
 これに対し、同期実行であれは、追加クエリが完了しないうちは、
 VBAにおける次行のコードが実行されません。
 そのため、上記のような問題は生じません。
 
 こうしたことから、追加クエリの実行は、Execute メソッドを使った方がいいと言われています。
 
 
 >しかし、そうすると、Me.Requeryをしたにも拘わらず、更新前の
 >ままになってしまいます。また、別のフォームで、
 >Me.RequeryのところにDLookupを使っているものがあるのですが、
 >そちらでも、更新前のデータしか得られません。
 
 これらの事象は、非同期実行よる典型例だと思います。
 事態が逆転してしまっていますね。実に妙なことだと思います。困惑するばかりです。
 
 
 その原因はわかりません。
 
 ただ、強いて言えば、トランザクション処理にあるのかなと思います。
 
 トランザクション処理は、トランザクション中は、追加クエリなどの結果をメモリにとどめておき、
 CommitTrans により一気にファイルに書き込むものです。
 全く根拠はありませんが、ここが非同期実行になっているのかもしれません。
 だとすると、トランザクションをやめることが、一つの対策となるかもしれません。
 
 
 >WSP.CommitTrans dbForceOSFlush
 >
 >DBEngine.Idle dbRefreshCache
 
 dbForceOSFlush 定数とか、Idle メソッドとかがあるのは、全く知りませんでした。
 また、これらを使ったこともありません。
 なので、これらの効果や使用の是非については、私には何とも言えません。
 
 
 |  |