Neuigkeiten:

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

Mobiles Hauptmenü

Bericht nach Jahr filtern

Begonnen von Daniel92, Januar 29, 2018, 09:46:53

⏪ vorheriges - nächstes ⏩

Daniel92

Guten Morgen zusammen,

ich versuche einen Bericht nach dem Jahr zu filtern und dann als PDF in einem hinterlegten Pfad abzuspeichern.
Das mit der PDF abspeichern klappt ganz gut, nur die Filterung bereitet mir Probleme. Ich hoffe ihr könnt mir da weiterhelfen.

Meine beiden Ansätze zum Filtern wären diese:

1. Ansatz:
   
Dim Dat, Jahr
Dim cancel As Integer

     Dat = Format(Date, "yyyy")
     Jahr = InputBox("Für welches Jahr möchten Sie den Bericht erstellen?", _
                     "Geben Sie das Jahr an", Dat)
     Reports!rpt_Schulungsplan.Filter = "Year(Nz(Datum)) = " & Jahr
     Reports!rpt_Schulungsplan.FilterOn = True


2. Ansatz:

Dim strBericht  As String
Dim strFilter   As String
Dim strDatei    As String
Dim DatumBeginn As Date
Dim DatumEnde   As Date

    'Erster Datumswert
    DatumBeginn = DateSerial(2018, 1, 1)
    'letzter Datumswert
    DatumEnde = DateSerial(2019, 12, 31)

strBericht = "rpt_Schulungsplan"
strDatei = "S:\s\sf\public\Weiterbildung_Operatives_Personal\2018\Schulungsplan\" & "Schulungsplan" & ".pdf"

'Bei strFilter hab ich mehrere Ansätze, irgendwie fruchtet aber nichts.
strFilter = "Reports!rpt_Schulungsplan!Termin1Beginn between " & Format(DatumBeginn, "\#yyyy\-mm\-dd\#") & _
            " AND " & Format(DatumEnde, "\#yyyy\-mm\-dd\#")
'strFilter = "Date between " & Format(DatumBeginn, "\#yyyy\-mm\-dd\#") & _
            " AND " & Format(DatumEnde, "\#yyyy\-mm\-dd\#")
'strFilter = "Reports!rpt_Schulungsplan!Termin1Beginn between " & DatumBeginn & " and " & DatumEnde
'strFilter = "Datum between #" & Format(DatumBeginn, "mm\/dd\/yyyy") & "# and #" & Format(DatumEnde, "mm\/dd\/yyyy") & "#"

DoCmd.OpenReport strBericht, acViewPreview, , strFilter


Beste Grüße
Daniel

PhilS

Ich würde Ansatz 2 bevorzugen, weil dieser keinen Funktionsaufruf im Kriterienausdruck hat und damit bei großem Datenvolumen und sinnvoller Indizierung sicherlich eine deutlich bessere Performance bietet.

Du musst dich allerdings in den Kriterien direkt auf den Feldnamen in der Datenherkunft des Reports beziehen. Also kein "Reports!rpt_Schulungsplan!", sondern nur den Feldnamen schreiben.

Dein Kriterienausdruck funktioniert nur dann wie beabsichtigt, wenn du sicher sein kannst, dass keine Uhrzeiten in deinen Datumsfeldern gespeichert sind. Alles was am 31.12. nach 00:00 Uhr liegt, wird im Moment nicht im Ergebnis eingeschlossen.

Siehe auch: Datum/Uhrzeit in VBA und Access
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

MzKlMu

Hallo,
so:
Dim Jahr As Integer
     Jahr = InputBox("Für welches Jahr möchten Sie den Bericht erstellen?", _
                     "Geben Sie das Jahr an", Year(Date))
     Me.Filter = "Year(Datum) = " & Jahr
     Me.FilterOn = True

Datum muss in der Datenherkunft des Berichts enthalten sein.

PS:
Du solltest Code immer vollständig zeigen, von der 1. bis zur letzten Zeile.
Man sieht ja nicht was Du z.B. mit dem Cancel vorhast. Cancel ist übrigens reserviert und als eigner Variablenname untauglich.
Ebenso ist die Deklaration von Variablen ohne expliziten Datentyp nicht zu empfehlen.
In Deinem 2- Ansatz filterst Du aber auf 2 Jahre (2018 und 2019), Absicht ?

Gruß Klaus

Lachtaube

@Daniel,

ich würde zumindest ein Formular verwenden, in dem ein gültiges Jahr aus einem Kombi- oder Listenfeld ausgewählt werden kann, welches den Bericht filtert. Als Datensatzherkunft kann dann eine Abfrage in dieser Form dienen.SELECT DISTINCT Year(DeinDatumsfeld) FROM TabellenOderAbfragename;Als Name des Steuerelements verwende ich hier cboJahr. Weiterhin gibt es einen Knopf (hier cmdErstellePdf genannt), der die Pdf-Erstellung einleitet. Um einen eventuell vorhanden Index nutzen zu können, sollte der Filterausdruck jeweils Datumswerte auf der linken Seite des Ausdrucks beinhalten.Private Sub cmdErstellePdf_Click()
   Dim VonKriterium As String, BisKriterium As String
   Const BER_NAME As String = "Hier_Den_Berichtsnamen_eintragen"
   Const PDF_PFAD As String = "C:\hier\dein\pdf\ausgabe\pfad.pdf"

   If IsNull(Me.cboJahr) Then
      MsgBox "Bitte zuerst ein Jahr auswählen."
      Exit Sub
   End If

   VonKriterium = BuildCriteria("DeinDatumsfeld", dbDate, ">=" & _
                                DateSerial(Me.cboJahr, 1, 1))
   BisKriterium = BuildCriteria("DeinDatumsfeld", dbDate, "<" & _
                                DateSerial(Me.cboJahr + 1, 1, 1))
   DoCmd.OpenReport BER_NAME, _
                    WhereCondition:=VonKriterium & " AND " & BisKriterium, _
                    WindowMode:=acHidden
   DoCmd.OutputTo acOutputReport, BER_NAME, acFormatPDF, PDF_PFAD
   DoCmd.Close acReport, BER_NAME, acSaveNo
End Sub
Grüße von der (⌒▽⌒)

Daniel92

Danke für die schnellen Antworten!

@Klaus
das mit Me.Filter hab ich auch schon versucht, nur kommt dann die Fehlermeldung
"unzulässige Verwendung des Schlüsselwortes Me".
Der Bericht wird von einem Formular aus angesprochen, deswegen dachte ich an
Reports!rpt_Schulungsplan.Filter
hab ich hier einen Denkfehler?
cancel hab ich aus dem Code genommen.

@Phil
das mit der Uhrzeit war ein super Tipp, die hatte ich nämlich nicht beachtet beim filtern. Leider funktioniert die Filterung immer noch nicht.... Abgesehen davon habe auch ein Datum ohne Uhrzeit, dieser Datensatz sollte ja wenigstens gefiltert werden, nur filtert meine Code überhaupt nicht.
Hier mal mein ganzer Code

Public Function BerichtErstellen()
If MsgBox("Bericht jetzt erstellen? Dies kann einige Sekunden dauern", vbYesNo + vbQuestion, "Frage") = vbNo Then Exit Function

    Dim strBericht  As String
    Dim strFilter   As String
    Dim strDatei    As String
    Dim DatumBeginn As Date
    Dim DatumEnde   As Date

    'Erster Datumswert
    DatumBeginn = DateSerial(2018, 1, 1)
    'letzter Datumswert
    DatumEnde = DateSerial(2018, 12, 31)

    'Zeitraum Festlegen
    'strFilter = "Termin1Beginn between " & Format(DatumBeginn, "\#yyyy\-mm\-dd\#") & _
            " AND " & Format(DatumEnde, "\#yyyy\-mm\-dd\#")

    strBericht = "rpt_Schulungsplan"
    strDatei = "S:\s\sf\public\Weiterbildung_Operatives_Personal\2018\Schulungsplan\" & "Schulungsplan" & ".pdf"

    DoCmd.OpenReport strBericht, acViewPreview, , strFilter, acHidden                                           'öffnet den Bericht
    DoCmd.OutputTo acOutputReport, strBericht, acFormatPDF, strDatei, False                                'speichern des Berichts als PDF
    DoCmd.Close acReport, strBericht



@Lachtaube
Danke auch für deinen Rat, nur scheint mir der zu aufwändig.
Ich möchte einfach nur einen schon erstellten Bericht filtern und dann den gefilterten Bericht abspeichern.
Manuell im Bericht funktioniert das einwandfrei.
Ich klicke auf ein Datumsfeld, dann auf Datumsfilter -> zwischen... -> und gebe dann Anfangs- und Enddatum ein.
Das sollte doch mit paar Zeilen Code möglich sein.

Beste Grüße
Daniel

MzKlMu

#5
Hallo,
übergebe den Filter im OpenReport Befehl. Das sollte eigentlich reichen.
   DoCmd.OpenReport strBericht, acViewPreview, , "Year(Termin1Beginn) = 2018" , acHidden 
Das lässt sich auch mit einem Kombi zur Auswahl des Jahres verbinden:
   DoCmd.OpenReport strBericht, acViewPreview, , "Year(Termin1Beginn) = " & Me.cboJahreswahl" , acHidden 
Den Rest kannst Du Dir sparen.
Gruß Klaus

Lachtaube

Im Code ist ja auch strFilter (versehentlich?) auskommentiert.
Grüße von der (⌒▽⌒)

Daniel92

Hallo zusammen,

vielen Dank für eure Hilfe! Jetzt funktionieren alle 3 Ansätze, meine beiden und die Kurzversion vom Klaus.
Mein Problem lag bei der Parameterübergabe, es hat sich ein Leerzeichen im Feldname eingeschlichen....

Vielen Dank nochmal für eure Hilfe.

Beste Grüße
Daniel