パソコン(ソフト)

【Access】VBA内SQL記述で関数を使うのは難しいが、外で計算させ変数にすれば問題解決

マイクロソフトアクセス

データベースアクセス(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 & "

 

のように、

ココがポイント

”& 変数 &”」とやるのがポイント

 

ですね。

私もこれで、だいぶエラーから回避されました。

 

-パソコン(ソフト)
-, , , , , ,

Translate »

© 2020 PCTips