Neuigkeiten:

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

Mobiles Hauptmenü

Automatischer PDF-Export gruppiert per VBA

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

⏪ vorheriges - nächstes ⏩

MTGL

Hallo zusammen,

ich versuche gerade verzweifelt, Access 365 dazu zu nötigen, mir einen Bericht gruppiert nach Kunden auszugeben (pro Kunde ein separater Bericht als PDF mit Benennung nach Kunde). Der Bericht heißt "Bericht1" und entsteht aus der Abfrage "nachKundenNr". Die relevanten Werte stehen in der Spalte "KUNDE" (Text).

Im Folgenden findet ihr mein VBA-Skript, welches ich durch Onlinerecherche schreiben konnte. Nun kommt es zu einem Synatxfehler in der DoCmd.OutputTo-Zeile, wegen eines fehlenden Operators (3075: KUNDE = Max Mustermann).

-------------------------------------
Public Sub ExportPDF()

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

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

'Set rs = db.OpenRecordset(sql, dbOpenSnapshot)

Do Until rs.EOF
DoCmd.OpenReport "Bericht1", acViewPreview, , "[KUNDE] = '" & rs!KUNDE & "'"
DoCmd.OutputTo acOutputReport, "Bericht1", acFormatPDF, "C:\Users\H107705\Desktop\Test\report" & "_" & rs.Fields(sql).Value & ".pdf"
DoCmd.Close acReport, "Bericht1"
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing

End Sub
---------------------------------

Weiß eventuell einer, wo es da klemmt? Ich tippe auf fehlende Hochkommata, aber alle von mir getesteten Varianten bringen nichts. Ich habe von VBA leider gar keinen wirklichen Plan.

Vielen Dank schon mal für eure Mühe!

Viele Grüße
MTGL

Josef P.

Hallo!

Ist Option Explicit im Codemodul gesetzt?
Beim gezeigten Code, würde ich als Compiler möglicherweise meckern, weil ich die Variable sql nicht kenne.

Gruß
Josef

MTGL

Danke für den Hinweis! Da hatte ich glattweg zu viel auskommentiert :-D Explicit war auch aus. Es hat aber leider beides nichts gebracht, da der Fehler vorher aufgetreten ist.

Josef P.

Jetzt kennt die Recordset.Fields-Collection das Datenfeld "SELECT KUNDE FROM nachKundenNr" nicht. ;)

Die Möglichkeit, den Code im Einzelschritt auszuführen und die Inhalte der Variablen zu prüfen, kennst du?

MTGL

Du sprichst in Rätseln :-) Nein, das sagt mir leider beides nichts.

Josef P.

Ich schreib deinen Code etwas um, damit du den Fehler besser finden kannst. (Di nvorhandenen Fehler lasse ich aber im Code.)

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")
   
    'Set rs = db.OpenRecordset(sql, dbOpenSnapshot)
   
    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

Vielen Dank für deine Hilfe! Irgendwie zieht er den Wert in dem FilterString nicht korrekt. Ich habe jetzt wieder allerhand mit Me und .Value probiert, aber er liest den Wert des Feldes einfach nicht aus. Brauche ich dafür ein zweites Recordset? Aber dann würde er ja nicht den aktuellen Wert nehmen, oder?

Josef P.

Ich lese deine Worte, erfasse aber deren Aussage nicht. ;)

Ab wann ist etwas falsch im Code?
In welcher Zeile kommt die Fehlermeldung?

DateiName = "report" & "_" & rs.Fields(sql).Value & ".pdf"Dass hier etwas nicht stimmt, hast du hoffentlich schon entdeckt.
Oder kommst du im Ablauf gar nicht so weit?


Gruß
Josef

MTGL

Das Problem liegt in der Zeile:
DoCmd.OpenReport ReportName, acViewPreview, , FilterString
Er wirft dort den Fehler 3075 aus, da er als Resultat
KUNDE='Max Mustermann'
bekommt. Eigentlich sollte er ja den aktuellen Feldwert mit dem aus dem Recordset vergleichen und danach die Berichte ausgeben (also 'Max Mustermann' = 'Max Mustermann').

D.h. ich komme im Ablauf wirklich nicht bis dahin.

Josef P.

Ok, dann passt die Datenquelle des Berichts nicht. Der Filterausdruck sieht richtig aus.
Wie sieht die SQL-Anweisung der Abfrage aus?

Gruß
Josef

MTGL

Die zieht nur ein paar Felder aus einer Tabelle, deren Name leider sehr lang ist (kommt aus einer Oracle-DB auf die ich keinen Einfluss habe) und die nur nach dem Jahr gefiltert wird. Den Filter könnte man sicher auch in VBA einbauen:

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
GROUP BY 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
HAVING (((AMDB_TT_VIEW_VC_NB13.ZEITRAUM_MONAT)="2022"))
ORDER BY AMDB_TT_VIEW_VC_NB13.LEITUNG_STATUS;

Josef P.

Ich gehe einmal davon aus, dass die Abfrage im direkten Aufruf funktioniert.
Wenn du den Bericht ohne Filter öffnest, enthält der alle Kunden und es kommt kein Fehler, oder?

Gruß
Josef

MTGL

Jo, der Bericht funktioniert einwandfrei und liefert dann eine saubere Gruppierung nach Kunden. Ich kann ihn auch händisch nach Kunden filtern. Allerdings hätte er über 21.000 Seiten, was das Ganze etwas mühselig machen würde. Darum der Auto-PDF-Export, zumal wir das jährlich brauchen. So viele Werksstudenten finden wir nirgendwo :-D

Beaker s.a.

@MTGL
Zitatderen Name leider sehr lang ist (kommt aus einer Oracle-DB auf die ich keinen Einfluss habe
Auf die Vergabe eines Alias aber schon?!
Die 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
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)

Josef P.

ZitatIch kann ihn auch händisch nach Kunden filtern.
Wie machst du das?

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