こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ADO 複数条件のフィルタが出来ない

カテゴリサイズ

牡蠣大
牡蠣小
牡蠣小

のようなクエリ(Qクエリ)があります。
---------------------------------------------------------------------
strカテゴリ="牡蠣"
strサイズ="大"

Set cn = CurrentProject.Connection
rs.Open "Qクエリ", cn, adOpenStatic, adLockPessimistic
rs.Filter = "カテゴリ = '" & strカテゴリ & "' And サイズ = '" & strサイズ & "'"

Debug.Print rs.RecordCount
---------------------------------------------------------------------
とすると、
大は1レコードなのに3が返ります。

更に、
strサイズ="小"にすると0がかります。

ウォッチウインドウで見たら、「大」の時は
---------------------------------------------------------------------
: Filter : "カテゴリ = '牡蠣' And サイズ = '大'" : Variant/String :
: RecordCount : 3 : Long :
---------------------------------------------------------------------
になっています。

どうしてこのような現象が起きるのでしょうか?
レコードの「小」がADOだと「大」と読んでいます。

アクセス2010です。

投稿日時 - 2016-11-12 10:41:08

QNo.9254660

暇なときに回答ください

質問者が選んだベストアンサー

Q、どうしてこのような現象が起きるのでしょうか?
A、勘違いでは?

まず、添付のテスト図を参照して下さい。ちゃんと、ADO の Filter 機能は動作しています。そこで、以下の二つの関数をお試し下さい。

【説明】

第一引数:SQL文
第二引数:列区分子(指定しなけりゃ;)
第三引数:行区分子(指定しなけりゃ;)

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional colDelimita As String = ";", _
             Optional rowDelimita As String = ";") As String
On Error GoTo Err_DBSelect
  Dim R      As Integer ' 行インデックス
  Dim N      As Integer ' 行総数 - 1
  Dim cnn     As ADODB.Connection
  Dim rst     As ADODB.Recordset
  Dim fld     As ADODB.Field
  Dim strList   As String ' 全てのデータを区切子で連結して格納
  
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      N = .RecordCount - 1
      .MoveFirst
      For R = 0 To N
        For Each fld In .Fields
          With fld
            strList = strList & .Value & colDelimita
          End With
        Next fld
        strList = Mid(strList, 1, Len(strList) - 1) & rowDelimita
        .MoveNext
      Next R
    Else
      strList = ""
    End If
  End With
Exit_DBSelect:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBSelect = IIf(Len(strList) > 0, Replace(strList & "[END]", rowDelimita & "[END]", ""), "")
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr(13) & Chr(13) & _
      "・Err.Description=" & Err.Description & Chr(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function

Public Function DBFilter(ByVal strQuerySQL As String, _
             ByVal strFilter As String, _
             Optional colDelimita As String = ";", _
             Optional rowDelimita As String = ";") As String
On Error GoTo Err_DBFilter
  Dim R      As Integer ' 行インデックス
  Dim N      As Integer ' 行総数 - 1
  Dim cnn     As ADODB.Connection
  Dim rst     As ADODB.Recordset
  Dim fld     As ADODB.Field
  Dim strList   As String ' 全てのデータを区切子で連結して格納
  
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .Filter = strFilter
      N = .RecordCount - 1
      .MoveFirst
      For R = 0 To N
        For Each fld In .Fields
          With fld
            strList = strList & .Value & colDelimita
          End With
        Next fld
        strList = Mid(strList, 1, Len(strList) - 1) & rowDelimita
        .MoveNext
      Next R
    Else
      strList = ""
    End If
  End With
Exit_DBFilter:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBFilter = IIf(Len(strList) > 0, Replace(strList & "[END]", rowDelimita & "[END]", ""), "")
  Exit Function
Err_DBFilter:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBFilter)" & Chr(13) & Chr(13) & _
      "・Err.Description=" & Err.Description & Chr(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBFilter
End Function

投稿日時 - 2016-11-12 13:25:54

お礼

ありがとうございました。

投稿日時 - 2016-11-26 23:15:35

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)