Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Nicolo#22 am April 02, 2026, 17:30:51

Titel: Datensätze filtern per Button
Beitrag von: Nicolo#22 am April 02, 2026, 17:30:51
Hallo zusammen.
Im Netz fand ich Ansätze zur Lösung meiner Idee, aber die gehen alle von anderen Voraussetzungen aus.
Ich habe:
Einige im Aufbau gleiche Endlos Formulare, die Daten aus einer Abfrage beziehen, zb. von 01.01.2022 bis 31.12.2022
Weitere FRM die dann die Daten aus einer weiteren Qry beziehen, immer von Jan bis Dez.
Jetzt wollte ich ein Extra FRM bauen, mit Jahres Button.
Das heisst für jedes Jahr einen eigenen Button.
Die Daten kommen aus einer Abfrage die alle Jahre beinhaltet.
-
Damit kann ich alles über ein einziges FRM machen und brauchen nicht für jedes Jahr
 immer ein eigenes FRM mit Qry.

Im Netz finde ich Beispiele, aber die setzen 2 zusätzliche Textfelder voraus.
Kann ich nicht einfach den Button mit einem VBA Code bestücken der mir sofort die
DS liefert von 1.1 bis 31.12.?
Ich blicke da nicht wirklich durch.
Der Weg über jeweils einzelne FRM ist doch zu umständlich oder?
Titel: Re: Datensätze filtern per Button
Beitrag von: werner budde am April 02, 2026, 20:03:24
Meine Empfehlung:

Deklariere im Deklarationsteil Deines Formularcodes eine Variable:
Dim lng_Kal_Jahr as long
lng_Kal_Jahr = me.Kombifeld
 me.requery


Nicht getestet, aber der Ansatz müsste so gehen.
Titel: Re: Datensätze filtern per Button
Beitrag von: jens05 am April 03, 2026, 09:47:14
Hallo,
für deinen Buttonwunsch, und einem entsprechenden Formularfilter ginge folgendesPrivate Sub FilterNachJahr(ByVal lngJahr As Long)

    Dim dtVon As Date
    Dim dtBis As Date

    dtVon = DateSerial(lngJahr, 1, 1)
    dtBis = DateSerial(lngJahr, 12, 31)

    Me.Filter = "[Buchungsdatum] BETWEEN #" & _
                Format(dtVon, "mm\/dd\/yyyy") & "# AND #" & _
                Format(dtBis, "mm\/dd\/yyyy") & "#"

    Me.FilterOn = True

End Sub
Jetzt könntest du Buttons benutzen die die Prozedur aufrufen Private Sub cmd2024_Click()
    FilterNachJahr 2024
End Sub
Die Verwendung von Where year(DeinDatumsfeld) = " & lng_Kal_Jahr & " ggf. noch order by .. etc."würde eine Indexnutzung des Feldes verhindern ;-)
Titel: Re: Datensätze filtern per Button
Beitrag von: Knobbi38 am April 03, 2026, 14:42:57
Hallo,

das funktioniert aber nur, wenn die Felder mit Sicherheit keinen Zeitabteil enthalten, was ja vorkommen kann. Deshalb vielleicht eine leicht modifizierte Variante (Pseudocode):
    dim strCriteria as String

    dtVon = DateSerial(lngJahr, 1, 1)
    dtBis = DateSerial(lngJahr + 1 , 1, 1)

    strCriteria = "Buchungsdatum >= " & format$(dtVon, "\#mm\/dd\/yyyy\#" ) _
                &  " AND " _
                & "Buchungsdatum < "  & format$(dtBis , "\#mm\/dd\/yyyy\#" )"
    Me.Filter = strCriteria
Damit wird dann das ganze Jahr auf jedenfall berücksichtigt.

Siehe auch https://codekabinett.com/rdumps.php?Lang=1&targetDoc=datum-uhrzeit-datentyp-vba-access (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=datum-uhrzeit-datentyp-vba-access)

Warum eigentlich keine Kombobox?

Knobbi38

Titel: Re: Datensätze filtern per Button
Beitrag von: jens05 am April 03, 2026, 16:50:34
Zitat von: Knobbi38 am April 03, 2026, 14:42:57Damit wird dann das ganze Jahr auf jedenfall berücksichtigt.
damit hast du natürlich recht, bin vor Jahrzehnten auch darauf reingefallen, und habe mich gewundert warum DS fehlen. Danke fürs erweitern.

ZitatWarum eigentlich keine Kombobox?
Zwischenzeitlich ist dem User jeder Klick zuviel, da wird sogar durchgezählt wieviel klicks jemand machen muss um ans Ziel zu kommen.

Sicherlich, ein Kombifeld, oder ein einfaches Textfeld macht dem Ersteller der DB das Leben einfacher  ;)
Titel: Re: Datensätze filtern per Button
Beitrag von: Bitsqueezer am April 03, 2026, 23:20:55
Hallo,

also wenn man denn unbedingt Buttons haben will (ich fände auch eine Kombobox sinnvoller), dann sollte man die Buttons wenigstens nicht statisch halten, sondern einfach mit z.B. 1 bis 10 (mehr als 10 Jahre wird kaum jemand brauchen) durchnumerieren, und dann beispielsweise vom heutigen Jahr - 10 den ersten Button per Code in Form_Load mit 2016, den zweiten mit 2017 usw. beschriften.
So paßt sich die UI automatisch an, wenn das nächste Jahr kommt. Und das Jahr, das geklickt wurde, ist dann leicht anhand der Button-Nummer zu ermitteln.

Etwas eleganter, ohne einen Wust an Eventprozeduren für 10 Buttons, kann man es mit Eventklassen lösen.
Ein Beispiel findest Du auf meiner Downloadseite (https://www.ccedv.de) unter "ButtonArray".

Oder, was noch einfacher ist: Toggle-Buttons verwenden. Also eine Optionsgruppe, bei der ohnehin jeder Button einen Wert hat, den Du aus der Optionsgruppe auslesen kannst. Die dynamische Beschriftung der Buttons bleibt, und anhand des Values der Optionsgruppe kannst Du das geklickte Jahr berechnen. Alternativ kannst Du den Value je Button auch schon berechnen in Form_Load und damit aus Value gleich das geklickte Jahr auslesen.
Vorteil hierbei: Der angeklickte Button bleibt gedrückt, so daß man sehen kann, wie der Filter aktuell gesetzt ist.
Du kannst außerdem eine ActiveX-Scrollbar einbauen, mit der Du die Jahreszahlen hin und herscrollen kannst, wenn 10 nicht ausreichen, indem Du einfach Value und Caption "scrollst", also per VBA in Abhängigkeit des Scrollbalkens austauschst.

Man könnte natürlich auch einfach eine Listbox einsetzen, hier ginge dann sogar Mehrfachauswahl. Die geht allerdings nur als senkrechte Liste, während Du bei der OptionGroup frei gestalten kannst.

Gruß

Christian