Projekt-Anfragen: Tel: 07022/9319004 info@CodeDocu.de Software Entwicklung in C# WPF Asp.Net Core Vba Excel Word SQL-Server EF Linq, UWP Net
#

Download:

Datei 1: Demo_SubQuery.zip

MS Access: Mehrfache Abfrage mit mehreren Worten erstellen

 

Wie erstellt man in Microsoft Access eine Abfrage, bei welcher eine beliebige Anzahl an Worten jeweils gefiltert wird.

Die Abfrage sollte so durchlaufen wie man es von Google gewohnt ist, dass jedes weitere Wort den bestehenden Filter weiter einschränkt.

Also im Prinzip sollte die Abfrage lauten: Filter-Ergebnisse, welche das Wort_A  und auch das Wort_B enthalten.

 

In diesem Beispiel wird eine Auswahl-Liste mit Produkten gefiltert nach einem Filterfeld, welches sich neben der Liste befindet.

Während der Eingabe reduziert sich die Auswahl-Liste immer mehr, sodass am Schluss nur noch die gewünschten Ergebnisse angezeigt werden.

Der Filter läuft natürlich über alle Felder oder Spalten der Liste.

 

Liste als Filter

 

 

Lösung:

 

 

Event:

Damit die Liste automatisch schon bei der Eingabe funktioniert, muss die Aktualisierung direkt auf einen Tasten-Ereignis gelegt werden.

Die Aktualisierung der Liste wird in den [Bei-Taste-Auf] Event des Filter-Eingabe-Feldes gelegt

 

Tasten-Ereignis

Diese führt triggert dann eine komplexe Aktualisierungs-Funktion oder Sub-Routine

Private Sub tbxSuche_Produkte_KeyUp(KeyCode As Integer, Shift As Integer)

    On Error Resume Next

    fxRefresh_List tbxSuche_Produkte.Text, "Produkte"

End Sub

 

SQL erstellen und Zuweisen

Danach wird ein SQL-String erstellt, welcher die Felder der Tabelle untersucht und anschliessend als Datenquelle für die Liste zugewiesen wird.

 

SQL an Liste zuweisen

Das neue Ergebnis wird automatisch angezeigt, wenn man die Abfrage als SQL-String in die Liste schreibt

ctlListe_Produkte.RowSource = sSQL

 

SQL: Felder, Tabelle, Filter

Es wird also ein SQL-String erstellt, welcher 1) die Felder erstellt, dann 2) von einer Tabelle abholt, wobei 3) die Felder nach Text gefiltert werden

Private Sub fxRefresh_List(Optional ByVal parSuchText, Optional ByVal parFeld)

    '---------------< fxRefresh_List() >---------------

   

    '--< SQL Basis >--

    Dim sSQL As String

    'fields

    sSQL = "SELECT IDProdukt, Felder"     '1)

    sSQL = sSQL & " FROM tbl_Produkte"    '2)

    '--</ SQL Basis >--

    ..

    Filter in WHERE Field like ‘abc’    '3)

    ..

    ctlListe_Produkte.RowSource = sSQL

    '---------------</ fxRefresh_List() >---------------

End Sub

 

Mehrfacher Durchlauf Filter

 

Worte Array

Zunächst muss der Filter-Text in ein Array aus Worten umgewandelt werden, indem man einen Split-Array erstellt

arrWorte = Split(sSuchText_Produkt, " ")

 

For Each varWort In arrWorte

  If Not varWort = "" Then

..

Next

 

Bedingungen-Filter Block

Damit nun die Abfrage aber nicht statisch einmal durchläuft wie in einem Abfrage Entwurf festgelegt wird, sonder sich die Filter nach Anzahl der Worte wiederholen,

muss ein Filter-Text erstellt werden nach dem Prinzip: (Feld1 und Feld2 und Feld3 LIKE „abc“) und dieser String muss jeweils and die SQL Abfrage mit AND angefügt werden.

'--< direkte Filter >--

sSQL_Produkte = sSQL_Produkte & " AND ( [Produktlinie] & [Komponenten] & [Kommentar]    LIKE '*" & sWort & "*' )"

'--</ direkte Filter >--

 

 

WHERE erstellen

Damit die Logik aber am Schluss aufgeht, muss das Erste AND durch ein WHERE ausgetauscht werden.

'< Korrektur >

        sSQL_Produkte = Replace(sSQL_Produkte, " AND ", " ", 1, 1, vbTextCompare)

        sSQL_Produkte = sSQL_Produkte & " ) "

        '</ Korrektur >

 

 

Filter Bedingungen Code-Block

Kompletter vba-Code zum Erstellen des WHERE Filter-Blocks.

    Dim arrWorte

    Dim varWort

    Dim sWort As String

 

    '------< SQL Produkte >------

    If Not sSuchText_Produkt = "" Then

        Dim sSQL_Produkte As String

        sSQL_Produkte = " ( "

 

        '----< @Loop: Wortfilter >----

        arrWorte = Split(sSuchText_Produkt, " ")

 

        For Each varWort In arrWorte

            If Not varWort = "" Then

                sWort = varWort

                '--< direkte Filter >--

                sSQL_Produkte = sSQL_Produkte & " AND ( [Produktlinie] & [Komponenten] & [Kommentar]    LIKE '*" & sWort & "*' )"

                '--</ direkte Filter >--

            End If

        Next

        '----</ @Loop: Wortfilter >----

 

        '< Korrektur >

        sSQL_Produkte = Replace(sSQL_Produkte, " AND ", " ", 1, 1, vbTextCompare)

        sSQL_Produkte = sSQL_Produkte & " ) "

        '</ Korrektur >

 

    End If

    '------</ SQL Produkte >------

 

 

Abschluss:

Kompletter vba Code zum Filtern

Private Sub fxRefresh_List(Optional ByVal parSuchText, Optional ByVal parFeld)

    '---------------< fxRefresh_List() >---------------

    '*aktualisiere die Trefferliste oben

    '< init >

    Dim sSuchText_Produkt As String

 

    If IsMissing(parFeld) Then parFeld = ""

 

    If parFeld Like "Produkte" Then

        sSuchText_Produkt = parSuchText

    Else

        sSuchText_Produkt = Nz(tbxSuche_Produkte.Value, "")

    End If

    '</ init >

 

 

    '--< SQL Basis >--

    Dim sSQL As String

    'fields

    sSQL = "SELECT IDProdukt, Produktlinie, Komponenten,  Pilotproject, MaturityLevel_00, MaturityLevel_10, MaturityLevel_20, MaturityLevel_30, Kommentar"

    'Table

    sSQL = sSQL & " FROM tbl_Produkte"

    '--</ SQL Basis >--

 

    Dim arrWorte

    Dim varWort

    Dim sWort As String

 

    '------< SQL Produkte >------

    If Not sSuchText_Produkt = "" Then

        Dim sSQL_Produkte As String

        sSQL_Produkte = " ( "

 

        '----< @Loop: Wortfilter >----

        arrWorte = Split(sSuchText_Produkt, " ")

 

        For Each varWort In arrWorte

            If Not varWort = "" Then

                sWort = varWort

                '--< direkte Filter >--

                sSQL_Produkte = sSQL_Produkte & " AND ( [Produktlinie] & [Komponenten] &  Pilotproject & MaturityLevel_00 & MaturityLevel_10 & MaturityLevel_20 & MaturityLevel_30 & Kommentar     LIKE '*" & sWort & "*' )"

                '--</ direkte Filter >--

            End If

        Next

        '----</ @Loop: Wortfilter >----

 

        '< Korrektur >

        sSQL_Produkte = Replace(sSQL_Produkte, " AND ", " ", 1, 1, vbTextCompare)

        sSQL_Produkte = sSQL_Produkte & " ) "

        '</ Korrektur >

 

    End If

    '------</ SQL Produkte >------

 

 

 

    '----< combine >----

    If Not sSQL_Produkte Like "" Then

        sSQL = sSQL & " WHERE " & sSQL_Produkte

    End If

    '----< combine >----

 

 

    ctlListe_Produkte.RowSource = sSQL

    '---------------</ fxRefresh_List() >---------------

End Sub

 

 

Betrifft: Microsoft Access, Query, Abfragen, SQL Queries, vba-Code
 

Mobile
»
Ausblenden der neuen Spalte hinzufügen in Microsoft Access Datenbanken
»
Access: Umwandlung von Datum in Jahr-Monat-Tag
»
Access: Datum formatieren als Kurzes Datum
»
Access: Texte mit Zeilenumbruch verknüpfen
»
MS Access: Unterabfrage
»
MS Access: Mehrfache Abfrage mit mehreren Worten erstellen wie bei Google Search
»
Access: Fehlermeldung Das angegebene Feld kann sich auf mehr als eine der Tabellen beziehen
»
Vergleich UND Abfragen in Access oder Excel
»
Microsoft Access Datenbankmodul erkennt [..] nicht als gültigen Feldnamen oder Ausdruck
»
MS Access Abfrage mit Werten aus einer Code-Funktion

.

Jobs, Projekte, Angebote für Freiberufler, Selbstständig an Info@CodeDocu.de