データベースアクセス(Access)を使う上でVBA内でSQLを使いたい事は良くあるが、そのSQL内で関数を使おうとすると一気に難易度が上がり中々エラーから抜け出すことができなくなります。
そんな時に変数を使ってエラー回避する方法を見つけたました。
ダブルコーテーション?シングルコーテーション?
VBAのSQL内に関数が入ると、クエリからSQLビューした物を直接貼り付けてもエラーになります。
そこで、無駄なカッコを外した入り、ダブルコーテーションをシングルコーテーションに変えたりしてデバックするのですが、どうしてもエラーが解決できない事もあります。
SQL = "DELETE dbo_product_running.* " '処理7(製品繰越データの削除)" SQL = SQL & "FROM dbo_product_running " SQL = SQL & "WHERE (dbo_product_running.納品日 < DateAdd('m', 1, DLookup('月次処理年月','dbo_mst_月次', '終了確認='作業中'')) AND dbo_product_running.完納確認='完 納') " SQL = SQL & "OR (dbo_product_running.JNO Is Not Null " SQL = SQL & "AND dbo_product_running.納品日 < " & dadd_dt & ")" cmd.CommandText = SQL cmd.Execute
もっとシンプルなSQLならちゃんと動くのかもしれませんが、上記のようなSQLではエラーが出て、その後いろいろと試しましたが時間だけが過ぎていきました。
変数を使ってSQL外で計算する方法
ココがおすすめ
変数を使えば簡単にエラーが無くなりすんなりいく
ことがわかりました。
※途中のレコードセットや宣言などは省略してあります。
Dim dadd_dt As Date dadd_dt = DateAdd("m", 1, DLookup("月次処理年月", "dbo_mst_月次", "終了確認='作業中'")) SQL = "DELETE dbo_product_running.* " '処理7(製品繰越データの削除)" SQL = SQL & "FROM dbo_product_running " SQL = SQL & "WHERE (dbo_product_running.納品日 < " & dadd_dt & " AND dbo_product_running.完納確認='完 納') " SQL = SQL & "OR (dbo_product_running.JNO Is Not Null " SQL = SQL & "AND dbo_product_running.納品日 < " & dadd_dt & ")" cmd.CommandText = SQL cmd.Execute
ポイントは、
dadd_dt = DateAdd("m", 1, DLookup("月次処理年月", "dbo_mst_月次", "終了確認='作業中'"))
DateAdd何にDlookup関数がありますが、ダブルコーテーションをシングルコーテーションに変更することなくAccessのクエリをSQLビューに変換したものをそのまま使えます。
単語を設定する部分だけシングルコーテーションに変更しましたが、法則さえ分かっていれば難しくありませんでした。
SQL内に全てを入れようと頑張らずに、SQL外で計算させて変数に代入して、SQL内で計算させる方が簡単です。
SQL内での変数設定は、
" & dadd_dt & "
のように、
ココがポイント
「”& 変数 &”」とやるのがポイント
ですね。
私もこれで、だいぶエラーから回避されました。