collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 61
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 2
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14035
  • stats Beiträge insgesamt: 67213
  • stats Themen insgesamt: 9065
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Bericht nach Jahr filtern  (Gelesen 1244 mal)

Offline Daniel92

  • Newbie
  • Beiträge: 47
Bericht nach Jahr filtern
« am: Januar 29, 2018, 09:46:53 »
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
 

Offline PhilS

  • Administrator
  • Access-Profi
  • *****
  • Beiträge: 357
    • Tipps zu Access, VBA, SQL und Co.
Re: Bericht nach Jahr filtern
« Antwort #1 am: Januar 29, 2018, 10:01:06 »
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
 
Neues Access 2019 Feature angekündigt: Modern Charts
 
Folgende Mitglieder bedankten sich: Daniel92

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7375
Re: Bericht nach Jahr filtern
« Antwort #2 am: Januar 29, 2018, 10:04:16 »
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
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1294
Re: Bericht nach Jahr filtern
« Antwort #3 am: Januar 29, 2018, 10:29:18 »
@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 (⌒▽⌒)
 
Folgende Mitglieder bedankten sich: PhilS

Offline Daniel92

  • Newbie
  • Beiträge: 47
Re: Bericht nach Jahr filtern
« Antwort #4 am: Januar 29, 2018, 11:34:54 »
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
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7375
Re: Bericht nach Jahr filtern
« Antwort #5 am: Januar 29, 2018, 11:43:21 »
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.
« Letzte Änderung: Januar 29, 2018, 11:57:01 von MzKlMu »
Gruß
Klaus
 
Folgende Mitglieder bedankten sich: Daniel92

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1294
Re: Bericht nach Jahr filtern
« Antwort #6 am: Januar 29, 2018, 11:47:34 »
Im Code ist ja auch strFilter (versehentlich?) auskommentiert.
Grüße von der (⌒▽⌒)
 

Offline Daniel92

  • Newbie
  • Beiträge: 47
Re: Bericht nach Jahr filtern
« Antwort #7 am: Januar 29, 2018, 13:58:58 »
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