Neuigkeiten:

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

Mobiles Hauptmenü

Datensätze filtern per Button

Begonnen von Nicolo#22, April 02, 2026, 17:30:51

⏪ vorheriges - nächstes ⏩

Nicolo#22

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?

werner budde

#1
Meine Empfehlung:

Deklariere im Deklarationsteil Deines Formularcodes eine Variable:
Dim lng_Kal_Jahr as long
  • Lege eine neue Hilfstabelle mit einem Feld [Kalenderjahr] an, einmalig zu befüllen mit den für Dich relevanten Kalenderjahren 19xx bis 20xx.
  • Diese Hilfstabelle soll dann die Datenherkunft eines einfachen Kombi- oder Listenfeldes in Deinem Formular sein
  • Die eigentliche Abfrage zu Deinem Formular in der SQL-Ansicht ungefähr so aufbauen:
      "Select DeineFelder from DeineTabelle Where year(DeinDatumsfeld) = " & lng_Kal_Jahr & " ggf. noch order by .. etc."
  • Bei Auswahl (AfterUpdate) eines Eintrages im Kalenderjahr-Kombifeld 2 Dinge:
lng_Kal_Jahr = me.Kombifeld
 me.requery


Nicht getestet, aber der Ansatz müsste so gehen.
Gruß Werner

jens05

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 ;-)
mfg
jens05

Knobbi38

#3
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

Warum eigentlich keine Kombobox?

Knobbi38


jens05

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  ;)
mfg
jens05

Bitsqueezer

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 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