Neuigkeiten:

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

Mobiles Hauptmenü

Automatischer PDF-Export gruppiert per VBA

Begonnen von MTGL, Januar 31, 2023, 10:35:23

⏪ vorheriges - nächstes ⏩

MTGL

Zitat von: Beaker s.a. am Januar 31, 2023, 16:55:29Die HAVING Klausel gehört zu einer WHERE-Klausel (vor dem GROUP BY) umgewandelt.
Eine Gruppierung über alle Felder ist sinnlos. Wahrscheinlich am Besten komplett
raus und im Bericht gruppieren, was tatsächlich gruppiert werden soll/muss.

gruss ekkehard

Danke dir! Ich hatte das einfach im Entwurfsmodus zusammengeklickt und eigentlich lief der Bericht einwandfrei. Jetzt wollte ich den Bericht öffnen und es hakte mit eben der Fehlermeldung aus dem VBA-Modul. Ich habe das jetzt nochmal sauber gebaut und schon läuft der Bericht wieder. Verrückt. Es war zwar nicht schön, aber ich hatte daran zwischenzeitlich nichts verändert.

Zitat von: Josef P. am Januar 31, 2023, 17:34:32
ZitatIch kann ihn auch händisch nach Kunden filtern.
Wie machst du das?

Zum Testen:
Der Aufruf
DoCmd.OpenReport "Bericht1", acViewPreview
sollte somit funktionieren.

Die Filterung nach Kunden habe ich am Anfang einfach über den SQL-Code gemacht, damit es schneller läuft.

Jo, jetzt läuft es. Allerdings wirft er mit den Zeilen
DoCmd.OpenReport ReportName, acViewPreview, , FilterString
DateiName = "report" & "_" & rs.Fields(sql).Value & ".pdf"
scheinbar nur eine riesige Datei mit dem Namen "report_rs.Fields(sql).Value.pdf" aus, anstatt dass er die Kundennamen einzeln verwendet. Du hattest also mit deiner vorangehenden Vermutung recht. Warum verwendet er jetzt nicht die Werte des Recordsets, sondern den Text?



Aktueller SQL-Code:
SELECT AMDB_TT_VIEW_VC_NB13.VERTRAGSNR, AMDB_TT_VIEW_VC_NB13.LEITUNGSNUMMER, AMDB_TT_VIEW_VC_NB13.PRODUKTTYP, AMDB_TT_VIEW_VC_NB13.LEITUNG_STATUS, AMDB_TT_VIEW_VC_NB13.ZEITRAUM_VON, AMDB_TT_VIEW_VC_NB13.ZEITRAUM_BIS, AMDB_TT_VIEW_VC_NB13.ANZAHL_STOERUNGEN, AMDB_TT_VIEW_VC_NB13.VERFUEGBARKEIT, AMDB_TT_VIEW_VC_NB13.VERFUEGBARKEIT_GJ, AMDB_TT_VIEW_VC_NB13.ZEITRAUM_MONAT, AMDB_TT_VIEW_VC_NB13.KUNDENNR, AMDB_TT_VIEW_VC_NB13.KUNDE
FROM AMDB_TT_VIEW_VC_NB13
WHERE (((AMDB_TT_VIEW_VC_NB13.ZEITRAUM_MONAT)="2022"));

MTGL

Mit folgendem Code erzeugt er jetzt einzelne Berichte, allerdings gibt er sie immer noch mit falschem Namen aus und überschreibt sie somit (report_rs.Fields(sql).Value.pdf):
Option Explicit

Public Sub ExportPDF()

    Const ReportName As String = "Bericht1"

    Dim sql As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset

    Dim DateiName As String
    Dim DateiPfad As String
    Dim FilterString As String

    'Stop ' Der Code hält hier an. Du kannst mit {F8} den jeweils nächsten Schritt ausführen.
        ' Im Direktbereich des VBA-Editors siehst du die Ausgaben von Debug.Print.

    sql = "SELECT KUNDE FROM nachKundenNr"
    Set db = CurrentDb
    Set rs = db.OpenRecordset("nachKundenNr")

    Do Until rs.EOF
        FilterString = "KUNDE = '" & rs!KUNDE & "'"
        Debug.Print FilterString  ' Ist der String SQL-tauglich?
        DoCmd.OpenReport ReportName, acViewPreview, , FilterString
        DateiName = "report" & "_" & "rs.Fields(sql).Value" & ".pdf"
        Debug.Print DateiName ' ist das ein gültiger Dateiname?
        DateiPfad = "C:\Users\H107705\Desktop\Test\" & DateiName
        Debug.Print DateiPfad

        DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, DateiPfad
        DoCmd.Close acReport, ReportName

        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set db = Nothing

End Sub

MTGL

#17
Heureka! Jetzt bin ich verdammt nah dran. Mit folgendem Code, gibt er die Berichte korrekt aus. Allerdings bezieht er sich dabei stumpf auf die 12. Spalte. Wie nötige ich ihn jetzt dazu, dass er konkret auf die Spalte KUNDE bzw. das Recordset zugreift?
Option Explicit

Public Sub ExportPDF()

    Const ReportName As String = "Bericht1"

    Dim sql As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset

    Dim DateiTitel As String
    Dim DateiName As String
    Dim DateiPfad As String
    Dim FilterString As String

    Set db = CurrentDb
    Set rs = db.OpenRecordset("nachKundenNr")

    Do Until rs.EOF
        FilterString = "KUNDE = '" & rs!KUNDE & "'"
        Debug.Print FilterString  ' Ist der String SQL-tauglich?
        DoCmd.OpenReport ReportName, acViewPreview, , FilterString
        DateiTitel = rs.Fields(11)
        DateiName = "report" & "_" & DateiTitel & ".pdf"
        Debug.Print DateiName ' ist das ein gültiger Dateiname?
        DateiPfad = "C:\Users\H107705\Desktop\Test\" & DateiName
        Debug.Print DateiPfad

        DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, DateiPfad
        DoCmd.Close acReport, ReportName

        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set db = Nothing

End Sub


MTGL

Läuft :-) Ich hatte es vorher mit [] anstatt von "" versucht.

Hab vielen Dank für deine Hilfe!

Beaker s.a.

ZitatAllerdings bezieht er sich dabei stumpf auf die 12. Spalte.
Das kommt davon, wenn man in der Abfrage
SELECT * ...verwendet, da muss man vorher abzählen an welcher Stelle das gewünschte
Feld aufgeführt ist, oder eben den Namen hernehmen (s. #18). Ist m.E. auch
die sicherste Methode, mit der Einschränkung, dass sich Tippfehler erst
zur Laufzeit bemerkbar machen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)