Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


340 / 9994 ←次へ | 前へ→

【12967】Re:Docmd.RunSQLだと問題ないのにDatabase.Exeuteだと反映にタイムラグが出る
回答  かるびの  - 16/3/10(木) 10:47 -

引用なし
パスワード
   >実は元々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 メソッドとかがあるのは、全く知りませんでした。
 また、これらを使ったこともありません。
 なので、これらの効果や使用の是非については、私には何とも言えません。

1,638 hits

【12965】Docmd.RunSQLだと問題ないのにDatabase.Exeuteだと反映にタイムラグが出る 亀マスター 16/3/9(水) 23:55 質問[未読]
【12967】Re:Docmd.RunSQLだと問題ないのにDatabase... かるびの 16/3/10(木) 10:47 回答[未読]
【12968】Re:Docmd.RunSQLだと問題ないのにDatabase... 亀マスター 16/3/11(金) 0:23 お礼[未読]
【12969】Re:Docmd.RunSQLだと問題ないのにDatabase... 亀マスター 16/3/14(月) 20:20 発言[未読]

340 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free