Microsoft Access 掲示板

抽出したレコードが2件以上あったときの処理

15 コメント
views
4 フォロー
SELECT テーブル.[ID], テーブル.変位2
FROM テーブル
WHERE (((Tテーブル.[ID]) Between 1 And 9) AND ((テーブル.変位2)=DMax("変位2","テーブル","ID>=1 AND ID<=9")))
ORDER BY テーブル.ID DESC;

上記のように抽出したレコードの件数に応じて「記号」フィールドに"※"を付けたいです
sqlを教えていただけませんか?お願いいたします

ぽん
作成: 2023/10/03 (火) 16:59:18
通報 ...
1
hiroton 2023/10/04 (水) 09:06:47 5db83@f966d

更新クエリを使うと良いでしょう

更新クエリを作成して実行する

Google検索

SQL(構文)を見たいのであれば、クエリデザインで作成ののち、SQLビューに切り替えるのが簡単です

2
ぽん 2023/10/04 (水) 12:38:17 2d148@1925b

1件だったらこの処理。2件以上だったらこの処理、みたいな分け方をしたいのです。それはsqlではなくて、vbaの中でsolを書いてif分を付ける みたいな流れであっていますか?

3
hiroton 2023/10/04 (水) 13:03:28 5db83@f966d

「最後に求める処理」の規模によります
「件数」を求めること自体はSQL(または定義域集合関数(DCount))で出来るので、その値さえわかれば単純なクエリに落とし込める、ということであれば単一のクエリにすることもできるでしょう

使えるならVBAを入れたほうがいろいろと捗ると思います

4
ぽん 2023/10/05 (木) 15:21:28 2d148@1925b

ありがとうございます。SQLビューをみて簡単なものは、抽出できるようになりました。
次は、クエリの条件を下記のような条件にしたいです。
(テーブル.フィールド)=DMax("フィールド","テーブル","№>=1 AND №<=9")
vbaで処理したいので、フィールドは「変数」にしたいのですが、Dmax関数の中の変数の書き方がわかりませんでした。
お願いいたします

5
hiroton 2023/10/05 (木) 15:47:32 be2a0@f966d

全容と、問題としているポイントがわからないのでなんともですが、「SQL文をVBAで作ろうとして躓いている」ですかね?

VBA上では「"(ダブルクオーテーション)」で囲まれた部分は文字列として処理されます。その文字列内で「"」そのものを記述したい場合は、記述したい位置で「"」を2つ続けて記述します

文字列="DMax(""" & 変数 & """,""テーブル"",""№>=1 AND №<=9"")"

"DMax("""
 & 変数 &
""",""テーブル"",""№>=1 AND №<=9"")"

もしくは、SQLでは文字列を指定するのに「"」のほか「'」を使っても良いので

文字列="DMax('" & 変数 & "','テーブル','№>=1 AND №<=9')"

のように書き換えても動作します

6
ぽん 2023/10/06 (金) 15:52:37 2d148@1925b

つたない説明ですみません。クエリの抽出条件で「ダブルクオーテーション」を使うことは知っていたのですが、囲ってしまうと決め打ちの名前になってしまって思っていた変数として動かなくて...。「ダブルクオーテーション」を3つ使うと、固定した名前と変数と分けることができるのですね、ありがとうございます。ちなみに、これから覚えるとして「シングル」と「ダブル」どちらがおすすめでしょうか?

7
ぽん 2023/10/06 (金) 16:58:37 2d148@1925b

続けてすみません。SQLに使用したいので入力してみたのですがエラーになってしまいました。

テーブル.変数 & A1 = "DMax('" & 変数 & A1 & "','テーブル','№>=1 AND №<=9')"

A1は1から4まで変化していきます。こちらはfor Nextで回しています。
教えていただけますか?

8
hiroton 2023/10/06 (金) 17:41:36 19f27@f966d

難しい問題ですね。使用する言語それぞれについて知識を深め、それぞれ適切に使う。というあいまいな答えになってしまいます

前提として、自分がどのような言語を使っているのか?ということをはっきりさせておく必要があります。その言語というのが「VBA」と「SQL」となりますが、Microsoft Access上において、より厳密には「ACCESS VBA」と「ACCESS SQL」となります
特に、SQLは様々なデータベースで採用されていますが、それぞれのデータベースで少しずつカスタマイズされていて微妙に仕様が変わったりします

これらを踏まえて例えば、Microsoft Accessという環境の上で何かの処理をしたい場合、

ダブルクオーテーションで記述
DMax("変位2","テーブル","ID>=1 AND ID<=9")

という記述は、ACCESSのクエリデザインやフォーム上(テキストボックスのコントロールソース)、VBAなど、どこで記述しても使える記述ですが、

シングルクオーテーションで記述
DMax('変位2','テーブル','ID>=1 AND ID<=9')

は、VBAでは使えません。VBAではシングルクオーテーションはそれ以降をコメントとするという記述になるので、この記述は構文エラーになってしまいます
このような観点からは「SQL構文を直接VBAで操作する」というようなことが無ければ「ダブル」だけ覚えておけば済むともいえます
Accessというアプリケーションとしても、文字列として補完される場合はダブルクオーテーションが使われるのがデフォルトですね

しかしながら、今回の問題のように、VBAでSQL構文を作ることを考えた場合は、シングルクォーテーションを使ったほうが見やすい記述が少ないというメリットが得られます。コードを記述するうえではミスをしにくい記述を心がけるというのが大事になってくるので、「VBAでSQL構文を操作する場合に限って」はシングルクオーテーションを使えるようになったほうがいいと思います。

9
hiroton 2023/10/06 (金) 17:50:49 19f27@f966d

もう少し前後がないと何ともですが必要そうなところを記述すると

Dim strSQL As String
Dim フィールドカウンタ As Long

For フィールドカウンタ = 1 to 4
  strSQL = "テーブル.A" & フィールドカウンタ & " = DMax('A" & フィールドカウンタ & "','テーブル','№>=1 AND №<=9')"
Next

1~4と、数字部分だけが変わるのであればその前の部分までは直接文字列で記述しておけばいいです

10
ぽん 2023/10/10 (火) 16:38:43 2d148@1925b

ありがとうございます。直接文字列と A1 で入力したのですが

For A1 = 1 To 4

        StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"
        Set rs = CurrentDb.OpenRecordset(StrSQL)
        
        rs.MoveLast
        
        aaa = rs.RecordCount
        
        If aaa = 1 Then
        
        Else
        	MsgBox aaa
        End If
    Next

Dmaxの文章を追加したら「エラー13 型が一致しません」になってしまいました。
よろしくお願いいたします

11
hiroton 2023/10/10 (火) 18:00:28 af3cc@f966d

パッと見る限りは記述には問題なさそうですね。そのエラーが出たとき、デバッグボタンでエラーの出た行を表示するとどの行がハイライトしていますか?

12
ぽん 2023/10/11 (水) 12:30:47 2d148@1925b

ありがとうございます

StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"

の全文が黄色になってしまいました。

13
hiroton 2023/10/11 (水) 13:24:57 88156@f966d

以下、サンプルコードを実行してみました

Sub test()
Dim StrSQL As String
Dim A1 As Long
A1 = 1

'ここからコピペ    
StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"
'ここまでコピペ

Debug.Print StrSQL
End Sub

イミディエイトウィンドウには

SELECT A1, 変位1, № FROM テーブル WHERE テーブル.変位1 = DMax('変位1','テーブル','№>=1 AND №<=9') ORDER BY テーブル.変位1 DESC , テーブル.№ DESC;

と表示されエラーは発生しません

問題があるとすればStrSQLの型宣言が間違っているくらいですかね

14
ぽん 2023/10/11 (水) 15:33:54 2d148@1925b

ご指摘の通り宣言の型が違っておりました。さらっと解決いたしました。ありがとうございます!!

15
hiroton 2023/10/11 (水) 16:05:45 88156@f966d

では、ついでに
内容が具体的ではなかったのでクエリ側でDMax関数を使う形で回答していましたが、VBA上だけで完結する内容であれば、DMaxの計算は外に出してしまったほうが分かりやすくなると思います

Dim maxValue As Long 'ここの型宣言は適切なモノで


For A1 = 1 To 4

        maxValue = DMax("変位" & A1, "テーブル", "№>=1 AND №<=9")
        StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = " & maxValue _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"