- ベストアンサー
ACCESSのクエリ、SQLに変数を使うのに??
いつもお世話になっております。 ACCESS初心者です。行き詰ったため質問いたします。 どうか、ご教授お願いします。 アクセスのInsertクエリ実行時に変数を持たせたいです。 VBAコードにて、配列で格納している社員IDを1件ずつループして SyainCDにいれます。そこでSyainCDに値が入るたび、 SyainCDをWhere条件として、InsertSQLを実行したいです。 ■CODE■ SyainCD = SyainId(i) ※コード上ではSyainCDにきちんと値が 入ってきていることは確認済です。 また、SagyoYMD()というユーザ関数を用いて 作業日を取得する関数は正常に取得できます。 関数ではなく、コードの中の変数をSQLに組み込むことは 不可能なのでしょうか?? 実行するとエラーではなく、ダイアログでSyainCD を入力要求 が表示されてしまいます。。。。 ■実行クエリ INSERT INTO wrk_マスタテーブル SELECT * FROM [SELECT qry_ユニオンリンクテーブル.社員CD, qry_ユニオンリンクテーブル.作業日, Q_部署テーブル.部署名 FROM (Q_部署テーブル INNER JOIN ユニオンリンクテーブル ON Q_部署テーブル.社員CD = qry_ユニオンリンクテーブル.社員CD) ]. AS マスタテーブル WHERE マスタテーブル.社員CD = SyainCD AND マスタテーブル.作業日 = SagyoYMD(); よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>なるほど、変数を取得する関数をつくってしまえばよいのですね。 はい、そういう事ですね。 >というようにして実装しました。 2)の後半部分がよく分かりませんでした。(^^; しかし、問題が解決したのであれば、それで良いと思います。 答えは1つではありませんので、私の回答は単なる1例と捉えて下さい。 問題を解決するための参考になれば、それで良いのです。 実際の実装は、ご自由に行って頂ければ良いと思います。
その他の回答 (3)
[イミディエイト] ? CnnExecute("INSERT INTO tab1 (ID, Fld_1) VALUES (4, 'DDD');") True と、CnnExecute 関数は、SQL文を実行する関数です。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String) MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & CnnErrors.Description & Chr$(13) & _ "・Err.Number=" & CnnErrors.Number & Chr$(13) & _ "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute Dim isOK As Boolean Dim cnn As ADODB.Connection isOK = True Set cnn = CurrentProject.Connection With cnn .Errors.Clear .BeginTrans .Execute strSQL .CommitTrans End With Exit_CnnExecute: On Error Resume Next cnn.Close Set cnn = Nothing CnnExecute = isOK Exit Function Err_CnnExecute: isOK = False If cnn.Errors.Count > 0 Then ErrMessage cnn.Errors(0), strSQL cnn.RollbackTrans Else MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _ vbExclamation, " 関数エラーメッセージ" End If Resume Exit_CnnExecute End Function >実際は、INSERTする項目が多い為・・・ GetSQL関数の類を用意すれば、既存のクエリのSQL文を取得できます。 既存のクエリの一部を[%xxxxx%] としておけば簡単に置換して CNNExecute関数で実行できます。 [イミディエイト] ? GetSQL("tab1 クエリ") SELECT tab1.ID, tab1.fld_1 FROM tab1; Public Function GetSQL(ByVal QueryName As String) As String Dim MyQuery As DAO.QueryDef Set MyQuery = CurrentDb.QueryDefs(QueryName) GetSQL = MyQuery.SQL End Function やり方は、それぞれの好み、趣味の問題で・・・。
お礼
ありがとうございます。 今回は、クエリのSQLで実装してみます。 この先また、同様の箇所があると思いますので その際に様子をみて、CnnExecute 関数を利用してみたいと 思います。 ご親切なご回答ありがとうございました。
- venzou
- ベストアンサー率71% (311/435)
>関数ではなく、コードの中の変数をSQLに組み込むことは >不可能なのでしょうか?? 確かに、関数は認識されますが、変数は認識されません。 SyainCDをパブリック変数として宣言し、 SyainCDを返す関数を作れば、解決するのでは? Public SyainCD As Variant Public Function getSyainCD() As Variant getSyainCD = SyainCD End Function >マスタテーブル.社員CD = SyainCD AND マスタテーブル.社員CD = getSyainCD() AND ----------------------------------------------------------- クエリは使わず、VBA内で、SQL文を作り、実行する方法もあります。 その場合、変数は文字列として、SQL文内に埋め込みます。 Dim strSQL As String strSQL = "INSERT INTO wrk_マスタテーブル" & _ "SELECT *" & _ 中略 "WHERE" & _ "マスタテーブル.社員CD = " & SyainCD & " AND" & _ "マスタテーブル.作業日 = SagyoYMD();" CurrentDb.Execute strSQL
補足
上記の方法で解決しました! 以下、もし見解違いでしたらご指摘いただければ幸いです。 なるほど、変数を取得する関数をつくってしまえばよいのですね。 1)パブリック変数宣言、パブリック関数をつくる 2)SyainId(i)の処理()の中で、SyainId(i)をパブリック変数宣言にわたして、Call パブリック関数を行う 3)パブリック関数をSqlへわたす。 というようにして実装しました。
tab1: ID__fld_1 1___AAA 2___BBB 3___CCC 次は、tab1に上記の3つのレコードをインサートするサンプルコードです。 Private Sub コマンド0_Click() Dim I As Integer Dim strFld_1(3) As String strFld_1(1) = "AAA" strFld_1(2) = "BBB" strFld_1(3) = "CCC" For I = 1 To 3 CnnExecute "INSERT INTO tab1 (ID, Fld_1) VALUES (" & I & ",'" & strFld_1(I) & "');" Next I End Sub 一番簡単なのは、CnnExecute関数の類を用いて INSERT文を実行することです。 もちろん、クエリのSQL文の変数部にVBAで値を設定することも可能。 しかし、そうまでしてクエリを用いるのかどうかは疑問。 そこで、後者のやり方は割愛します。 なお、CNNExecute関数方式でOKであれば、関数も紹介します。
補足
すみません・・・ CnnExecute関数、調べましたがよくわかりませんでした。 教えてください。 上記のようにコードの中に、SQLを組み込むことも考慮したのですが 実際は、INSERTする項目が多い為、 DoCmd.OpenQuery "実行クエリ"という形で取りたいと思っています。 なるべく一番簡単なものを希望しています。 お手数おかけしますが、今一度、ご教授ください。
お礼
>2)の後半部分がよく分かりませんでした。(^^; すみません・・・見返してみて、 自身でもかなりわかりにくいと感じました・・・ >答えは1つではありませんので、私の回答は単なる1例と捉えて下さい。 >問題を解決するための参考になれば、それで良いのです。 とても参考になりました! 理解しながら先に進めていきます。 またなにかございましたらよろしくお願いします。