SQL-Abfrage OR-Verknüpfung

Hallo

habe auch dieses mal ein Problem und hoffe, dass ihr mir wieder mal weiterhelfen könnt:

Ich habe ein Formular erstellt, aus dem der Anwender (eine einfache Suche oder) eine erweiterte Suche starten kann.
Bei der erweiterten Suche hat er die Möglichkeit „Verfasser“ „Datum“ „Kategorie1“ „Kategorie2“ „Kategorie3“ auszuwählen. Außerdem können noch zusätzlich Suchbegriffe eingegeben werden (die dann mit den Schlagwörtern der DB abgeglichen werden).

Ich frage mich gerade wie die einzelnen Kriterien miteinander verknüpft werden müssen, denn der Anwender kann beliebige felder der erweiterten Suche ausfüllen oder auch offen lassen…

Im Folgenden habe ich die SQL-Abfrage eingefügt, die nur nach den eingegebenen Suchbegriff sucht ( Werden mit der unten schreibweise mehrere eingegebene Suchbegriffe berücksichtigt oder nur einer???)

Der Suchbegriff wird mit dem Titel, Verfasser, mit den einzelnen Kategorien abgeglichen. Außerdem soll in den Schlagwörtern (SW1, SW2…) ein ähnlicher ausdruck gesucht werden.

SQL = "SELECT Tab_Datei.D_Titel, Tab_Datei.D_Verfasser, Tab_Datei.D_Datum, Tab_Datei.D_Ort, Kategorie.K_Dokb "
SQL = SQL + „FROM Tab_Datei, Tab_Kategorie“
SQL = SQL + „WHERE Tab_Datei.D_Titel LIKE '*“ & Me!Feld_Suchbegriff_erw.Value & „*’ ;“
SQL = SQL + „OR Tab_Datei.D_Verfasser LIKE '*“ & Me!Suchbegriff_erw.Value & „*’ ;“
SQL = SQL + „OR Tab_Kategorie.Kat_1 LIKE '*“ & Me!Suchbegriff_erw.Value & „*’ ;“
SQL = SQL + „OR Tab_Kategorie.Kat_2 LIKE '*“ & Me!Suchbegriff_erw.Value & „*’ ;“
SQL = SQL + „OR Tab_Kategorie.Kat_3 LIKE '*“ & Me!Suchbegriff_erw.Value & „*’ ;“
SQL = SQL + „OR Tab_Datei.D_SW1 LIKE '*“ & Me!Suchbegriff_erw.Value & "*’ ; " ‚ab hier werden die Schlagwörter mit dem Suchbegriff abgeglichen
SQL = SQL + „OR Tab_Datei.D_SW2 LIKE '*“ & Me!Suchbegriff_erw.Value & "*‘ ; "

Meine Frage: wie erweitere ich die o.stehende SQL-Abfrage (die ja nur den Suchbegriff betrachtet) so, dass alle Fälle, - d.h.sowohl die Möglichkeit, dass noch ein bestimmter Verfasser, eine bestimmte Kategorie, Dateityp… eingegeben wurden - gedeckt sind, dh. wenn der Anwender nun bspw. Kategorie1 und Kategorie2 und einen Suchbegriff eingibt? Oder wenn der Anwender nur einen Suchbegriff und einen gewüschten Datentyp eingbit?

Wie muss ich das hier einbauen? reicht es, wenn ich die obere Anfrage so erweitere, dass ich die nötigen Befehle einfach mit „OR“ dranhänge?
z.B.

SQL = SQL + "OR Tab_Kategorie.Kat_1 = Me.Kat_1.Value "
SQL = SQL + "OR Tab_Kategorie.Kat_2 = Me.Kat_2.Value "
SQL = SQL + "OR Tab_Kategorie.Kat_3 = Me.Kat_3.Value "

muss ich hier dann noch mögliche kategoriekombinationen berücksichtigen??? zb:
’ Anfrage nach Kategorie 1 & 2 oder 1 & 3 oder 2 & 3
SQL = SQL + „OR (Tab_Kategorie.Kat_1 = Me.Kat_1.Value AND Kategorie.Kat_2 = Me.Kat_2.Value)“
SQL = SQL + " OR (Tab_Kategorie.Kat_1 = Me.Kat_1.Value AND Kategorie.Kat_3 = Me.Kat_3.Value)"
SQL = SQL + " OR (Tab_Kategorie.Kat_2 = Me.Kat_2.Value AND Kategorie.Kat_3 = Me.Kat_3.Value)"

Wird eigentlich in den genannten anfragen jedes Kritierium (welches mit OR beginnt) welches den wert „true“ wiedergibt, in der ergebnisliste ausgegeben???

Wie müssen die Verknüpfungen sein, so dass alle Fälle abgedeckt sind? Auf was muss ich achten?

Danke im Voraus :wink:

Hallo rihab,

wie heißt es so schön: man muss nicht alles wissen, nur wissen wo es steht! Hier eine Funktion, die ich gefunden habe:

Public Function STRsuchen(tabelle$)

'diese Funktion sucht in einer Tabelle in beliebig vielen Feldern auch einen Teilstring
'Eingabe in die Inputbox ohne Sternchen und ohne "
'Günther Ritter gritter@ gmx.de

Dim DB As Database
Dim rs As Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox(„Bitte Eingabe“)
If begriff = „“ Then Exit Function
Set DB = CurrentDb
Set rs = DB.OpenRecordset(tabelle)

strSQL = „select " _
& rs.Fields(0).Name _
& " from " & tabelle & " where " _
& rs.Fields(0).Name _
& " like '*“ & begriff & „*’“

For I = 1 To rs.Fields.Count - 1
strSQL = strSQL & " or " & rs.Fields(I).Name _
& " like ‚*" & begriff & "*‘"
Next
rs.Close

Set rs = DB.OpenRecordset(strSQL, dbOpenSnapshot)

If rs.RecordCount = 1 Then
MsgBox „Treffer“
Else
MsgBox „Kein Treffer“
End If

rs.Close

Set DB = Nothing

End Function

Grüße aus Raben Steinfeld (bei Schwerin)
Wolfgang
(Netwolf)

Hallo,
zum „Auslassen“ einiger Suchbegriffe kannst du folgendes benutzen:

Private Sub Auswahl_Click()
Dim Auswahl As String, strSQL As String
If Not IsNull(Me!Verfasser) Then Auswahl = Auswahl & " And Verfasser Like’*" & Me!Verfasser& „*’“
If Not IsNull(Me!Ort) Then Auswahl = Auswahl & " And Ort = ‚" & Me!Ort & "‘"


strSQL = "SELECT * FROM DeineTabelle "
If Auswahl „“ Then strSQL = strSQL & „WHERE“ & Mid(Auswahl, 5)

d.h. du baust dir einen dynamischen SQL-String zusammen, der nur die Suchfelder berücksichtigt, die auch ausgefüllt werden.

Gruß Tramp