September 26, 2020, 19:04:10

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Mehrere Filter und Mehrfachabfragen auf Knopfdruck

Begonnen von Bernd Sowa, August 12, 2020, 16:29:25

⏪ vorheriges - nächstes ⏩

Bernd Sowa

Hallo zusammen.
Ich habe ein Formular in dem ich mehrere Listenfelder mit Mehrfachauswahl und zwei Filter habe.
Nun überschreiben Sie sich ja gegenseitig immer wieder.
Ich möchte nun einen Button installieren mit dem ich auf Knopfdruck alle Auswahlen auf einmal auslösen kann.

Eines der Listenfelder filtert über einen Button:

Private Sub Befehl668_Click()
Dim sCriteria As String
    Dim varItem As Variant
    With Me
        sCriteria = "IN ("
        If .Schweißverfahren.ItemsSelected.Count > 0 Then
       
       
            For Each varItem In .Schweißverfahren.ItemsSelected
           
               sCriteria = sCriteria & "'" & .Schweißverfahren.ItemData(varItem) & "', "
               
            Next varItem
                     sCriteria = Left(sCriteria, Len(sCriteria) - 2)
                     Debug.Print sCriteria
            .Filter = "Verfahren " & sCriteria & ")"
            .FilterOn = True
            Debug.Print .Filter
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
   
End Sub

Das andere genauso, nur die Namen sind natürlich angepasst.
Dann habe ich noch einen Filter der so aussieht:

Private Sub Befehl314_Click()
   
Me.Wand1 = Str(WdE)
Me.D1 = Str(ØE)
Me.Filter = Nz(Me!Wand1, 0) & " between WdMin and WdMax  AND " & Nz(Me!D1, 0) & " between DuMin and DuMax"
Me.FilterOn = True

End Sub

Alles für sich klappt gut, nur alle Filter auf einen Button zu legen übersteigt meine (wirklich) bescheidenen Kenntnisse.

Kann mir jemand helfen?
LG
Bernd

ebs17

Vor Verwendung ist ein Filter nur eine Zeichenkette (Text). Einzelfilter kann man also einfach zusammenhängen, sprich entsprechend gewünschter Logik per AND oder OR zu einem Gesamtfilter verknüpfen.
Probiere es aus.
Mit freundlichem Glück Auf!

Eberhard

Bernd Sowa

Hallo Eberhard,
Danke für die Antwort...
"einfach zusammenhängen" hört sich einfach an... (ist es für euch ja wahrscheinlich auch)
Ich habe da einige Probleme.
Hab folgendes Probiert (zwei Filter "einfach" mit AND verbunden und bekomme eine Fehlermeldung: "Fehler beim Kompilieren"

Private Sub Befehl668_Click()
Dim sCriteria As String
    Dim varItem As Variant
    With Me
        sCriteria = "IN ("
        If .SZWAuswahl.ItemsSelected.Count > 0 Then
       
       
            For Each varItem In .SZWAuswahl.ItemsSelected
           
               sCriteria = sCriteria & "'" & .SZWAuswahl.ItemData(varItem) & "', "
               
            Next varItem
                     sCriteria = Left(sCriteria, Len(sCriteria) - 2)
                     Debug.Print sCriteria
            .Filter = "SZW " & sCriteria & ")"
            .FilterOn = True
            Debug.Print .Filter
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
AND
Dim sCriteria As String
    Dim varItem As Variant
    With Me
        sCriteria = "IN ("
        If .Schweißverfahren.ItemsSelected.Count > 0 Then
       
       
            For Each varItem In .Schweißverfahren.ItemsSelected
           
               sCriteria = sCriteria & "'" & .Schweißverfahren.ItemData(varItem) & "', "
               
            Next varItem
                     sCriteria = Left(sCriteria, Len(sCriteria) - 2)
                     Debug.Print sCriteria
            .Filter = "Verfahren " & sCriteria & ")"
            .FilterOn = True
            Debug.Print .Filter
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
   
End Sub

Bernd Sowa

Noch eine Frage am Rande...
Wenn ich die Filter mit AND auslöse betrifft das ja mehrere Filter.
Was passiert wenn z.B. einer der Filter nicht gesetzt wurde weil für eine bestimmte Abfrage nicht benötigt?
Läuft er dann auch durch oder muss ich dann anders vorgehen?
LG
Bernd

DF6GL

August 13, 2020, 10:25:12 #4 Letzte Bearbeitung: August 13, 2020, 10:32:49 von DF6GL
Hallo,

Du verkettest ja die Filterstrings mit "and" zu einem neuen String.

Wenn da ein Teilstring (ein "Filter") fehlt, dann verkettest Du einen Leerstring , den "and" -String und den zweiten Filterstring zu einem neuen.  Das führt dann unweigerlich zu einem Syntaxfehler, sofern der Gesamtstring nicht entspr. korrigiert wird.

Gebe den Gesamt->Filter-String mal mit

Debug.Print "Verfahren " & sCriteria & ")"
ins Direktfenster aus, dann siehst Du schon die Fehlerstellen.



Außerdem kann der Code insgesamt nicht funktionieren, besser so:

With Me
               sCriteria =""
        If .Schweißverfahren.ItemsSelected.Count > 0 Then
.
.

         .Filter = "SZW In (" & sCriteria & ")"

Bernd Sowa

Hallo Franz,
danke für die Antwort.
Die ist leider, wie so oft wenn hier geantwortet wird, nur Hilfreich für jemanden der sich mit VBA wirklich auskennt.
Ich tu das leider nicht und bin momentan so schlau wie zuvor.
Es ist ja ein guter Ansatz, die Leute zum Nachdenken anzuregen, aber häufig (so geht es mir zumindest) setzt die Antwort wieder so viel nicht vorhandenes Wissen voraus, dass es nicht hilft... Bin ja nun wirklich nicht mehr der Jüngste und mir fällt das Lernen solcher komplexen Codes echt schwer.
Am Liebsten wäre mir, wenn ich die Mehrfachauswahlen aus den Listenfeldern direkt an die dem Formular zugrunde liegende Abfrage übergeben könnte. So dass direkt in der Abfrage gefiltert wird aber alles was ich zu diesem Thema gefunden habe war so dermaßen Kryptisch für mich, dass ich so langsam resigniere...
Ich kann die Mehrfachauswahl z.B. in ein Textfeld ausgeben, immer mit einem Komma getrennt aber wie lasse ich nun die Abfrage damit arbeiten?
Gruß vom Niederrhein...

DF6GL

August 13, 2020, 14:58:35 #6 Letzte Bearbeitung: August 13, 2020, 15:05:57 von DF6GL
Hallo,

ja nun, wenn Du schon Code benutzt, musst Du ihn auch interpretieren können, sonst wirst Du immer nie wissen, was Du tust und demzufolge auch keine Fehler eliminieren können.

Bin ja nun wirklich nicht mehr der Jüngste
Vorsicht! Nicht dass Du Dich an mir (bzw.  an einigen von uns) in dieser Beziehung messen lassen musst   ;)  ;)  :D

Lad mal die DB hier hoch, komprimiert/repariert , gezippt und evtl. datenreduziert. Dann kann der Code angepasst werden. (Beschreibe aber, wo (in welchem Form) und wann (bei Klick auf irgendwas) die Filterung stattfinden soll.




(Luftcode!):

Private Sub Befehl668_Click()

Dim sCriteria As String, _
    sCriteria1 As String, _
    varItem As Variant

    With Me
        sCriteria = ""
        If .SZWAuswahl.ItemsSelected.Count > 0 Then
       
            For Each varItem In .SZWAuswahl.ItemsSelected
               sCriteria = sCriteria & ",'" & .SZWAuswahl.ItemData(varItem) & "'"
            Next varItem

                     If Len(sCriteria) > 0 Then sCriteria = "SWZ In (" & Mid(sCriteria, 2) & ")"
                     Debug.Print sCriteria
       
        If .Schweißverfahren.ItemsSelected.Count > 0 Then

            For Each varItem In .Schweißverfahren.ItemsSelected
               sCriteria1 = sCriteria1 & ",'" & .Schweißverfahren.ItemData(varItem) & "'"
            Next varItem

                If Len(strCritera1) > 0 Then sCritera1 = sCriteria & " And Verfahren In (" & Mid(sCriteria1,2) & ")"

                If Left(sCriteria,4) = " And"  Then   sCriteria = Mid (sCriteria,6)
                Debug.Print sCriteria

            .Filter =  sCriteria
             .FilterOn = True
            Debug.Print .Filter
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
   
End Sub

Bernd Sowa

Hallo Franz, du würdest mir wirklich sehr helfen...
Ich musste noch personenbezogene Daten verändern und Datensätze entfernen.
Wenn du im Startformular auf die rote Schaltfläche klickst kommst du zu meinem Sorgenkind.
Ich hoffe, ich habe es dort gut beschrieben.
Am besten wäre es, eine Filtermöglichkeit über Mehrfachauswahlen im Listenfeld in der Abfrage hinzubekommen.
Ist auch einfacher für den Bericht und die Ausgabe nach Excel...
Aber ein Button tut´s auch zur Not.
LG
Bernd
PS nicht erschrecken falls du dir die DB mal genauer ansiehst... :-)
Nicht schön aber es funzt... so weit...

DF6GL

Hallo,

bin nicht erschrocken, bin entsetzt....  ;)  :o  :o


Hausaufgabe:

-- Tabellen normalisieren und in Beziehung setzen.
-- Aussagekräftige Benennung bei Namen verwenden
-- Keine Sonder- und Leerzeichen in Namen verwenden
-- Drastische Reduzierung der Abfragen (und auch Formulare).
-- Keine Formularsteuerelement-Bezüge in Abfragen.
-- Keine Makros.
-- In ALLEN Modulköpfen "Option Explicit" einfügen.
-- Debuggen/Kompilieren im VBA-Editor durchführen. ALLE Fehlersituationen bereinigen/eliminieren.



Ich habe keine Änderungen diesbezüglich gemacht (außer versucht zu kompilieren. Da ging es aber ins "Unendliche").  Es würde mein zeitliches Budget für diesen Thread sprengen.


Füge folgende Ereignisprozudur zu einer Schaltfläche ("Befehl668") ein:

Private Sub Befehl668_Click()

Dim sCriteria As String, _
    sCriteria1 As String, _
    varItem As Variant

 With Me
 
        '-- nur beim Filtern mittels Recordsource-------     
        .RecordSource = "SELECT * FROM Abfr_Eigenschweißer_Prüfungen WHERE (1)=1"
        '-----------------------------------------------


        sCriteria = ""
        If .SZWAuswahl.ItemsSelected.Count > 0 Then
       
            For Each varItem In .SZWAuswahl.ItemsSelected
               sCriteria = sCriteria & ",'" & .SZWAuswahl.ItemData(varItem) & "'"
            Next varItem

                     If Len(sCriteria) > 0 Then sCriteria = "SZW In (" & Mid(sCriteria, 2) & ")"
   
        End If
       
        If .Schweißverfahren.ItemsSelected.Count > 0 Then

            For Each varItem In .Schweißverfahren.ItemsSelected
               sCriteria1 = sCriteria1 & ",'" & .Schweißverfahren.ItemData(varItem) & "'"
            Next varItem

                If Len(sCriteria1) > 0 Then
                sCriteria = sCriteria & " And Verfahren In (" & Mid(sCriteria1, 2) & ")"
                End If
               
         End If
               
                If Left(sCriteria, 4) = " And" Then sCriteria = Mid(sCriteria, 6)
                       
                        ''''''   zum Filtern des Recordsets------------------------
                        ''''''            .Filter = sCriteria
                        ''''''             .FilterOn = True
                        ''''''------------------------------------------------------
                       
                       
                        ' zum Filtern der Recordsource------------------------------
                        If Len(sCriteria) > 0 Then
                          .RecordSource = Replace(.RecordSource, "(1)=1", sCriteria)
                        Else
                          .RecordSource = "SELECT * FROM Abfr_Eigenschweißer_Prüfungen WHERE (1)=1"
                        End If
                        '--------------------------------------------------------------

    End With
                   
                   
End Sub

Bernd Sowa

Hallo Franz
Dachte mir dass dir die Kinnlade auf die Tastatur fällt wenn du dir die DB ansiehst...  ;D
Aber wie gesagt, sie funktioniert... irgendwie...
Natürlich hast du mit allem Recht.
Aber ich habe mich ohne Vorwissen einfach mal drangetraut und sie neben meinem Job (der mit so etwas mal so gar nix zu tun hat) zusammengezimmert. Immer wenn ich mal ein Stündchen Leerlauf hatte...
Ich habe natürlich alles falsch gemacht weil mir das nötige Wissen fehlt wie man so etwas aufbaut.

Trotzdem bin ich ein kleines bisschen stolz darauf.
Lass mir das bitte...  ;)

Ich werde Montag den Code einbauen.

Und ich bin dir sehr dankbar...
Ihr seid wirklich in Ordnung.
Wie macht ihr das eigentlich? Nur so aus Spaß oder Hobby oder ist eine Organisation dahinter?

Auf jeden Fall wünsche ich dir erst einmal ein schönes Wochenende.
LG
Bernd

Beaker s.a.

Hallo Bernd,
ZitatNur so aus Spaß oder Hobby oder ist eine Organisation dahinter?
Ja, nein.
Alle, die hier helfen machen es Spass an der Freude. Und manche auch um
selber dabei zu lernen.
ZitatAber ich habe mich ohne Vorwissen einfach mal drangetraut
Und nicht einmal versucht ein Buch zu lesen? Dann tu dir jetzt den Gefallen,
und lies ein paar Seiten von Franz' Links in seiner Signatur. Ich würde 4. als
Einstieg empfehlen.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

DF6GL

August 15, 2020, 08:20:23 #11 Letzte Bearbeitung: August 15, 2020, 08:31:31 von DF6GL
Hallo,

ZitatTrotzdem bin ich ein kleines bisschen stolz darauf.
Lass mir das bitte...  ;)

Das kannst Du auch sein, bei solchen Vorbedingungen.


Und wegnehmen will Dir das auch niemand.   :)


Ich wollte nur aufzeigen, was überprüft werden sollte, damit sich nicht irgendwo eine Fallgrube auftut, aus der man nicht mehr herauskommt.

Zur Filtergeschichte möchte ich noch anmerken, dass man genau definieren sollte, was und nach welcher Methode gefiltert werden muss:

Ob einzeln (filtern direkt nach Eingabe in ein Suchfeld oder Auswahl in einem Listen-/Kombifeld) oder kombinatorisch nach Eingabe in alle Suchfelder (auch NULL berücksichtigen?) .


"Filtern" selber sollte auch näher bestimmt werden:  Soll es die "Einschränkung" von Datensätzen (Where-Condition in Abfrage) bedeuten oder das EInschränken der DS-Anzeige in einem Form (Me.Filter ="xxx") oder lediglich die Positionieren auf einen bestimmten im Formular angezeigten Datensatz  (Me.Recordset.Findfirst "xxxx")  bedeuten.

Alle diese Methoden haben unterschiedliche Auswirkungen auf die weitere Bearbeitung von DS, auch wenn die Datenanzeige im Formular recht ähnlich aussieht.






Bernd Sowa

Hallo Franz und Ekkehard,
ich werde lesen, versprochen...
Ich habe auch ein Buch, aber wenn man den Lösungsansazu für sein Problem auf seite 497 gefunden hat kann man damit nicht viel anfangen da man die Seiten 1 - 496 gelesen und verstanden haben muss um das umzusetzten :-).
Ich werde mich bessern...

Allerdings habe ich noch ein Problemchen.
auf dem Formular gibt es einen Button mit folgendem Code:

Private Sub Befehl653_Click()
 
    DoCmd.OpenReport "Bericht_Eigenschweißer_Prüfungen10_Übersicht", acViewReport, , Me.Filter _
                    , acWindowNormal

End Sub

Hat auch gut geklappt, nur jetzt werden die Mehrfachauswahlen ignoriert... Die anderen Filter werden berücksichtigt.

Könnt ihr mir noch einmal unter die Arme greifen?

LG
Bernd

DF6GL

Hallo,

wenn Du Me.Filter benutzt, dann muss diese Eigenschaft vorher auch entspr. gesetzt worden sein.


Da funktioniert die Methode mit der Recordsource (Datenherkunft)  nicht...

Bernd Sowa

Es gibt aber eine Möglichkeit, die gefilterten Datensätze an den Bericht zu übergeben?
Was muss ich tun?
Ratlose Grüße
Bernd