Microsoft Access 掲示板

選択クエリで抽出した値で、更新したい

16 コメント
views
4 フォロー

StrSQL =
    '" SELECT TOP 1 基4, 変位4, №" &

    '" FROM T_01地耐力" &
    '" WHERE T01地耐力.№ Between 1 And 9" &
    '" ORDER BY T_01_地耐力.変位4  DESC , T_01_地耐力.№ DESC;"

上記のクエリで表示された値と一致する、更新クエリを作成したいです。通常クエリですと、上記の選択クエリを名前を付けて保存し、一致するフィールドを[No.]をつなぎますよね。SQLではどのように表現するのですか?
やりたいことは、一致した[No.]のレコードの[基4]フィールドに”※”マークを付けたいです。お願いいたします

ちちみ
作成: 2023/09/06 (水) 13:05:54
通報 ...
1

提示のコードは構文エラーで実行できないものですが、実際のものは、前回の質問で正しいものに修正はできているということでよろしいですか。

やりたいことは、一致した[No.]のレコードの[基4]フィールドに”※”マークを付けたいです。

更新クエリ一発でやりたいということですか。
VBAでSQLを記述しているということは、VBAを使ってもいいということですか。

2
ちちみ 2023/09/06 (水) 15:08:20 2d148@1925b

説明不足ですみません。更新クエリ一発で解決できてしまうのでしたら、ぜひともお願いいたします。本当にやりたいことはVBAで基4, 変位4, の「4」を変数にして、for next 1~4 で実行したいのです。通常のクエリ処理しか行ったことがないので、選択クエリを作成し、その結果で更新クエリを実行する。という流れしか知らなかったです。変数に置き換える前に、固定の名前ままでSQLを見たほうが理解できると思いまして、今回と前回に質問を分けました。お願いいたします

3
hatena 2023/09/07 (木) 12:10:31 修正

更新したいテーブルは、T_01地耐力 ですか。
T_01地耐力 を特定の抽出条件で抽出して指定のフィールドで並べ替えて、先頭のレコードの[基4]フィールドを更新したいということですか。

だとしたら、VBAを使うなら、更新クエリではなく、VBAで更新した方が簡単そうです。

とりあえず考え方だけのコード例。

StrSQL = _
    " SELECT TOP 1 基4, 変位4, №" & _
    " FROM T_01地耐力" & _
    " WHERE T01地耐力.№ Between 1 And 9" & _
    " ORDER BY T_01_地耐力.変位4  DESC , T_01_地耐力.№ DESC;"
Set rs = CurrentDB.OpenRecordSet(StrSQL)
rs.Edit
rs![基4] = "※"
rs.UpDate
rs.Close
4
ちちみ 2023/09/07 (木) 12:33:34 2d148@1925b

ありがとうございます。VBAで直接更新ができるのですね。勉強不足ですみません。
では変数にしたいのなら以下のように変更すれば良いのでしょうか?

for A1=1 to 4
StrSQL1 =
    " SELECT TOP 1 基" & A1 & ", 変位" & A1 & ", №" &

    " FROM T_01地耐力" &
    " WHERE T01地耐力.№ Between 1 And 9" &
    " ORDER BY T_01_地耐力.変位" & A1 & "DESC , T_01_地耐力.№ DESC;"
Set rs = CurrentDB.OpenRecordSet(StrSQL)
rs.Edit
rs!"[基" & A1 &"] = '※'"
rs.UpDa[te
rs.Close
next

5

考え方はそれであってますが、そのコードではコンパイルエラーで実行できませんね。
前回の質問の内容を理解して書き直す必要があります。

あと、フィールドを文字列で参照する場合は、下記のような感じでFieldsプロパティを使います。

        rs.Fields("基4" & A1) = "※"
6
ちちみ 2023/09/07 (木) 16:33:12 2d148@1925b

上のコードを実行してみたのですが
        rs. "[基" & A1 & "]='※'"
のところで 構文エラー になってしまいました。 お願いいたします

7
ちちみ 2023/09/07 (木) 16:56:15 2d148@1925b

すみません。各構文に &_ に追加してコピーして、こちらに張り付けたのですが消えてしまっているようです。
実際のVBAには付いています。理解できているでしょうか?
フィールドを文字列で参照する方法、ありがとうございました。早速変更いたしました。
今度は  Set rs = CurrentDb.OpenRecordset(StrSQL) のところで 
実行時エラー3061 パラメータが少なすぎます。1をしてください になってしまいました。お願いたします

8

すみません。各構文に &_ に追加してコピーして、こちらに張り付けたのですが消えてしまっているようです。

そうでしたか。
この掲示板はマークダウン記法が使えますので、コードを掲載する場合、コードブロック内に記述すると、いいでしょう。

下記で使い方はを解説してますので、ご参考に。

Microsoft Access 掲示板
Microsoft Access 掲示板 の使い方
テキストの修飾について Markdown記法が使えます。また、入力欄の下のツールバーのボタンでも修飾できます。詳細は下記のリンクを参照ください。 読みやすい書き方について (Mar
zawazawa

今度は  Set rs = CurrentDb.OpenRecordset(StrSQL) のところで 
実行時エラー3061 パラメータが少なすぎます。1をしてください になってしまいました。お願いたします

StrSQLのSQL文が間違っているということですね。そのSQL文をクエリにデザインビューに貼り付けて開くことができるか確認してみてください。

9
ちちみ 2023/09/08 (金) 12:43:07 2d148@1925b

何度も申し訳ありません
記載方法のご説明、ありがとうございました。今度はちゃんと見えていますでしょうか?

クエリのデザインビューに変数に置き換える前の以下の分を張り付け、& _ と " を外して実行させてみました。

        StrSQL = _
            SELECT TOP 1 基4, 変位4, №
            FROM T_01_地耐力
            WHERE (T_01_地耐力.№ Between 1 And 9)
            ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC

クエリの画面では、表示されました。もう一度VBAに戻って & _ と " を付け実行すると

        StrSQL = _
            "SELECT TOP 1 基4, 変位4, №" & _
            "FROM T_01_地耐力" & _
            "WHERE (T_01_地耐力.№ Between 1 And 9)" & _
            "ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC"

今度は実行時エラー3075「WHERE № Between 1 And 9 ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC」
演算子がありません になってしまいました。
お願いいたします

10
hiroton 2023/09/08 (金) 16:45:26 fe56d@f966d >> 9

前回の質問でも同じ補足をしましたが、VBAの文字列では改行をそのまま入力することはできません
_」はVBAコードとしての改行を無視するのみです

"SELECT TOP 1 基4, 変位4, №" & _
"FROM T_01_地耐力"

は、単に

"SELECT TOP 1 基4, 変位4, №" & "FROM T_01_地耐力"

として実行されます。この結果生成される文字列は

SELECT TOP 1 基4, 変位4, №FROM T_01_地耐力

となります。これでは、「SELECT句で№FROMフィールドを指定」という記述になってしまいますね
この直後ですでに構文エラーとなるような気もしますが、エラーメッセージがそのように出力されるのはよくわかりません


hirotonが提示したちょっと楽をする記述をするなら次の通りです

        StrSQL = _
            " SELECT TOP 1 基4, 変位4, №" & _
            " FROM T_01_地耐力" & _
            " WHERE (T_01_地耐力.№ Between 1 And 9)" & _
            " ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC"

        StrSQL =
            " SELECT TOP 1 基4, 変位4, №" &

            " FROM T_01地耐力" &
            " WHERE (T_01地耐力.№ Between 1 And 9)" &
            " ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC"

実際のSQL構文部分の各行で先頭に半角スペースを追加する形で記述します

SQL構文は「改行」と「半角スペース」が同じ役割をするので、VBAでは直接入力できない改行の代わりに半角スペースを使います。さらに、改行を行の最後に入力するかわりに、行の先頭で記述します

こうすることにより、
面倒な改行の入力が半角スペース1つで済む
インデントがそろって見やすい
行末(文字列の最後)という気づきにくいところでの記述漏れを防げる
というメリットがあります

11
hatena 2023/09/08 (金) 23:09:05 修正

既にhirotonさんの回答で解決できると思いますが、
VBAで生成したSQL文の確認方法をアドバイスしておきます。

下記のようにデバッグ用コードを挿入します。

        StrSQL = _
            "SELECT TOP 1 基4, 変位4, №" & _
            "FROM T_01_地耐力" & _
            "WHERE (T_01_地耐力.№ Between 1 And 9)" & _
            "ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC"
        Debug.Print StrSQL 'デバッグ用コード

これを実行するとイミディエイトウィンドウに、StrSQLに格納されている文字列が出力されますので、
それをコピーしてクエリのSQLビューに貼り付けます。
そしてこのクエリを開くことができれば、正しいSQL文が生成できているということです。
上記の場合だと、開くことができないはずです。
SQL文をよく見れば、区切りが適切にできていないのが分かります。

hirotonさんの回答のコードなら問題なく実行できるでしょう。

動作確認後はデバッグ用コードは不要なので削除しておいてください。

12
ちちみ 2023/09/13 (水) 16:58:58 2d148@1925b

お返事が遅くなり申し訳ありません。もう一度教えていただいた文章を読み直し、デバッグ用コードも使い書き直しまして無事に進めることができました。ありがとうございました。そのうえで追加質問をさせてください。
更新条件で[No]が1から9まで、[変位4]の値が一番大きいものに※マークを付けるだけではなく、でも一番大きい[変位4]の値が[No]が、9ではないものに限定したいです。通常のクエリなら2つ3つ重ねていけばできますがsqlでは、どのように追記すれば良いのでしょうか?おねがいいたします
'''" WHERE T_01地耐力.№ Between 1 And 9" &
            " ORDER BY T_01_地耐力.変位" & A1 & " DESC , T_01_地耐力.№ DESC;"
'''

13

更新条件で[No]が1から9まで、[変位4]の値が一番大きいものに※マークを付けるだけではなく、でも一番大きい[変位4]の値が[No]が、9ではないものに限定したいです。

抽出条件が、「[No]が1から9まで」かつ「[No]が、9ではないもの」ということでしょうか。
だとしたら、「[No]が1から8まで」ということになりますが、そういうことではないのですか。

ではなくて、
「[No]が1から9まで」の範囲で[変位4]か一番大きいレコードの[No]が9の時は※マークをつけない(更新しない)ということでしょうか。

14
ちちみ 2023/09/14 (木) 12:38:37 2d148@1925b

返信ありがとうございます。「[No]が1から9まで」の範囲で[変位4]か一番大きいレコードの[No]が9の時は※マークをつけない ということです。可能でしょうか?お願いいたします。

15

下記でどうでしょう。

    StrSQL = _
        " SELECT TOP 1 基4, 変位4, №" & _
        " FROM T_01_地耐力" & _
        " WHERE (T_01_地耐力.№ Between 1 And 9)" & _
        " ORDER BY T_01_地耐力.変位4 DESC , T_01_地耐力.№ DESC"
    Set rs = CurrentDB.OpenRecordSet(StrSQL)
    If rs![変位4] <> 9 Then
        rs.Edit
        rs![基4] = "※"
        rs.UpDate
        rs.Close
    End If
16
ちちみ 2023/09/14 (木) 15:39:15 2d148@1925b

そこに、IF式を入れるだけで、そんなに意味合いが変わるのですね!無事に出来上がりました。長々と本当に、本当にありがとうございました。