Accessで作ったクエリで表示されるデータと、VBAでSQLを組んでそのクエリから抽出したデータが異なるので困っています。
ちょっと言葉では説明しにくいので表で説明します。
元となるテーブル(t_test)がたとえば以下のようになっているとします。
t_test
顧客id 商品id
1 A-1
2 A-2
3 B-1
4 A-1
これを元に、以下のようなクエリ(q_test)を作ります。
q_test
顧客id 商品id 式1: IIf([商品id] Like "A*",1,0)
1 A-1 1
2 A-2 1
3 B-1 0
4 A-1 1
VBAで以下のようなSQLを実行すると、なぜか式1の値が全て0となります。
sql = "SELECT * FROM q_test"
1 A-1 0
2 A-2 0
3 B-1 0
4 A-1 0
式1でLIKEを使っていることが原因なのか、
IIf([商品id] = "A-1",1,0)
とかだと、クエリとSQLの結果に違いはありません。
IIfだけでなくSwitchを使った場合も同様(LIKEだとおかしい、=だと平気)でした。
ちなみに、Accessのバージョンは2003、VBAで使っているレコードセットはADODBです。
(今確認したところ、DAOでは問題なくできました。)
冒頭で、困っていると書きましたが、これを回避する方法はいくつか思いついていますので、
別の方法を教えていただきたいわけではなく、単純になぜこのようなことが起きるのかが知りたいです。
是非よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> Like "A*"
ADO では Like "A%" になると思います。
こういうことではなく、なぜかっていうことになりますか・・・
Access 2003 / 2007 で確認してみました。
Private Sub CheckDAO(sS As String, sSql As String)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(sSql)
While (Not rs.EOF)
Debug.Print "DAO" & sS & " : ",
Debug.Print "顧客id=" & rs("顧客id"),
Debug.Print "商品id=" & rs("商品id"),
Debug.Print "式1=" & rs("式1")
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
End Sub
Private Sub CheckADO(sS As String, sSql As String)
Dim rs As New ADODB.Recordset
rs.Source = sSql
rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
While (Not rs.EOF)
Debug.Print "ADO" & sS & " : ",
Debug.Print "顧客id=" & rs("顧客id"),
Debug.Print "商品id=" & rs("商品id"),
Debug.Print "式1=" & rs("式1")
rs.MoveNext
Wend
rs.Close
End Sub
Public Sub test21()
Const CSQL As String = "SELECT * FROM q_test;"
Const CSQL2 As String = "SELECT * FROM q_test2;"
Call CheckDAO("", CSQL)
Call CheckADO("", CSQL)
Call CheckDAO("2", CSQL2)
Call CheckADO("2", CSQL2)
End Sub
クエリ q_test2 は、 A* を A% に変更しただけのもので、
test21 を実行した結果は以下
DAO : 顧客id=1 商品id=A-1 式1=1
DAO : 顧客id=2 商品id=A-2 式1=1
DAO : 顧客id=3 商品id=B-1 式1=0
DAO : 顧客id=4 商品id=A-1 式1=1
ADO : 顧客id=1 商品id=A-1 式1=0
ADO : 顧客id=2 商品id=A-2 式1=0
ADO : 顧客id=3 商品id=B-1 式1=0
ADO : 顧客id=4 商品id=A-1 式1=0
DAO2 : 顧客id=1 商品id=A-1 式1=0
DAO2 : 顧客id=2 商品id=A-2 式1=0
DAO2 : 顧客id=3 商品id=B-1 式1=0
DAO2 : 顧客id=4 商品id=A-1 式1=0
ADO2 : 顧客id=1 商品id=A-1 式1=1
ADO2 : 顧客id=2 商品id=A-2 式1=1
ADO2 : 顧客id=3 商品id=B-1 式1=0
ADO2 : 顧客id=4 商品id=A-1 式1=1
クエリを直接開いた時の表示は、
「q_test」
顧客id 商品id 式1
1 A-1 1
2 A-2 1
3 B-1 0
4 A-1 1
「q_test2」
顧客id 商品id 式1
1 A-1 0
2 A-2 0
3 B-1 0
4 A-1 0
ANSI-92 / ANSI-89 ・・・なんちゃらがあり
http://office.microsoft.com/ja-jp/access-help/HP …
(DAO / ADO の違いについてのお話ではないと思いますが・・・)
ツール→オプションを表示し、
「テーブル/クエリ」のSQLサーバー互換構文(ANSI 92)の
「このデータベース」のチェックを入れ、クエリを直接開くと結果は逆になります。
でも、DAO / ADO での取得(test21 の実行)結果は変わりません。
この辺の動きを説明されているのが以下でしょうか(拡大解釈かも)
ADOとDAOを使用したwhere句内の文字列検索にて、*と%の動きの違い
http://www.nurs.or.jp/~ppoy/access/access/acM012 …
クエリ名で指定しても、その内容の全ての解釈は統一された、
という事になるのでしょうか。(私の解釈ですけど)
うそかも・・・ 自己責任にて解釈してください。
No.2
- 回答日時:
クエリのデザイングリッドのところでSQLビューを表示すると、SQL文がどういうようになっているか分かるのではないですか。
<--ここがミソ
そのSQL文を間違いなく写して
Sub test15()
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("select 氏名,住所 from 社員3")
rs.MoveFirst
Do Until rs.EOF
MsgBox rs!住所
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
dbs.Close: Set dbs = Nothing
End Sub
でselect 氏名,住所 from 社員3の部分を変えて
そのSQL文で実行して何かヒントが得られないですか。
(ちなみに上記は私のテストデータでは動きます。)
ADOでやるならSQL文で開くコードでやってみるとか。
No.1
- 回答日時:
rodoniさん はじめまして。
私も同じようにAccess2003,EXCEL2003で作成し試してみました。
結論か言うと、ADOでもDAOも結果が同じでした。
※下記のプログラムと結果参照
参照設定(ADOのバージョン等)とか環境とか何か違いがあるのでしょうかね?
※DAOは3.6,ADOは6.0で確認
あまりお役に立てず、申し訳ありません。
以下、サンプルと結果です。
【DAO ソース】
Sub DAO_Access()
Dim objDtbs As DAO.Database
Dim objRcrd As DAO.Recordset
Set objDtbs = OpenDatabase(ThisWorkbook.Path & "\" & "test.mdb")
Set objRcrd = objDtbs.OpenRecordset("SELECT * FROM q_test", dbOpenForwardOnly)
With objRcrd
Do While Not (objRcrd.EOF)
Debug.Print "顧客id="; objRcrd.Fields("顧客id"),
Debug.Print "商品id="; objRcrd.Fields("商品id"),
Debug.Print "式1="; objRcrd.Fields("式1")
objRcrd.MoveNext
Loop
End With
objRcrd.Close
objDtbs.Close
Set objRcrd = Nothing
Set objDtbs = Nothing
End Sub
【DAO 結果】
顧客id=1 商品id=A-1 式1= 1
顧客id=2 商品id=A-2 式1= 1
顧客id=3 商品id=B-1 式1= 0
顧客id=4 商品id=A-1 式1= 1
【ADO ソース】
Sub ADO_Access()
Dim adoCON As New ADODB.Connection
Dim adoRS As ADODB.Recordset
adoCON.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & ThisWorkbook.Path & "\" & "test.mdb"
Set adoRS = adoCON.Execute("select * from q_test")
Do While Not (adoRS.EOF)
Debug.Print "顧客id="; adoRS("顧客id"),
Debug.Print "商品id="; adoRS("商品id"),
Debug.Print "式1="; adoRS("式1")
adoRS.MoveNext
Loop
adoRS.Close
adoCON.Close
Set adoRS = Nothing
Set adoCON = Nothing
End Sub
【ADO 結果】
顧客id=1 商品id=A-1 式1= 1
顧客id=2 商品id=A-2 式1= 1
顧客id=3 商品id=B-1 式1= 0
顧客id=4 商品id=A-1 式1= 1
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server SQLのクエリの書き方 1 2022/03/29 23:06
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- その他(データベース) accessについて 2 2022/05/31 16:58
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
ACCESSのクエリで同じSQL文だが結果が異なる
その他(データベース)
-
レコードが存在しなかった場合
Microsoft ASP
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
-
4
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
5
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
6
アクセス ADO レコードの件数がおかしい
Access(アクセス)
-
7
ADO VBA 実行時エラー3021
Visual Basic(VBA)
-
8
実行時エラー 3265「要求された名前、または序数
Visual Basic(VBA)
-
9
実行時エラー -2147217900 ADODBでレコードセットオープン時エラー
Access(アクセス)
-
10
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
11
実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」
Visual Basic(VBA)
-
12
ADOのCursorLocationプロパティ
Visual Basic(VBA)
-
13
エラー(型が一致しません。)の対処方法
Visual Basic(VBA)
-
14
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
15
ACCESS VBAの実行時エラーなんですが
PowerPoint(パワーポイント)
-
16
アクセスのエラー「クエリには出力フィールドが1つ以上必要です。」
その他(Microsoft Office)
-
17
クエリの結果とレコードセットの結果が違う
Visual Basic(VBA)
-
18
Access クエリ実行が急に非常に遅くなりました。
Access(アクセス)
-
19
ACCESS──メインフォームでサブフォームのレコード件数をカウントしたい
Access(アクセス)
-
20
Accessのサブフォームから値を参照する方法について
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
SQLサーバから、項目の属性(型...
-
クエリ表示と、ADOで抽出したレ...
-
SQL Left Join で重複を排除す...
-
select文のwhere句に配列を入れ...
-
【Transact-sql】 execの結果を...
-
エラー 1068 (42000): 複数の主...
-
期間の重複を調べるSQL文につい...
-
selectした大量データをinsert...
-
全角文字を含む行を検索
-
SELECT出来るのにDELETE出来な...
-
複数のテーブルの重複データを...
-
最小値をUPDATE
-
mysqlで特定のカラムから下4桁...
-
sqlで、600行あるテーブルを100...
-
VIEWの元のテーブルのindexって...
-
PL/SQLの変数について
-
複数JOINしているとCOUNTが正し...
-
同じサブクエリが複数出てくる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
エラー 1068 (42000): 複数の主...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
バインド変数について
-
クエリ表示と、ADOで抽出したレ...
-
sqlで、600行あるテーブルを100...
-
全角文字を含む行を検索
-
PL/SQLの変数について
-
DB設計について
-
selectした大量データをinsert...
-
【Transact-sql】 execの結果を...
-
[MySQL] UNIQUE制約の値を更新...
-
ある条件の最大値+1を初番する...
おすすめ情報