September 18, 2020, 14:49:18

Neuigkeiten:

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


Mehrere Filter und Mehrfachabfragen auf Knopfdruck

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

⏪ vorheriges - nächstes ⏩

DF6GL

Hallo,

es werden keine DS an den Bericht übergeben, es wird eine Where-Condition (Kriterium) an den Bericht übergeben, der dann danach die DS filtert.

Ich weiß immer noch nicht, nach welcher Methode Du vorher "filterst".



Du kannst die Variable "sCriteria", die im vorherigen Code zusammengesetzt wurde, als Where-Condition an den Berichtsaufruf übergeben.

DoCmd.OpenReport "Bericht_Eigenschweißer_Prüfungen10_Übersicht", acViewReport, , sCriteria
Auf die Variable musst Du natürlich Zugriff haben, z. B. indem man sie als Public-Variable im Formularmodulkopf deklariert.


Bernd Sowa

Du weißt dass ich vieles von dem was du schreibst nicht wirklich verstehe...?

Also es gibt Filter direkt über die Abfrage
z.B.
Wie "*" & [Formulare]![For_Eigenschweißer_Prüfungen]![Werkstoffgruppe] & "*"

Dann gibt es Filter die direkt im Formular filtern
z.B.
Me.Filter = Nz(Me!Wand1, 0) & " between WdMin and WdMax  AND " & Nz(Me!D1, 0) & " between DuMin and DuMax"
Me.FilterOn = True

Beide Varianten haben den inhalt des Formulares an den Bericht übergeben mit folgendem Code:
DoCmd.OpenReport "Bericht_Eigenschweißer_Prüfungen10_Übersicht", acViewReport, , Me.Filter _
                    , acWindowNormal

Seit im Formular noch über die Mehrfachauswahl gefiltert wird funktioniert die Ausgabe des Berichtes nicht mehr.
Bzw. die Mehrfachauswahlen werden ignoriert.

Dein letzter Vorschlag hat nicht funktioniert...

DF6GL

Hallo,

zeig doch mal den Code mit der Mehrfach-Auswahl.....


Ich sag's nochmal:  Diese ganze Filtergeschichte ist nicht zielführend. Es wird immer gegenseitige Komplikationen geben.

 

Bernd Sowa

Hallo Franz,
die meißten Codes die es in dieser DB gibt (auch die mit der Mehrfachauswahl) habe ich aus diesem Forum.

Der, der jetzt zwar im Formular funktioniert aber nicht in dem Bericht ist der letzte, den du mir genannt hast:

[/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 Subcode]

Ich hoffe, dir fällt etwas ein.
Wenn ich das Ergebnis der Filtergeschichte nicht auf´s Papier bringen kann nützt mir das ganze wenig...
LG
Bernd

DF6GL

Hallo,

entferne die Kommentarzeichen unter "zum Filtern des Recordsets".


Füge Kommentarzeichen (Hochkommata) bei "nur beim Filtern mittels Recordsource"  und "zum Filtern des Recordsets"  ein.



Entferne "    sCriteria1 As String, _"  aus dieser Prozedur und füge


Option Compare Database
Option Explicit    'Einfügen, falls nicht vorhanden

Private sCriteria1 As String


in den Prozedurkopf ein.


Rufe den Bericht so auf:

DoCmd.OpenReport "Bericht_Eigenschweißer_Prüfungen10_Übersicht", acViewReport, , sCriteria

Bernd Sowa

Hallo Franz,
bekomme ich irgendwie nicht hin.

einmal schreibst du: "entferne die Kommentarzeichen unter "zum Filtern des Recordsets"."
dann
"Füge Kommentarzeichen (Hochkommata) bei "nur beim Filtern mittels Recordsource"  und "zum Filtern des Recordsets"  ein.
Erst entfernen , dann wieder hinschreiben macht ja keinen Sinn. Also denke ich, dass ich dich nicht so recht verstehe...

"Entferne "    sCriteria1 As String, _"  aus dieser Prozedur und füge "
sCriteria1 Al String, _ finde ich nicht... (hast du dich vielleicht verschrieben?)

"Option Compare Database
Option Explicit    'Einfügen, falls nicht vorhanden

Private sCriteria1 As String"
Wo soll ich das dann hinschreiben?
Anstelle von " sCriteria1 As String, _"?  oder unter varItem As Variant?

Hier ist alles voller Fragezeichen...

DF6GL

Hallo,

sorry,

meinte natürlich:

Füge Kommentarzeichen (Hochkommata) bei "nur beim Filtern mittels Recordsource"  und "zum Filtern der Recordsource"  ein.

Bernd Sowa

Guten Morgen Franz,
ich bin gerade etwas traurig.
Ich verstehe deine Anweisungen nicht wirklich.
Ich habe dir einige Fragen gestellt und bekomme darauf leider keine Antwort sondern du korrigierst nur eine Sache bei der du dich verschrieben hast.
Du hast mir so weit geholfen und nun komme ich beim letzten Schritt nicht weiter.

Ich weiß nicht ob ich das mit den Hochkommatas richtig verstehe, ich weiß nicht wo ich deinen ersten Code einfügen soll.
Ich bekomme immer Fehlermeldungen.


Ratlose Grüße
 

DF6GL

Hallo Bernd,


eigentlich solltest Du die Antworten schon interpretieren und auch umsetzen können..
sorry...

Vielleicht ist es sinnvoll, sich zunächst tiefer mit den Grundlagen und Funktionsweisen von Access auseinander zu setzen.. 


Bloß Makros zusammen zu klicken und Code zu kopieren, ohne ihn nachvollziehen und ihn auch debuggen, bzw. anpassen zu können, ist nicht zielführend.


Lad die aktuelle DB mal hoch, dann könnte es zu weniger Traurigkeit führen, ob aber zu mehr Verständnis....?


Hier nochmal eine Erklärung:

Die mehrfach ausgewählten Werte in den Kombis werden mit einer "AND"- Verknüpfung per VBA-Code zu einem syntaktisch korrekten Text-String (sCriteria) als Filterbedingung (Kriterium) zusammengesetzt. 

Formular-Filter-Methode:
Dieses Kriterium kann nun an die Form-Eigenschaft ".Filter"  übergeben werden , das für die Filterung der im Formular angezeigten Datensätze sorgt.  Im folgenden Verlauf kann mit diesem Kriterium ein Bericht mit passenden Datensätzen geöffnet werden.  Dazu kann man die Filter-Eigenschaft des Forms (Me.Filter) beim Öffnen des Berichts (Where-Condition-Parameter bei der OpenReport-Methode  siehe VBA-Hilfe)  benutzen oder auch die Variable (sCriteria).  Hierfür muss allerdings in der Bericht-Öffnungs-Prozedur der Zugriff auf die Variable möglich sein, deshalb wird sie auch im Formular-Modulkopf als "Private  sCriteria" deklariert. Dadurch ist sie in allen Prozeduren des Formular-Moduls "sichtbar" und verwendbar.


"Recordsource"-Methode:
Diese nutzt nicht die Formular-Filtereigenschaft, sondern die Einstellung der Datenherkunft (Recordsource) des Formulars. Hier wird die Kriteriums-Variable (sCriteria) als "Where-Condition" in eine Abfrage eingebaut.  Die Abfrage wurde im Vorfeld mit einem "Platzhalter"-Kriterium  (  (1)=1   ) versehen, das jetzt per VBA-Code durch den Inhalt von sCritera (aktuelles Kriterium) ersetzt wird und dafür sorgt, dass nur ein Teil der DS in der Tabelle (vor)gefiltert in das Form geladen werden.  Damit stehen aber auch nur diese DS für weitere Filterung über die Filter-Eigenschaft des Formulars zur Verfügung.

Die Wahl der beiden Methoden hängt davon ab, wie man grundsätzlich filtern will und was zum gewünschten Ziel führt.




Ich hoffe, Du verstehst diesen "Jargon".  Wenn nicht, musst Du Dich ernsthaft damit auseinandersetzen.



Bernd Sowa

Du hast ja mit allem Recht,
ich wurde von dieser Datei eigentlich selbst überrollt...
Am Anfang war noch nicht ganz klar welche Ausmaße das annehmen wird und nun stehe ich da.
Ich dachte mir auch, für irgendwas hat man ja irgendwann diese Makros erfunden, also habe ich sie benutzt.
Der Profi fällt natürlich hintern rüber wenn er sieht was ich da gemacht habe...
Wenn du mir noch ein letztes mal helfen würdest wäre es echt prima...
PS
Wo finde ich eigentlich diese Knöpfe "Sag Danke" und "Thema gelöst"?
Die werden bei mir nicht angezeigt oder ich bin zu (wieder mal) zu doof, sie zu finden...
LG
Bernd

DF6GL

Hallo,

anbei die Umsetzung nach der Recordsource-Methode.

Ich empfehle Dir dringend und als Erstes, im VBA-Editor in ALLEN Modulköpfen Option Explicit einzufügen und anschließend Debuggen/kompilieren auszuführen.  ALLE auftretenden Fehler MÜSSEN eliminiert werden.

Wenn Du das nicht machst, gibt es in Folge keine Hilfe mehr von mir...



PS: den Danke-Knopf gibt es noch nicht..., soweit ich weiß.

Bernd Sowa

Ich bin ja bemüht...  :-[
Option Explicit
Meinst du immer ganz oben in jedem VBA-Modul z.B. über Option Compare Database?

Übrigens berücksichtigt dein Code zwar die Filter links (Schweißverfahren und Schweißzusatz-Gruppe) aber nicht die Abmessung...
Kann man das auch noch irgendwie einfügen?

 

DF6GL

Hallo,

ja, überall wo Option Compare Database steht, muss Option Explicit hinzu.

Wie gesagt, man muss wissen, was und was alles man filtern möchte.... Diese Geschichte ist, wie auch schon gesagt, etwas verkorkst.  Dadurch kommt man nicht auf einen grünen Zweig, wenn man nicht grundsätzliche Änderungen durchführt.



Ich setze aber noch die "Form-Filter"-Methode um, vielleicht erhältst Du dann das erwartete Ergebnis.

DF6GL

Hallo,

hier nun die Umsetzung mit der Filter-Eigenschaft des Form.  Der Bericht wird so gefiltert, wie es das Form erfahren hat.

Inwieweit Formular-Referenzen als Kriterien da mitspielen, habe ich nicht durchforstet.


Bernd Sowa

Hallo Franz,
hab´s getestet...
Leider verträgt sich dein Code nicht mit dem Filter der Abmessung...
Beispiel
Verfahren .311
Schweißzusatz FM3
= 11 Datensätze
Wenn ich dann nach z.B. 2mm Wanddicke suche (es sollten 4 Datensätze sein) zeigt das Formular wieder 109 DS...
Vielleicht lasse ich die Datenbank so wie sie in der letzten Version war.
Dann kann ich die Suche eben nicht nach den Abmessungen eingrenzen.
Du hast dich schon viel zu viel mit mir rumärgern müssen.
Vielen Dank dafür...
LG
Bernd