
いつもお世話になっております。
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();
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
>なるほど、変数を取得する関数をつくってしまえばよいのですね。
はい、そういう事ですね。
>というようにして実装しました。
2)の後半部分がよく分かりませんでした。(^^;
しかし、問題が解決したのであれば、それで良いと思います。
答えは1つではありませんので、私の回答は単なる1例と捉えて下さい。
問題を解決するための参考になれば、それで良いのです。
実際の実装は、ご自由に行って頂ければ良いと思います。
>2)の後半部分がよく分かりませんでした。(^^;
すみません・・・見返してみて、
自身でもかなりわかりにくいと感じました・・・
>答えは1つではありませんので、私の回答は単なる1例と捉えて下さい。
>問題を解決するための参考になれば、それで良いのです。
とても参考になりました!
理解しながら先に進めていきます。
またなにかございましたらよろしくお願いします。
No.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 関数を利用してみたいと
思います。
ご親切なご回答ありがとうございました。
No.2
- 回答日時:
>関数ではなく、コードの中の変数を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へわたす。
というようにして実装しました。
No.1
- 回答日時:
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 "実行クエリ"という形で取りたいと思っています。
なるべく一番簡単なものを希望しています。
お手数おかけしますが、今一度、ご教授ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS DCOUNTの抽出条件について
-
アクセスで定数を利用したい。
-
オートナンバー型の数字を振り...
-
データがあれば○○なければのSQL
-
SQLの外部結合について教えて下...
-
重複した複数のレコードを1レ...
-
VBAでテーブル名とカラム名を動...
-
ACCESS VBAでテーブル内の特定...
-
ACCESSで購入回数を表示する方...
-
Accessで縦と横を入れ替えたい
-
ACCESSのクエリ、SQLに変数を使...
-
SQLServer→Access インポート
-
別のaccessファイルからデータ...
-
抽出条件でデータ型が一致しま...
-
sql文で削除クエリを書く
-
Accessリンクするテーブルが見...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
Excelシート上のマクロを登録し...
-
EXCEL VBA マクロ 実行する度に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データがあれば○○なければのSQL
-
ACCESS DCOUNTの抽出条件について
-
【access】複数のフィールドの...
-
アクセスで連続データをテーブ...
-
Access vbaで重複レコードの削...
-
ACCESS VBAでテーブル内の特定...
-
SQLServer→Access インポート
-
VBAでテーブル名とカラム名を動...
-
sql文で削除クエリを書く
-
重複した複数のレコードを1レ...
-
抽出条件でデータ型が一致しま...
-
別のaccessファイルからデータ...
-
アクセスで定数を利用したい。
-
Accessで縦と横を入れ替えたい
-
DAOでSQLServerに接続し、LeftJ...
-
ACCESSのクエリ、SQLに変数を使...
-
ACCESSで実行時エラー3008
-
社員名簿から検索する関数
-
VB.NETでテーブルを作成
-
ACCESSで購入回数を表示する方...
おすすめ情報