Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2013)
更新クエリの連続実行について
投稿日時: 18/12/24 16:55:37
投稿者: 花・花・花

こんにちは、花・花・花です。
 
vba内で連続で実行される「更新クエリ」について、
「同期」をとってクエリの更新処理が終了してから次の更新クエリが
処理されるようにしたいと思っています。
 
現在のコードは、
 DoCmd.OpenQuery "更新クエリ名1"
 DoCmd.OpenQuery "更新クエリ名2"
のようにしています。
 
"更新クエリ名1"はテーブルAとテーブルBの1つのフールドが同じ場合
テーブルAのフィールドを更新する
"更新クエリ名2"はテーブルAとテーブルCの1つのフールドが同じ場合
テーブルAのフィールドを更新する
 
ネットで調べていると、「DoCmdは全て非同期」とのことが書いてあり、
少し不安になったので質問させていただきました。
 
質問1
上記例では「DoCmd.OpenQuery」ですが、この時、「非同期」のため
「データが不正確になったり、クエリの更新に時間がかかる」ような
ことが発生する可能性はありますか?
 
質問2
皆様は、vba内で連続で実行される「更新クエリ」についてどのような
コードを記述されますか?(ExecuteメソッドでSQL文を実行など)
 
以上、アドバイスいただけないでしょうか。

回答
投稿日時: 18/12/25 11:15:21
投稿者: Suzu

質問者さんは何をお求めになっているのでしょうか?
 
答え合わせ?
であれば、回答者さんが 提示されている内容で充分かと。。

投稿日時: 18/12/25 18:12:23
投稿者: 花・花・花

Suzuさま コメントありがとうございます。今日はクリスマスですね。
 
質問の書き方が分かりにくかったようで申し訳ありません。
 
この質問で求めているものは、
DoCmd.OpenQuery で複数のクエリをVBEで記述したときに問題が
発生すきる可能性があるか、ないか知りたかったためです。
 
私自身accessの知識が少ない状態で、他の人が作成しているaccessを
管理することになったため、問題が発生するなら、コードの書き換えを
検討しようと思って質問させていただきました。

回答
投稿日時: 18/12/26 09:43:54
投稿者: Suzu

可能性としてはあります。
 
 
解決をするのに、全部単純に Execute メソッドに入れ替えれば良いと言うだけではないです。
Docmd.〜 は 非同期にて実行される事は間違いありません。
それだけでななく、
 
1. 連結フォームへの入力
   フォームのレコードセットプロパティから取得したレコードセット
 
2. Docmd.OpenQuery/RunSQL(/Transfer〜) での レコード更新
 
3. フォームのレコードセットプロパティ【以外】から取得した
   ADOの レコード更新 (Execute/レコードセットへのレコード更新)
 
4. フォームのレコードセットプロパティ【以外】から取得した
   DAOの レコード更新 (Execute/レコードセットへのレコード更新)
 
1〜4 は、それぞれ、独立した接続です。
 
つまり、
1 で更新した内容は、直ぐに他の 2〜4 の レコードとして反映される保証がありません。
同様に、
2 の方法で更新した内容は、 1の方法、3/4 の方法 で 更新しようとした時、直ぐに反映される保証がない。
 
特にやりがちなのが、
・連結フォーム 上で更新 と レコードセット でも更新
・連結フォーム 上で更新 と Docmd.OpenQuery/RunSQL または ADO/DAOのExecute メソッド
   上記を行ったため、意図しない結果となります。
 
要は、【一貫した手法を用いて、処理を行いましょう】 という事です。

投稿日時: 18/12/26 15:43:20
投稿者: 花・花・花

Suzuさま 大変分かりやすく説明していただき、ありがとうございます。
 
内容についてよく理解できました。
頂いたアドバイスを元にコードを見てみると、「2」や「4」が混じったコードになっています。
これから少しずつコードの修正を行っていきます。
 
ご回答いただいた、Suzuさま、大切なお時間を割いてアドバイスをいただきありがとうございました。
  
これで解決とさせていただきます。