Access vba アクションクエリの結果をテーブルに出したい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 10K+
よろしくお願いいたします。
下記コードで、更新クエリ(upSQL)→追加クエリ(addSQL)→削除クエリ(delSQL)を順に実行しています。
それぞれの○○SQLは変数で、以下のSQL文を代入しています。
upSQL = UPDATE アクションクエリテーブル SET アクションクエリテーブル.売上 = アクションクエリテーブル.[売上]*2
addSQL = INSERT INTO アクションクエリ結果テーブル ( 番号, 名前, 売上 ) SELECT アクションクエリテーブル.番号, アクションクエリテーブル.名前, アクションクエリテーブル.売上 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))"
delSQL = DELETE DISTINCTROW アクションクエリテーブル.結果 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))
コードは以下です。
Private Sub 更新追加削除_Click()
DoCmd.RunSQL upSQL
MsgBox "hoge"
DoCmd.RunSQL addSQL
MsgBox "hogehoge"
DoCmd.RunSQL delSQL
MsgBox "hogehogehoge"
DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd
End Sub
この中の追加クエリ(addSQL)の結果を、「アクションクエリ結果テーブル」と名づけた
テーブルに出力させたいのですが、実行後の当該テーブルは空のままです。
ちなみにエラーもありません。
追加クエリ(addSQL)のSQLは、テーブルに出力するINSERT文をかいているのですが…。
任意のテーブルにアクションクエリの結果データを出すにはどのようにすればよいでしょうか。
有職者の皆様方、お知恵をお貸しください。
コーディングの仕方のサンプルもお教え頂ければ勉強になり幸いです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
まず変数にSQL文を代入する時点で""で囲まれていない
という指摘があるのですが、これはコピペ誤りと信じて話を進めます。
>実行後の当該テーブルは空のまま
とのことですが、
①コード内で更新・追加・削除後に結果テーブルを表示しているけど結果データが表示されない
②言葉の通り、処理実行後に自分で結果テーブルを開いて中を確認してもINSERTされたはずのデータがINSERTされていない
のいずれかでしょうか?
まず①の場合ですが、これは単純にコードの問題で、
'DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd
DoCmd.OpenTable "アクションクエリ結果テーブル", , acEdit
とすることで結果表示されるものと思います。
(おそらくこちらの問題ではないかと推測します)
次に②の場合ですが、
実際、こちらで類似のテーブルを使って似たようなSQLを順に動作させましたが、INSERTも正しく行われました。
となるとコードの問題ではなく、SQLまたはデータの問題が考えられます。
とりあえずINSERTの対象となる抽出文
SELECT アクションクエリテーブル.番号, アクションクエリテーブル.名前, アクションクエリテーブル.売上 FROM アクションクエリテーブル WHERE (((アクションクエリテーブル.結果)=True))
を単独で実行してみて、対象データが取得できるか確認してみてください。
これで正しくデータ取得できているようであれば、(権限の問題で)INSERTに失敗しているか、または処理後に(提示されたコード外で)ロールバックされている等が考えられます。
ご確認ください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
こんにちは。
いつも的外れな回答をしてしまうので控えようと思っていたのですが…。
addSQLでは、アクションクエリテーブルからアクションクエリ結果テーブルにINSERTしてますよね。
そのアクションクエリテーブルの抽出条件に、結果=True
というのがありますが、結果カラムをTrueにするのはこの一連の処理とは別で、あらかじめ設定されているということでよろしいでしょうか?
いずれにしても、まずはaddSQL内のSELECTがきちんと抽出できていることを確認したほうが良いかと思います。
余談ですが、クエリ内で扱うテーブルがひとつであるなら、各カラムの前にテーブル名を書く必要はありません。
UPDATE アクションクエリテーブル SET 売上=売上*2
INSERT INTO アクションクエリ結果テーブル ( 番号, 名前, 売上 ) SELECT 番号, 名前, 売上 FROM アクションクエリテーブル WHERE 結果=True
DELETE DISTINCTROW 結果 FROM アクションクエリテーブル WHERE 結果=True
シンプルに書けるところは利用した方が間違いを発見しやすいですよ。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/18 15:23 編集
ご回答ありがとうございます。
ご教示の通り、
---DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd---
のacAdd部分をacEditへ変更いたしましたところ、内容が結果テーブルに出力されました。
ただ、結果テーブルに追加する内容として、更新クエリ(upSQL)で売上を二倍にするSQL文を書いているのですが、
---アクションクエリテーブル.[売上]*2---
なぜか売上価格ではなく、売上フィールドの数が二倍となって出力されてしまいました。
そこで、括弧を消して下記の様に試したところ、
---アクションクエリテーブル.売上*2---
再び結果テーブルには何も出なくなってしまいました。
重ね重ねのお伺いで申し訳ないのですが、今一度ご教示を頂ければ幸いです。
2016/05/18 16:28
というのが回答への道っぽいですね。
2016/05/18 16:49
いつもお世話になっております。
「売上価格」というフィールドは存在せず、「売上」フィールドに格納されている値が売上の価格(数値型)になっています。
更新クエリによって売上フィールドの中の値を二倍にして(100円なら倍の200円)にして、追加クエリによってその結果を”アクションクエリ結果テーブル”に出したいのですが、売上フィールドのレコード数自体が二倍(100レコード→200レコード)となって出力されてしまいました…。
2016/05/18 16:57
Suenaga様
連投失礼いたします。
もう一度同じコード(jawa様のご回答①)を実行したところ、期待通りの実行結果となりました。
????
フィールド数が2倍になり、今はならないのは謎のままですが、
Accessの学習教材で、「再クエリ」というものがあったのを思い出しました。
フォームなどを毎回消していないと更新が適用されない…といった内容です。
今回のような処理の場合は、再クエリのロジックを入れたほうが良いということになりますか?
その際は、Me.Requery と書けばよいのでしょうか…。
記述場所はDoCmd.OpenTableの前…?になるのでしょうか。
この点も、ご教示いただけると幸いです。
低次元な質問ばかりですがどうぞよろしくお願いいたします。
2016/05/18 17:19
結果テーブルがAccess上で既に開かれている状態でDoCmd.ShowTableすると変な表示になったりしますので、これも可能性として考えられます。
これを回避するには、nekomuraさんのおっしゃる通りDoCmd.Requeryで更新してあげればいいと思います。
ShowTableした直後なら結果テーブルがアクティブになっていると思いますので、
```
DoCmd.OpenTable "アクションクエリ結果テーブル", , acEdit
DoCmd.Requery
```
で更新後の状態が表示されると思います。
2016/05/18 17:27
なるほど…。
ロジックが出来次第、Accessファイルをアクションクエリ実行用にコピーして
作業していますが、途中から焦りのせいか
>クエリテーブルのデータを元に戻したり、結果テーブルのデータを消したりしながらテストを繰り返されていると思いますので、単純に結果テーブル削除漏れなども考えられますが(^-^;
↑と、なっていたのでしょうね。
いつも解決に導いてくださり感謝です!
先ほど頂きましたサンプルコードで、無事解決いたしました。