mehrere Suchkriterien bei DB-Abfrage

silkeR

Mitglied
Hallo,

ich möchte bei der Abfrage von DS aus einer DB gern mehrere Suchkriterien angeben. Wie ich nun rausgefunden habe, geht das nicht mit der Find-Methode (DB ist über ADO eingebunden und DS über recordset). Die Filter-Methode geht auch nicht, da kommt die Fehlermeldung: Ungültige Verwendung einer Eigenschaft – keine Ahnung warum.
Wie könnte ich das nun lösen, wenn ich mich nicht auf ein Suchkriterium beschränken will?
Mein Bsp.: habe eine DB mit Adressen und will nun Vor- ODER Nachname (oder auch beides - jenachdem) in jeweils ein Textfeld eingeben und dann mit den DS in der DB vergleichen und mir die übereinstimmenden anzeigen lassen.

Besten Dank für Ideen und Hilfe.
 
Hi,

mach das doch mit SQL.
Ungefähr so:

Code:
Dim sSQL As String
Dim Rs As Recordset
Dim bOr As Boolean

If (Len(txtVorname.Text)>0) Then
    sSQL = sSQL & " WHERE Tabelle.Vorname = '" & txtVorname.Text & "'"
    bOr= True
Else
    bOr= False
End If

If (Len(txtNachname.Text >0) Then
    If (bOr) Then
            sSQL = sSQL & " OR Tabelle.Nachname = '" & txtNachname.Text & "'"
    Else
            sSQL = sSQL & " WHERE Tabelle.Nachname = '" & txtNachname.Text & "'"         
    End If
End If

' Cn sei aktive Connection zu DB

Set Rs = New ADODB.Recordset
With Rs
     .CursorLocation = adUseClient
     .CursorType = adOpenDynamic
     .LockType = adLockBatchOptimistic
     Set .ActiveConnection = Cn
      Call .Open(sSQL)
End With

Ungetestet, aber so in der Art macht man sowas... ;)
 
Hallo,

danke für die Antwort. So in der Art mit SQL hatte ich das auch schon. An sich geht es jetzt. Problem ist bei mir jetzt noch, wenn der DS nicht vorhanden ist. Dann gibt es ein Problem mit dem Ende der DB (Fehlermeldung EOF ist true). Wollte mir aber gern mit einer MsgBox anzeigen lassen, wenn ein DS nicht gefunden wurde. Irgendwie muss ich das doch mit dem EOF noch einbauen, oder? Aber wo und wie jetzt, wenn ich kein Find verwende (da ging das mit dem eof)? Bzw. wie vermeide ich den Fehler und wie kann ich mir die Nachricht anzeigen lassen, dass DS nicht da ist?

Hab' mal meinen Code mit dazu geschrieben, vielleicht ist es dann einfacher zu verstehen, wo mein Fehler liegt bzw. wo noch was fehlt.

Besten Dank.

Code:
Dim sql As String
Dim rs As New ADODB.Recordset

If txt_search_vorname.Text <> "" Or txt_search_nachname.Text <> "" Then
    sql = "Select * From namen " & _
    "where Vorname = '" & txt_search_vorname.Text & "' or Nachname = '" & txt_search_nachname.Text & "'"

    rs.Open sql, con

    rs.Requery
    
    Set DataGrid1.DataSource = rs
    txt_vorname.Text = rs!Vorname
    txt_nachname.Text = rs!Nachname
    txt_ort.Text = rs!Ort
    
Else
MsgBox "es wurde nichts gefunden", vbOKOnly

End If
 
Hi,

Deine Abfrage ist nicht richtig.
Wenn bei Dir in einem der beiden Felder etwas eingibst, werden BEIDE Felder in die Abfrage einbezogen, d.h. Dein SQL Statement bei der Eingabe vom Vornamen "Hans" (ohne Nachnamen) so aussehen:
Code:
SELECT * FROM namen
WHERE Vorname = 'Hans' OR Nachname = ''
Das soll doch sicher nicht so sein oder?

Den Fehler umgehst Du, indem Du erst den SQL String zusammenbaust (siehe mein Post).
Deine Meldung im ELSE Zweig müsste eigenlich heißen "nichts eingeben".

So müsste es aussehen:
Code:
Dim sSQL As String
Dim Rs As ADODB.Recordset
Dim bOr As Boolean

If (Len(txtVorname.Text)>0) Then
    sSQL = sSQL & " WHERE Tabelle.Vorname = '" & txtVorname.Text & "'"
    bOr= True
Else
    bOr= False
End If

If (Len(txtNachname.Text >0) Then
    If (bOr) Then
            sSQL = sSQL & " OR Tabelle.Nachname = '" & txtNachname.Text & "'"
    Else
            sSQL = sSQL & " WHERE Tabelle.Nachname = '" & txtNachname.Text & "'"         
    End If
End If

' Cn sei aktive Connection zu DB

Set Rs = New ADODB.Recordset
With Rs
     .CursorLocation = adUseClient
     .CursorType = adOpenDynamic
     .LockType = adLockBatchOptimistic
     Set .ActiveConnection = Cn
      Call .Open(sSQL)
End With

If ((Not (Rs.EOF)) Or (Not(Rs.BOF))) Then
     If (Rs.Recordcount = 0) Then
          Call MsgBox ("Keine Daten vorhanden!")
     Else
          Set DataGrid1.DataSource = Rs
          txtVorname.Text = Rs.Fields("Vorname").Value
         ' usw
     End If
Else
          Call MsgBox ("Keine Daten vorhanden!")
End If

Und nun noch einige Grundlegende Dinge:
- bei Recordsets nie die " ! " Synthax verwenden, kann zu Fehlern führen, liebe "Rs.Fields("Feldname").Value" verwenden
- nie Deklarationen mit "Dim XXX As New XXX" verwenden, die Objekte werden nie wieder gelöscht (bei Set XXX = Nothing), siehe folgendes Beispiel:

Code:
    Dim DimAs As VBA.Collection
    Dim DimAsNew As New VBA.Collection

    Debug.Print "Collections vor dem Instanzieren:"
    Debug.Print vbTab & "DimAs    = " & TypeName$(DimAs)
    Debug.Print vbTab & "DimAsNew = " & TypeName$(DimAsNew)

    Set DimAs = New VBA.Collection
    Set DimAsNew = New VBA.Collection

    Debug.Print "Collections nach dem Instanzieren:"
    Debug.Print vbTab & "DimAs    = " & TypeName$(DimAs)
    Debug.Print vbTab & "DimAsNew = " & TypeName$(DimAsNew)

    Set DimAs = Nothing
    Set DimAsNew = Nothing

    Debug.Print "Collections nach dem Entladen:"
    Debug.Print vbTab & "DimAs    = " & TypeName$(DimAs)
    Debug.Print vbTab & "DimAsNew = " & TypeName$(DimAsNew)
 
Hallo,

Danke für die ausführliche Antwort. Aber so richtig komme ich nicht weiter. Und zwar kommt bei der Zeile „Call .open (sSQL)“ die Fehlermeldung: unzulässige SQL-Anweisung, Delete, Insert, Select oder Update erwartet. Habe schon alles probiert – bisher erfolglos.
So richtig komme ich mit diesem sSQL-String nicht klar. Wozu ist der und wieso wird der String dann mit der open-Methode aufgerufen (was ja nicht geht)? :confused:
Den Rest verstehe ich. Habe nur immer ein Problem mit dem open und geöffneten und geschlossenen Verbindungen. Irgendwie habe ich diese Problematik noch nicht durchschaut.

Würde mich über Tipps freuen. Danke

Gruß
 
Moin,

mit SQL holst Du Dir Daten aus einer DB (übers Recordset) oder führst eine Aktualisierung in der DB aus (INSERT, UPDATE, DELETE).

Der String wird in meinem Bsp. mit der Open Methode aufgerufen, damit die Daten in das Recordset tranferiert werden, alternativ geht auch Recordset.DataSource = "SELECT ...".

Das bei Dir der Fehler "unzulässige..." erscheint, deutet darauf hin, dass Du das SQL Statement nicht an Deine Gegebenheiten angepasst hast (Feld und Tabellennamen anpassen.
Mach mal nach dem Zusammenbauen des Strings (vor .Open(sSQL)) ein "Debug.Print sSQL" und schau wie der String im Endeffekt aussieht (Strg+G fürs Direktfenster).

Was die Problematik mit den geöffneten und geschlossenen Connections angeht, in VB 6 (anders als in VB.NET) arbeitet man grundsätzlich immer mit einer geöffneten Connection.
 
Zurück