質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

Access vba アクションクエリを連続して実行するには?/エラー:更新可能なクエリであることが必要

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 10K+

score 132

よろしくお願いいたします。

ひとつのボタンクリックイベント時に、下記箇条書きの順番でアクションクエリを実行するロジックについて試行錯誤中です。
・更新クエリ(変数upSQL)①

・追加クエリ(変数addSQL)②

・削除クエリ(変数delSQL)③

テーブルの任意の行の値を2倍にして(更新)、2倍にした行のうちチェック(True)がついているものだけを結果テーブルに追加して(追加)、
追加した分は元のテーブルから削除する(削除)という流れです。
変数の中には、この仕組みに沿ったSQL文が代入されています。

ここで本題ですが、この3つを順番に実行していく方法がわからない為、とりあえず3つを
ただ順番に記述していったところ、アクションクエリ実行のコードは無視され、初めのメッセージと
最後のテーブルを開くコードのみが実行されました(もちろん、結果テーブルには内容は反映されず空の状態)。
なので、②と③を一旦コメントアウトして①の更新クエリのみ実行したところ、エラーが出ました。

【実行時エラー3073
更新可能なクエリであることが必要です。】

3つのアクションクエリを順に実行できるやり方と、更新アクションクエリ実行部分のコードの
エラーの解決策を教えていただけませんか。

色々と試行錯誤した結果解決が出来なかった為、
有職者の皆様、どうぞよろしくお願いいたします。

Private Sub 更新追加削除_Click()

If MsgBox("チェックのついたデータを更新して結果テーブルに追加しますか?", vbOKCancel) = vbOK Then
        If MsgBox("元のチェックデータは消えますがよろしいですか?", vbOKCancel) = vbOK Then

       ①更新クエリ  DoCmd.RunSQL upSQL //②と③をコメントアウトした場合、エラー

       ②追加クエリ DoCmd.RunSQL addSQL    

       ③削除クエリDoCmd.RunSQL delSQL


        End If

    DoCmd.OpenTable "アクションクエリ結果テーブル", , acAdd

    End If


End Sub


~追記~
各クエリの内容は以下です。

taddSQL = "INSERT INTO アクションクエリ結果テーブル ( 番号, 名前, 売上 ) SELECT テーブル名番号, テーブル名.名前, テーブル名.売上 FROM テーブル名 WHERE (((テーブル名.結果)=True))"
delSQL = "DELETE テーブル名.結果 FROM テーブル名 WHERE (((テーブル名.結果)=True))"
bkSQL = "SELECT テーブル名.番号, テーブル名.名前, テーブル名.分類, テーブル名.日付, テーブル名.売上, テーブル名.結果 INTO バックアップ_テーブル名 FROM テーブル名"

※ためしに作った下記コードのテーブル作成クエリのイベントがうまくいったので、
それを元に本題のコードを作っています。

~成功例~
※変数bkSQLには、テーブル作成アクションクエリのSQL文を代入しています。

If MsgBox("バックアップテーブルを作成します。", vbYesNo) = vbYes Then
        DoCmd.RunSQL bkSQL
            MsgBox "テーブルを作成しました。"
    End If
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kaz.Suenaga

    2016/05/16 12:04

    何かその書き込み先のテーブルや、それに関連するクエリを開きっぱなしで動作テストしたりしていませんか。

    キャンセル

  • kaz.Suenaga

    2016/05/16 12:06

    もう1点、upSQL の内容は提示いただけませんか。

    キャンセル

  • nekomura

    2016/05/16 12:59

    Suenaga様
    ありがとうございます。
    upSQL の内容は以下です。
    "UPDATE dbo_qAction SET dbo_qAction.売上 = [売上]*2"
    dbo_qAction が、テーブル名(リンクテーブル)です。

    >何かその書き込み先のテーブルや、それに関連するクエリを開きっぱなしで動作テストしたりしていませんか。
    →Access上では、閉じた状態で、イベントボタンをクリックして実行しています。。。
    よろしくお願いいたします。

    キャンセル

回答 3

checkベストアンサー

+1

UPDATE dbo_qAction SET dbo_qAction.売上 = [売上]*2"の最後の [売上]をdbo_qAction.[売上]としてはどうでしょうか。

また、テーブル名からするとSQLServerへのリンクテーブルな気がしますが、リンク先はテーブルでしょうか、viewでしょうか。

viewだとしたら、そのまま更新対象とするのは難しい気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/16 17:09

    Suenaga様
    エラーの際には、ずいぶんと幅広い視野をもってエラーを探し出さないといけないのですね。。
    私自身、まだ狭い範囲しか見ることができずエラーから抜け出すことがいつも出来ないので、本当に毎回ためになります。
    一旦現場を離れるので、明日には解決出来そうです。またご報告させてください。

    キャンセル

  • 2016/05/16 17:56

    どちらかというと、あまり推測や想像をせずに、淡々と「何ができないのか」をたどっていくことが近道ですよ。

    エラーが出る→何をしようとした時に出ているエラーか→何というエラーか→そのエラーが出るのはどういう場合か→・・・

    と、切り分けを行なっていくことが遠回りのようで一番スムーズです。
    その意味で前のコメントになった

    「ためしにdbo_qAction(リンクテーブル)と同じ内容のものをaccess上に作ってみて、本質問内容のコードを実行したところ更新クエリは実行できました。」

    これは非常に良い検証だと思います。
    これによって、データ構造やソースコードの問題ではなくて書き込む先の問題、というのがはっきりしましたよね。

    いい学習プロセスをたどっていると思いますよ。
    自分の手を動かして、見つけていくのが一番です。

    キャンセル

  • 2016/05/17 11:15

    Suenaga様
    技術的なことだけでなく、習得においての流れやコツもご教示頂き感謝です。
    ありがとうございます。
    毎回とても勉強になっています。
    今回は、無事に解決いたしました。
    取り急ぎのお礼、失礼いたします。

    キャンセル

+1

更新クエリの内容がまずいのではないでしょうか?
このあたりが参考になりそうです。
http://accessvba.blog.so-net.ne.jp/2012-01-11

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/13 17:05

    skuromaku様
    いつもお世話になっております。
    このサイトは知りませんでした、参考になりそうですね。
    これを元にもう少し試行錯誤してみます。
    よろしくお願いいたします。

    キャンセル

+1

がんばってますね。
回答をしたいところですが、以下が不明なため答えるのが難しいです。
・DoCmd.RunSQLの中身
・各クエリの詳細

たぶん更新クエリ(upSQL)に問題があるのではないかと思いますが…。

それから余談ですが、今回のように連続した処理をする場合、トランザクションを意識する必要があります。
3個あるクエリのうち、途中で失敗したらデータが中途半端な状態になってしまいますからね。

トランザクション開始
  ①更新クエリ  DoCmd.RunSQL upSQL
  ②追加クエリ DoCmd.RunSQL addSQL    
  ③削除クエリDoCmd.RunSQL delSQL
  コミット
エラー発生
  ロールバック

具体的な関数名とか手順は調べてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/16 17:07

    ttyp03 様
    本日は時間の都合でDAOでの実装は出来なかったのですが、
    >DAOであれば、DoCmd.RunSQLをCurrentDb.Executeに置き換えればすみそうですね。
    この方法(トランザクション)は、経験地の浅い私には思いつかないので、毎回新しい知識をご教示いただいけるので勉強になります。
    いつもありがとうございます。

    キャンセル

  • 2016/05/16 17:21

    トランザクションについてはデータベースを使う限り必ず出てくると思うので、頭に入れておいた方がいいですね。
    ところで削除クエリは解決できましたか?

    キャンセル

  • 2016/05/17 11:19

    ttyp03 様
    あの後上司から「トランザクションを学んでおくように」と言われ、おお!となりました。
    色々とご教示頂き大変助かっております。

    削除クエリですが、SQLserver側の認証をwindows認証からSQLserver認証に変更し、
    元のテーブルを設定しなおす事で(主キーや、Accessとの型の整合性)解決いたしました。
    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • VBAに関する質問
  • Access vba アクションクエリを連続して実行するには?/エラー:更新可能なクエリであることが必要