SCHWERPUNKT

Suche in Daten mit m:n-Beziehungen

Suche nach Textkriterien

Im Falle der bereits diskutierten Textkriterien soll das Formular in der Endlosansicht alle gefundenen Personen, die mindestens ein Kriterium erfüllen, in der Reihenfolge mit den meisten Treffern anzeigen. In der Entwurfsansicht sieht ein solches Formular wie in Bild 6 aus.

Bild 6: Das Suchergebnis mit der Rangliste der besten Treffer.
Bild 6: Das Suchergebnis mit der Rangliste der besten Treffer.

Das obere Textfeld txtSuchkriterien dient zur Eingabe der durch Leerzeichen getrennten Skills. Beim Öffnen des Formulars soll die Abfrage aus Bild 5 als Datenherkunft dienen, damit alle Datensätze angezeigt werden.

Die Eingabe der gesuchten Skills in das Textfeld txtSuchbegriffe soll das Ergebnis aktualisieren. Der SQL-Ausdruck für die Eigenschaft Recordsource wird dabei entsprechend den eingegebenen Suchbegriffen neu zusammengestellt. Das Ganze sieht wie in Listing 1 aus.

Private Sub txtSuchbegriffe_AfterUpdate()
Dim strSuchbegriffe() As String
Dim i As Integer
Dim strKriterium As String
strSuchbegriffe = Split(Me!txtSuchbegriffe)
For i = LBound(strSuchbegriffe) To UBound(strSuchbegriffe)
strKriterium = strKriterium & "Or (tblSkills.Skill) = '" & strSuchbegriffe(
i) & "' "
Next i
strKriterium = Mid(strKriterium, 4)
Me.RecordSource = "SELECT tblPersonen.PersonID, tblPersonen.PersonName,
Count(tblPersonen.PersonID) AS AnzahlvonPersonID FROM tblSkills INNER JOIN (tblPersonen
INNER JOIN tblPersonenSkills ON tblPersonen.PersonID = tblPersonenSkills.PersonID)
ON tblSkills.SkillID = tblPersonenSkills.SkillID WHERE " & strKriterium & "
GROUP BY tblPersonen.PersonID, tblPersonen.PersonName ORDER BY
Count(tblPersonen.PersonID) DESC;"
End Sub

Die Split-Funktion ermittelt aus der im Textfeld txtSuchbegriffe enthaltenen Zeichenkette die einzelnen Suchbegriffe und speichert sie in dem String-Array strSuchbegriffe. Dessen Einträge durchläuft die folgende For-Next-Schleife, erstellt für jeden Suchbegriff einen Ausdruck der Form Or (tblSkills.Skill) = '<Suchbegriff>' und hängt diese aneinander. Nach dem Abtrennen des führenden OR fügt die Routine den Suchausdruck in die eigentliche Abfrage ein und weist diesen Ausdruck der Eigenschaft RecordSource des Formulars zu.

Bild 7: Formular zur Suche nach Personen mit einer Skill-Zeichenkette als Suchkriterium.
Bild 7: Formular zur Suche nach Personen mit einer Skill-Zeichenkette als Suchkriterium.

Bild 7 zeigt das Ergebnis einer Abfrage nach einem Mitarbeiter mit Office- und VB.NETKenntnissen.