
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も見ています
-
ACCESSのクエリで同じSQL文だが結果が異なる
その他(データベース)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
-
4
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
5
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
6
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
7
Accessのテーブルデータを一気にVBAで追加したい・・
その他(データベース)
-
8
アクセス ADO レコードの件数がおかしい
Access(アクセス)
-
9
実行時エラー -2147217900 ADODBでレコードセットオープン時エラー
Access(アクセス)
-
10
実行時エラー 3265「要求された名前、または序数
Visual Basic(VBA)
-
11
Accessクエリーで両方のテーブルの全てのデータを表示することは可能ですか?
Access(アクセス)
-
12
Excel VBAからAccessマクロを実行したい
Visual Basic(VBA)
-
13
ACCESSで開いているユーザーの特定方法
Access(アクセス)
-
14
Access「レコードが削除されました」のエラー
Access(アクセス)
-
15
Access VBAでクエリーのレコード件数を取得したいのですが
その他(データベース)
-
16
途中で改行されたCSVをAccessに正常に取り込むには?
Access(アクセス)
-
17
アクセスのクエリでパラメータを表示させない方法は?
その他(Microsoft Office)
-
18
[Excel]ADODBでNull変換されてしまう
Visual Basic(VBA)
-
19
アクセスのエラー「クエリには出力フィールドが1つ以上必要です。」
その他(Microsoft Office)
-
20
Access2010 「演算子がありません」エラー
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数テーブルのGROUP BY の使い...
-
フリーマーケット!
-
ローカルルーターモードとは
-
bashスクリプトで特定の文字に...
-
mysqlについて
-
尾形光琳の作品が見たい!
-
製品の最安店舗を取りたい。
-
レコードセットに新規追加する
-
EXISTSでの列名指定
-
データベース内の値をweb内でテ...
-
Dell Latitude C600に合うメモ...
-
JOIN後同一名カラムから値がと...
-
ストアド内でカラム名一覧を取得
-
SQLServerでのデータディクショ...
-
INSERT時の大小比較を含む重複...
-
このSQL文の意味を教えてくださ...
-
verilogに適したvimの設定を探...
-
正規表現を使って前方一致置換...
-
最小値をUPDATE
-
MySQLでvarcharに先頭ゼロをセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
WordpressのContact form 7でzi...
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
クエリ表示と、ADOで抽出したレ...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
SQL Left Join で重複を排除す...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] UNIQUE制約の値を更新...
-
inner joinをすると数がおかし...
-
1テーブル&複数レコードの更新...
-
Access パラメータクエリをcsv...
-
期間の重複を調べるSQL文につい...
-
Unionした最後にGROUP BYを追加...
-
Updateの複数テーブル条件時のL...
おすすめ情報