一つのテーブルから複数の条件でレコードセットを取得するには?

解決


50才の超ビギナー  2004-05-23 13:24:02  No: 113444  IP: [192.*.*.*]

はじめまして。VBを始めてまだ間もない50才の超ビギナーです。どうしても自己解決できないので、お知恵を拝借したく、書き込みました。長文で読みづらいかもしれませんがよろしくお願いします。

data.mdbの中の個人情報テーブルから複数の条件(氏名、住所、電話番号)で検索してレコードセットを取得しようとしています。が、下記のコードで実行すると、テーブルにある全てのデータがデータグリッドに表示されてしまい、必要とするデータだけを抽出することが出来ません。  「メニュー  /  デバッグ」の「カーソルの直前までを実行」  を実施して変数に入っている文字を調べてみると
strsql = "select * from 個人情報 where '" & criteria & "'"  の部分が,検索条件が氏名と電話番号の場合を例にとると、
strsql = "select * from 個人情報 where '氏名 = 山田  太郎 and 電話番号 = 0123456789'"  という様になっています。前後の  '  を何とかはずそうとしましたが、うまく出来ません。
データは全てテキストです。VB6を使用しています。よろしくお願いします。

Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Dim strsql As String
Dim tt As String
Dim tn As String
Dim ta As String
Dim rc As String
Dim key(1 To 3) As String
Dim i As Integer
Dim crlen As String
Dim criteria As String

----------------------------------------------------------------
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.ConnectionString = "provider=microsoft.jet.OLEDB.4.0;" _
                    & "data source=c:\data.mdb"
cn.Open
End Sub

---------------------------------------------------------------
Private Sub cmd1_Click()

tt = Text1.Text
tn = Text2.Text
ta = Text3.Text

If tt = "" Then
  key(1) = ""
 Else
  key(1) = "電話番号=" & tt
End If

If tn = "" Then
  key(2) = ""
 Else
  key(2) = "氏名=" & tn
End If

If ta = "" Then
  key(3) = ""
 Else
  key(3) = "住所 =" & ta
End If

criteria = ""

For i = 1 To 3

If key(i) = "" Then
  '
 Else
  criteria = criteria & key(i) & " and "
End If

Next i

If criteria = "" Then
 Exit Sub
End If

crlen = Len(criteria)
criteria = Left(criteria, crlen - 5)  ’最終の" and "を取り除く

strsql = "select * from 個人情報 where '" & criteria & "'"
  
Set rs = New ADODB.Recordset
rs.ActiveConnection = cn
rs.Source = strsql
rs.CursorType = adOpenStatic
rs.LockType = adLockReadOnly
rs.Properties("irowsetidentity") = True
rs.Open

Set dg1.DataSource = rs

rc = rs.RecordCount

End Sub

編集 削除
特攻隊長まるるう  2004-05-24 09:57:48  No: 113445  IP: [192.*.*.*]

50才ならまだこの発想はできるはず…1個1個付ければ良いんです。
頭を柔らかくしましょう。まず初心者は効率より1手順ずつ自分の力量で
できる範囲で実現させることです。(まぁ、効率はずっと意識しておくべき
項目ではありますが…)

[VB6.0]
'---------------------------------------------------------------
Private Sub cmd1_Click()
    Dim rs          As ADODB.Recordset
    Dim tt          As String
    Dim tn          As String
    Dim ta          As String
    Dim criteria    As String
    Dim strsql      As String
    Dim Key(3)      As String
    Dim crlen       As Integer
    Dim i           As Integer
    Dim rc          As Integer
    
    tt = Text1.Text
    tn = Text2.Text
    ta = Text3.Text

    If tt = "" Then
        Key(1) = ""
    Else
'        Key(1) = "電話番号=" & tt
        Key(1) = "電話番号='" & tt & "'"
    End If

    If tn = "" Then
        Key(2) = ""
    Else
'        Key(2) = "氏名=" & tn
        Key(2) = "氏名='" & tn & "'"
    End If
    
    If ta = "" Then
        Key(3) = ""
    Else
'        Key(3) = "住所 =" & ta
        Key(3) = "住所 ='" & ta & "'"
    End If

    criteria = ""

    For i = 1 To 3
    
        If Key(i) = "" Then
            '
        Else
            criteria = criteria & Key(i) & " and "
        End If
    
    Next i

    If criteria = "" Then
        Exit Sub
    End If

    crlen = Len(criteria)
    criteria = Left(criteria, crlen - 5)  '最終の" and "を取り除く

'    strsql = "select * from 個人情報 where '" & criteria & "'"
    strsql = "select * from 個人情報 where " & criteria
    
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = cn
    rs.Source = strsql
    rs.CursorType = adOpenStatic
    rs.LockType = adLockReadOnly
    rs.Properties("irowsetidentity") = True
    rs.Open
    
    Set dg1.DataSource = rs
    
    rc = rs.RecordCount
    
End Sub

編集 削除
特攻隊長まるるう  2004-05-24 13:37:43  No: 113446  IP: [192.*.*.*]

お昼ご飯食べてて思ったんですが…
例えばいつも注文してるA定食がお休みだった場合、
ごはんとスープとサラダと今日のお勧めの一品…
を注文すれば良いわけです。
たぶん誰でもふつうにやっちゃう事です。

SQL文にまとめて1箇所でクォーテーションを
付けれなかったら…それぞれの場所で付ける…。
別に『プログラムだから難しい』とは限らないんですよね。
そしてむしろこーゆー発想は年齢を重ねて経験を
積んだ方が出やすい…。

いままでこの世に存在しなかった新しい発想は
偏見に囚われない若い人の方が出るかもしれないけど…
(それさえも訓練次第と聞きますが…)年齢書かれても
…だからどうという事は無いかもしれません。

…でも同年代の励みにはなりますね(^^)。

編集 削除
50才の超ビギナー  2004-05-24 23:42:35  No: 113447  IP: [192.*.*.*]

返事が遅くなりました。m(_ _)m  特攻隊長まるるう  さん、ありがとうございました。無事解決しました。とてもうれしいです。(^_^)  定食での例え話、分かりやすく勉強になりました。本当にお世話をおかけしました。また、何かあったときはよろしくお願いします。

編集 削除