Access VBA, Bericht filtern
Wie kann ich einen Bericht per VBA nach Datum (von... bis...) filtern?
Hallo Wissende
Ich brauche eurern fachmännischen Rat! Ich habe einen Bericht den ich mit einer Abfrage als Grundlage generiert habe. In diesem Bericht habe ich ein Feld welches ein Datum enthält. Nun soll man in diesem Bericht so filtern können das nur die Datensätze angezeigt werden, die in einer gewissen Zeitspanne liegen (von/bis).
Ich habe mir das so gedacht:
Ich habe ein Formular, welches zwei ungebundene Textfelder und ein Button enthält. In die Textfelder gebe ich die Datum Werte "von" und "bis" ein. Beim klick auf den Button öffnet sich dann der Bericht, und zwar nur mit den Datensätzen die in dieser Zeitspanne liegen!
Leider habe ich keine Ahnung wie der Code dazu aussehen sollte
ABER! Ich weiss das Ihr es wisst!
MfG Valume
Hallo Wissende
Ich brauche eurern fachmännischen Rat! Ich habe einen Bericht den ich mit einer Abfrage als Grundlage generiert habe. In diesem Bericht habe ich ein Feld welches ein Datum enthält. Nun soll man in diesem Bericht so filtern können das nur die Datensätze angezeigt werden, die in einer gewissen Zeitspanne liegen (von/bis).
Ich habe mir das so gedacht:
Ich habe ein Formular, welches zwei ungebundene Textfelder und ein Button enthält. In die Textfelder gebe ich die Datum Werte "von" und "bis" ein. Beim klick auf den Button öffnet sich dann der Bericht, und zwar nur mit den Datensätzen die in dieser Zeitspanne liegen!
Leider habe ich keine Ahnung wie der Code dazu aussehen sollte
ABER! Ich weiss das Ihr es wisst!
MfG Valume
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 126464
Url: https://administrator.de/contentid/126464
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
22 Kommentare
Neuester Kommentar
Hallo,
ungefähr so:
Wird aus dem Formular, mit dem die Tabelle/Abfrage verknüpft ist, aufgerufen, über den Button "cmdAusgabe". Das Datumsfeld im Formular heißt "Datum", die Von/Bis-Felder heißen txtDatVon bzw. txtDatBis. Über setFilter wird ein SQL-Ausdruck zum Filtern der Ausgabe generiert, fehlen EInträge in Von/Bis wird jeweils alles (vorausgesetzt, es gibt keine EInträge vor dem 1.1.1900) ausgegeben. Die Funktion SQLDate ist notwendig, um das Datum SQL-gerecht zu formatieren.
Hope this helps.
Viele Grüße
ungefähr so:
Private Sub cmdAusgabe_Click()
On Error GoTo Err_cmdAusgabe_Click
Dim stDocName As String
stDocName = "rptReport"
DoCmd.OpenReport stDocName, acPreview, , setFilter()
Exit_cmdAusgabe_Click:
Exit Sub
Err_cmdAusgabe_Click:
MsgBox Err.Description
Resume Exit_cmdIntPrg_Click
End Sub
Private Function setFilter() As String
Dim sFilter, sVon, sBis As String
sFilter = ""
If Me.txtDatVon <> "" Then
sVon = "Datum >= " & SQLDate(Me.txtDatVon)
End If
If Me.TxtDatBis <> "" Then
sBis = "Datum <= " & SQLDate(Me.TxtDatBis)
End If
If sVon = "" And sBis = "" Then
sFilter = "Datum > #01/01/1900#"
Else
If sVon <> "" And sBis <> "" Then
sFilter = sVon & " And " & sBis
Else
If sVon = "" Then
sFilter = sBis
Else
sFilter = sVon
End If
End If
End If
setFilter = "(" & sFilter & ")"
End Function
Private Function SQLDate(InDate As String) As String
Dim sDay, sMonth, sYear As String
Dim sDatVal As String
sDatVal = DateValue(InDate)
sDay = Day(sDatVal)
sMonth = Month(sDatVal)
sYear = Year(sDatVal)
SQLDate = "#" & sMonth & "/" & sDay & "/" & sYear & "#"
End Function
Wird aus dem Formular, mit dem die Tabelle/Abfrage verknüpft ist, aufgerufen, über den Button "cmdAusgabe". Das Datumsfeld im Formular heißt "Datum", die Von/Bis-Felder heißen txtDatVon bzw. txtDatBis. Über setFilter wird ein SQL-Ausdruck zum Filtern der Ausgabe generiert, fehlen EInträge in Von/Bis wird jeweils alles (vorausgesetzt, es gibt keine EInträge vor dem 1.1.1900) ausgegeben. Die Funktion SQLDate ist notwendig, um das Datum SQL-gerecht zu formatieren.
Hope this helps.
Viele Grüße
andere Variante "ohne Programmieren":
die Daten auf denen der Bericht basiert kommen aus einer Abfrage, nicht nur einer Tabelle (dürfte aber 1:1 sein), dann kommen in die Abfrage Kriterien hinzu, die mit dem Ausdrucksassistenten (geladene Formulare, Felder, Wert) aufgebaut werden: sieht in etwa so aus: >Forms![NameDesFormulars]![NameDesFeldes], fertig! ("in etwa" weil ich mir nicht merken kann, ob das nun deutschsprachig oder englisch generiert wird, macht aber der Ausdrucksassistent)
Das Formular muß beim Anzeigen des Berichtes offen sein.
Vorteil: intuitiv, Nachteile: es muß dokumentiert werden, daß die Abfrage vom Formular abhängt, Access ()
die Daten auf denen der Bericht basiert kommen aus einer Abfrage, nicht nur einer Tabelle (dürfte aber 1:1 sein), dann kommen in die Abfrage Kriterien hinzu, die mit dem Ausdrucksassistenten (geladene Formulare, Felder, Wert) aufgebaut werden: sieht in etwa so aus: >Forms![NameDesFormulars]![NameDesFeldes], fertig! ("in etwa" weil ich mir nicht merken kann, ob das nun deutschsprachig oder englisch generiert wird, macht aber der Ausdrucksassistent)
Das Formular muß beim Anzeigen des Berichtes offen sein.
Vorteil: intuitiv, Nachteile: es muß dokumentiert werden, daß die Abfrage vom Formular abhängt, Access ()
Hallo,
ich weiß jetzt nicht genau, ob ich verstanden habe, was Du meinst, aber hier wird der Bericht geöffnet (angepasst auf Dein Beispiel):
Eine Verknüpfung der Abfrage mit dem Formular ist nicht notwendig, der Filter ist ja letztlich ein SQL-WHERE-Statement, welches von DoCmd.OpenReport ausgewertet wird.
Die Lösung von broecker sollte auch gehen, Du musst aber eine extra Abfrage für den Bericht erstellen, die dann die Kriterien enthält.
ich weiß jetzt nicht genau, ob ich verstanden habe, was Du meinst, aber hier wird der Bericht geöffnet (angepasst auf Dein Beispiel):
stDocName = "ber_QBericht"
DoCmd.OpenReport stDocName, acPreview, , setFilter()
Die Lösung von broecker sollte auch gehen, Du musst aber eine extra Abfrage für den Bericht erstellen, die dann die Kriterien enthält.
Sorry, die Zeile ist noch als Fragment aus meiner Anwendung stehen geblieben, kein Wunder, dass er sie angemeckert hat. Sie muss in dem Beispiel so lauten:
Resume Exit_cmdAusgabe_Click
Die Sortierung kannst Du über die Schaltfläche "Sortieren und Gruppieren" in der Entwurfsansicht des Berichtes festlegen.
Meines Wissens nicht direkt. Du könntest aber über z.B. ein Auswahlfeld (nennen wir es mal "cboAuswahl") verschiedene vorsortierte Berichte auswählen lassen und dann im Programmcode die Zeile
Auf die gleiche Art könnte man in der DoCmd.OpenReport-Methode das Filter-Argument auswählen, um dem Bericht eine bestimmte (sortierte) Abfrage zuzuweisen, aber da wird es dann schon wieder etwas komplizierter, so dass Du da, ggf. mit Hilfe der Hilfefunktion zur OpenReport-Methode, etwas experimentieren solltest.
stDocName = "ber_QBericht"
durch so etwas wiestDocName = Me.cboAuswahl
ersetzen.Auf die gleiche Art könnte man in der DoCmd.OpenReport-Methode das Filter-Argument auswählen, um dem Bericht eine bestimmte (sortierte) Abfrage zuzuweisen, aber da wird es dann schon wieder etwas komplizierter, so dass Du da, ggf. mit Hilfe der Hilfefunktion zur OpenReport-Methode, etwas experimentieren solltest.
Hallo,
der Filter ist ein String (im Beispiel in der setFilter-Funktion erstellt), der dem Bedingungsteil eines SQL-SELECT-WHERE-Statements entspricht.
Beispiel:
SQL:
Du müsstest an den Filterstring in der Funktion setFilter() anhängen:
Tipp dazu: nach der Codeänderung setze einmal einen Breakpoint in die setFilter-Funktion und schaue Dir per Einzelschrittverarbeitung an, wie sich der setFilter-String zusammenbaut.
der Filter ist ein String (im Beispiel in der setFilter-Funktion erstellt), der dem Bedingungsteil eines SQL-SELECT-WHERE-Statements entspricht.
Beispiel:
SQL:
SELECT Feld1, Feld2 FROM tblTabelle WHERE Id = "test"
Filter:Id = "test"
Konkret:Du müsstest an den Filterstring in der Funktion setFilter() anhängen:
setFilter = setFilter & "And ErfasstGruppe_IDFS = " & Me.Erfasser
natürlich nur, wenn Erfasser nicht leer ist (sonst kommt ein Syntaxfehler)Tipp dazu: nach der Codeänderung setze einmal einen Breakpoint in die setFilter-Funktion und schaue Dir per Einzelschrittverarbeitung an, wie sich der setFilter-String zusammenbaut.
Hallo,
s.o.:
(Sorry, habe oben setFilter geschrieben, meinte die lokale Variable sFilter, in der der String zusammengebaut wird)
für letzteres müsstest Du eine if-Abfrage bauen. Diesen Block fügst Du vor
Um die Funktionsweise zu verstehen, noch einmal die Empfehlung, im VB-Editor einen Haltepunkt zu Beginn der setFilter-Funktion zu setzen und dann mit Einzelschritten den Zusammenbau des Filterausdrucks verfolgen.
s.o.:
(Sorry, habe oben setFilter geschrieben, meinte die lokale Variable sFilter, in der der String zusammengebaut wird)
sFilter = sFilter & "And ErfasstGruppe_IDFS = " & Me.Erfasser
natürlich nur, wenn Me.Erfasser nicht leer ist (sonst kommt ein Syntaxfehler)für letzteres müsstest Du eine if-Abfrage bauen. Diesen Block fügst Du vor
setFilter = "(" & sFilter & ")"
ein, was als letzte Zeile nur noch einmal Klammern um die Abfrage baut, die nicht zwingend erforderlich sind, die Zeile könnte auch lauten:setFilter = sFilter
Um die Funktionsweise zu verstehen, noch einmal die Empfehlung, im VB-Editor einen Haltepunkt zu Beginn der setFilter-Funktion zu setzen und dann mit Einzelschritten den Zusammenbau des Filterausdrucks verfolgen.