Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage mit mehreren Kriterien aus Funktion

Begonnen von JanJB99, August 13, 2022, 14:26:08

⏪ vorheriges - nächstes ⏩

JanJB99

Hi zusammen,

ich baue gerade eine Abfrage, die eine Tabelle nach einem oder mehr Kriterien in der Spalte "Bereich" filtern soll.

Dazu habe ich eine Funktion gebaut die einen entsprechenden String mit "oder" zusammenbaut.

Function GetFilter(UserLogin As String)

    Dim rs As DAO.Recordset
    Dim strfilter As String
   
    Set rs = CurrentDb.OpenRecordset("select * from Qry_TblUser_GetAllBereiche where [UserLogin] = '" & UserLogin & "'")

    Do Until rs.EOF
        Bereich = DLookup("Bereich", "tblBereiche", "[ID_Breich] =" & rs![Bereich].Value)
        strfilter = strfilter & """" & Bereich & """ oder "
        rs.MoveNext
    Loop
   
    strfilter = Left(strfilter, Len(strfilter) - 6)
   
    Debug.Print strfilter
   
    GetFilter = strfilter

End Function

Das Ergebnis der Funktion beim print ist folgendes:
"BEGS 12" oder "BEGS 18" oder "BEGS 10" oder "BEGS 15"

Wenn ich das Ergebnis manuell als Kriterium in die Abfrage einbaue, funktioniert alles.
Sobald ich versuche das Kriterium über die Funktion automatisch einzutragen, bekomme ich eine leere Tabelle.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Funktioniert nicht.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Funktioniert.


Vielen Dank im voraus für die Unterstützung!

LG Jan


PhilS

Sieht dir deine funktionierende Abfrage mal in der SQL-Ansicht an. Dort wirst du sehen, wie der Filterstring korrekt aussehen muss. -> Jeder der durch ODER getrennten Teile muss eine vollständige Bedingung enthalten.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

JanJB99

Hallo Phil,

erstmal vielen Dank für Deine Antwort!

Wenn ich Dich richtig verstehe, muss ich den Filterstring so anpassen, dass er im SQL-Statement anstelle der Funktion wieder ein komplettes Statement ergibt.

WHERE (((Qry_tblMitarbeiter_FilterBereichNull.Bereich)="BEGS 12" Or (Qry_tblMitarbeiter_FilterBereichNull.Bereich)="BEGS 18" Or (Qry_tblMitarbeiter_FilterBereichNull.Bereich)="BEGS 10" Or (Qry_tblMitarbeiter_FilterBereichNull.Bereich)="BEGS 15"));

So sieht die SQL Ansicht vom funktionierenden Screenshot aus.

WHERE (((Qry_tblMitarbeiter_FilterBereichNull.Bereich)=GetFilter("Z0021717")));

Und so mit Funktion.

Das heißt mein Filterstring als Ergebnis der Funktion müsste doch wie folgt aussehen:

    GetFilter = """BEGS 12"" Or ([Qry_tblMitarbeiter_FilterBereichNull].[Bereich])=""BEGS 18"" Or ([Qry_tblMitarbeiter_FilterBereichNull].[Bereich])=""BEGS 10"" Or ([Qry_tblMitarbeiter_FilterBereichNull].[Bereich])=""BEGS 15"""
End Function

Funktioniert so nur leider auch nicht.
Was habe ich falsch verstanden?

Danke & LG
Jan

MzKlMu

Hallo,
GetFilter sollte folgenden String liefern:
"[Bereich]= 'BEGS 12' Or [Bereich])= 'BEGS 18' Or [Bereich])= 'BEGS 10' Or [Bereich])= 'BEGS 15'"Statt der doppelten "" ist es übersichtlicher Hochkomma zu verwenden, außerdem ist es überflüssig den Abfragenamen voranzustellen.
Gruß Klaus

JanJB99

Hi Klaus,

auch Dir lieben Dank für die Antwort.
Leider funktioniert auch das nicht.

Habe in der Funktion alles außer folgende Zeile aus kommentiert (Kopiert von Dir).

GetFilter = "[Bereich]= 'BEGS 12' Or [Bereich])= 'BEGS 18' Or [Bereich])= 'BEGS 10' Or [Bereich])= 'BEGS 15'"
Trotzdem bekomme ich eine leere Abfrage.

Habe es auch ohne die schließenden Klammern ")" nach [Bereich] probiert.

Danke & LG
Jan

DF6GL

Hallo,

die schliessenden runden Klammern sind falsch.Lass die weg:

GetFilter = "[Bereich]= 'BEGS 12' Or [Bereich]= 'BEGS 18' Or [Bereich]= 'BEGS 10' Or [Bereich]= 'BEGS 15'"

Außerdem funktioniert es nicht, eine solche Funktion im Kriterienfeld einer Abfragespalte einzusetzen.
(Die erzeugte SQL-Where-Condition wäre syntaktisch und logisch falsch)

setze die Funktion so in der Abfrage ein:


Feld:        GetFilter()
Kriterium:   <> 0





JanJB99

Hallo Franz,

auch Dir vielen Dank für die Antwort.

Das mit den Klammern hatte ich mir bereits gedacht.
Schade, dass das so nicht funktioniert - Aber gut dass ich es jetzt weiß.

Ich habe zwar nicht genau verstanden, wie Dein Lösungsansatz funktionieren soll, aber er hat mich auf den richtigen Weg geführt.

Ich erstelle jetzt über die Funktion eine neue Spalte mit allen Bereichen als String und setze dort dann ein "Wie "*" & [Bereich] & "*" Kriterium.

Das läuft!

Vielen Dank für die unterstützung!

LG Jan

PhilS

Die Zuordnung von User zu Bereich scheint in deiner Abfrage Qry_TblUser_GetAllBereiche ja bereits abgebildet zu sein. Binde diese Abfrage über einen Join mit ein und du kannst dir die ganze Bastelei mit dem Filter sparen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor