パソコン情報

【Access】VBA内SQL記述はクエリをSQLビューコードを貼ってもエラーになる

毎回書いてしまうかもしれませんが、

注意ポイント

何で同じAccess内での処理なのに、クエリから、SQLビューしたコードをVBA内に貼り付けるとエラーになるのでしょうか!?

ココがダメ

そのまま貼り付けて使えるようにしてくれればどれだけ楽な事か。

今回も非常に変換に時間が掛かったので備忘録にしておきます。

ちょっと複雑なテーブル追加クエリをSQLビュー

ま!ちょっと複雑なテーブル追加クエリになります。

これを何も考えずに、SQLビューにすると下記のようになりました。

INSERT INTO job_outsourcing_running_del ( 外注手配番号, 完納確認, 納品日 )
SELECT dbo_outsourcing_running.外注手配番号, dbo_outsourcing_running.完納確認, dbo_details_outsourcing_running.納品日
FROM (dbo_outsourcing_running LEFT JOIN dbo_details_outsourcing_running ON dbo_outsourcing_running.外注手配番号 = dbo_details_outsourcing_running.外注手配番号) INNER JOIN q_shimebi_DateCalc2 ON dbo_outsourcing_running.担当工程 = q_shimebi_DateCalc2.MNO
WHERE (((dbo_outsourcing_running.完納確認)="完 納") AND ((dbo_details_outsourcing_running.納品日) Between DateAdd("m",-6,[q_shimebi_DateCalc2]![開始日]) And DateAdd("m",-6,[q_shimebi_DateCalc2]![終了日]))) OR (((dbo_outsourcing_running.完納確認)="伝票済") AND ((dbo_details_outsourcing_running.納品日) Between DateAdd("m",-6,[q_shimebi_DateCalc2]![開始日]) And DateAdd("m",-6,[q_shimebi_DateCalc2]![終了日])));

これを、VBAのコードとしてそのまま貼り付けてもエラーになる事は分かっていましたので、

ポイント

無駄なカッコは削除して、ダブルコーテーションはシングルコーテーションに変換

基本的には、この考えでいいようですが、関数などが入っているとちょっと悩んでしまいます。

VBA内SQLへの変換、デバッグポイント

まず、SQLビューに変換すると改行もなく見づらいので適当に切って連結していった方がいいですね。

SQL = "コード "
SQL = SQL & "コード "
SQL = SQL & "コード "
SQL = SQL & "コード "
SQL = SQL & "コード"
cmd.CommandText = SQL
cmd.Execute

注意点として、複数に分けると、半角スペースとは入れ忘れるので注意が必要です。

SQLビューの最後に「;」がありますが、VBA内のSQLでは必要ないですね。

このように分けることで、行ごとに削除したり、加えたりして実行してみてエラー状況を確認できるので、エラーが無くなったら次の行をコメントアウトしてデバッグするというステップができます。

エラーが無くなった変換ポイント

                SQL = "INSERT INTO job_outsourcing_running_del ( 外注手配番号, 完納確認, 納品日 ) "    'go_月末処理4(作業テーブルにデータ追加)"
                SQL = SQL & "SELECT dbo_outsourcing_running.外注手配番号, dbo_outsourcing_running.完納確認, dbo_details_outsourcing_running.納品日 "
                SQL = SQL & "FROM (dbo_outsourcing_running LEFT JOIN dbo_details_outsourcing_running ON dbo_outsourcing_running.外注手配番号 = dbo_details_outsourcing_running.外注手配番号) INNER JOIN q_shimebi_DateCalc2 ON dbo_outsourcing_running.担当工程 = q_shimebi_DateCalc2.MNO "
                SQL = SQL & "WHERE dbo_outsourcing_running.完納確認='完 納' "
                SQL = SQL & "AND dbo_details_outsourcing_running.納品日 Between DateAdd('m',-6,[q_shimebi_DateCalc2]![開始日]) And DateAdd('m',-6,[q_shimebi_DateCalc2]![終了日])"
                SQL = SQL & "OR dbo_outsourcing_running.完納確認='伝票済' "
                SQL = SQL & "AND dbo_details_outsourcing_running.納品日 Between DateAdd('m',-6,[q_shimebi_DateCalc2]![開始日]) And DateAdd('m',-6,[q_shimebi_DateCalc2]![終了日])"
                cmd.CommandText = SQL
                cmd.Execute

 

この方のブログ記事を読まなかったら数日が経過していたかもしれません。

カッコが必要だなんて・・・何で!(怒)って感じです。

カッコを付けることでエラーが無くなりました。

 

SQL = SQL & "FROM (dbo_outsourcing_running LEFT JOIN dbo_details_outsourcing_running ON dbo_outsourcing_running.外注手配番号 = dbo_details_outsourcing_running.外注手配番号) INNER JOIN q_shimebi_DateCalc2 ON dbo_outsourcing_running.担当工程 = q_shimebi_DateCalc2.MNO "

次に、日本語の文字でデータを絞っている場合ですが、

SQL = SQL & "WHERE dbo_outsourcing_running.完納確認='完 納' "

SQLビューでは、ダブルコーテーションになっていますので、シングルコーテーションに変更するだけで大丈夫でした。

 

SQL = SQL & "AND dbo_details_outsourcing_running.納品日 Between DateAdd('m',-6,[q_shimebi_DateCalc2]![開始日]) And DateAdd('m',-6,[q_shimebi_DateCalc2]![終了日])"

 

ANDとかORとか、Between関数、DataAdd関数などを使った複雑な物ですが、「[ ]」のカッコを外して見たり色々と無駄な事をしてしまいましたが、結論的には、関数内のダブルコーテーションをシングルコーテーションに変えるだけで大丈夫でした。

 

今回の経験を踏まえて意識が変わったことは、

メモ

複雑なクエリでも、SQLビューにして改行を多用しながらデバッグしていけば意外と簡単にVBA内で使えるSQLコードになる

ことがわかりました。

沢山のクエリをトランザクション処理する上で本当に自信になりました。