Neuigkeiten:

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

Mobiles Hauptmenü

Access-Bericht als PDF speichern mit unterschiedlichen Namen

Begonnen von Thomas_Klee, August 05, 2016, 23:49:06

⏪ vorheriges - nächstes ⏩

Thomas_Klee

Hallo zusammen,

irgendwie komme ich nicht weiter, aber vielleicht kann jemand hier helfen.
Ich hatte bisher einen Bericht der monatliche alle Rechnungen für unsere Kunden an einem Stück ausgedruckt hat.
Jetzt möchte ich aber pro Kunde ein PDF erzeugen und natürlich die 160 Rechnungen als einzelne Dateien speichern.
Der Bericht: ABR 01_Rechnung+Einzelaufstellung hat als Kriterium wo man trennen könnte das Feld [ReNr-Belastung]
und das wäre dann auch der Dateiname für die PDF.
Beispiel: C:\Rechnungen\2016-0001.pdf
Alle Felder sind entweder in dem Bericht oder der davorliegenden Abfrage (wo alle Datensätze enthalten sind) enthalten.

Danke für Eure Tipps im voraus


PhilS

Zitat von: Thomas_Klee am August 05, 2016, 23:49:06irgendwie komme ich nicht weiter, aber vielleicht kann jemand hier helfen.
Wo genau kommst du nicht weiter? - Du hast schon die einzelnen, relevanten Details korrekt zusammengesucht. Jetzt musst du sie nur noch zusammensetzen.


  • Du öffnest ein Recordset mit den Daten deiner Abfrage.
  • In einer Do-Loop-Schleife läufst du durch alle Datensätze.
  • Für jeden Datensatz öffnest du den Bericht mit der aktuellen [ReNr-Belastung] als Kriterium.
  • Du lässt den geöffneten Bericht mit Docmd.OutputTo als PDF ausgeben und schließt den Bericht wieder.
  • Dann mit MoveNext weiter zum nächsten Datensatz im Recordset.




Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Thomas_Klee

#2
Das Problem ist das ich zwar mit den Access Bordmitteln relativ fit bin ... aber bei VBA eher Novize  :-\

Hier mein Versuch:

'-----------------------------------------------------------------
' Bericht ABR_01_Rechnung und Einzelaufstellung als PDF speichern
' Abfrage: A_RE_GESAMT
' Bericht: ABR_01_Rechnungen
' Ziel: C:\Rechnungen\[RE].pdf
'-----------------------------------------------------------------
Private Sub Befehl0_Click()
Dim sql As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Pfad As String
Dim strWHERE As String
sql = "SELECT [RE]FROM [A_RE_GESAMT]"
Set db = CurrentDb
Set rs = db.OpenRecordset(sql, dbOpenSnapshot)
Do Until rs.EOF
Pfad = "C:\Rechnung\" & rs.Fields("RE").Value & ".pdf"
strWHERE = "RE = " & rs!RE
DoCmd.OpenReport "ABR_01_Rechnung", acViewPreview, , strWHERE, acHidden
DoCmd.OutputTo acOutputReport, "ABR_01_Rechnung", acFormatPDF, Pfad, False
DoCmd.Close acReport, "ABR_01_Rechnung"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

Thomas_Klee

Also das Skript macht jetzt folgendes:
Beim Starten kommen zwei Feldabfragen SMS und HR die so nicht kommen wenn ich die Abfrage oder den Bericht manuell öffne. Diese beiden Werte sind Bestandteil der Rechnungsnummer.
Danach speichert er einmal die Datei im richtigen Pfad mit der "ersten Rechnungsnummer", allerdings sind dann alle
Rechungen in dieser einen PDF und nicht pro Rechnung eine PDF.
Bei zweiten Durchlauf kommt dann der Debugger an dieser Stelle:

DoCmd.OutputTo acOutputReport, "ABR_01_Rechnung", acFormatPDF, Pfad, False

Muss ich an dem Bericht etwas ändern, der ja normalerweise einfach die Abfrage geöffnet hat und dann eine
Riesendatei erzeugt hat?

el_gomero

Moin,

ich habe deinen Code mal modifiziert:


'-----------------------------------------------------------------
' Bericht ABR_01_Rechnung und Einzelaufstellung als PDF speichern
' Abfrage: A_RE_GESAMT
' Bericht: ABR_01_Rechnungen
' Ziel: C:\Rechnungen\[RE].pdf
'-----------------------------------------------------------------
Private Sub btnRE_EinzelDruck_Click()
Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDatei As String, strWhere as String

Set db = CurrentDb
strSQL = "SELECT * FROM [A_RE_GESAMT]"
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Do Until rs.EOF
strDatei = "C:\Rechnung\" & rs.Fields("RE").Value & ".pdf"
strWHERE = strSQL & " WHERE RE = " & rs!RE
DoCmd.OpenReport "ABR_01_Rechnung", acViewDesign
Reports!ABR_01_Rechnung.RecordSource = strWHERE
DoCmd.OpenReport "ABR_01_Rechnung", acViewPreview, , , acHidden
DoCmd.OutputTo acOutputReport, "ABR_01_Rechnung", acFormatPDF, strDatei, False
DoCmd.Close acReport, "ABR_01_Rechnung"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing

Set db = Nothing

End Sub


Die Bezeichner habe ich "sprechend" geändert, für Access reservierte Begriffe (sql) geändert. Der Bericht erhält jetzt beim Öffnen jeweils die Zuweisung nur der gewählten RE.

Habe den Code allerdings nicht getestet ...
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Thomas_Klee

#5
Hallo Jürgen,

erstmal dank für die Antwort. Habe jetzt dein Skript mal getestet. Es bleibt ebenfalls bei dem DoCMDoutput noch hängen.
In Access passiert folgende:
Er macht den Druckdialog auf, es kommen zwei Eingabefenster SMS und HR ... da ist mir noch nicht klar was er will, weil
wenn ich die Abfrage ja so öffne kommt die Frage nicht.

Und dann bleibt er mit der Fehlermeldung:Laufzeitfehler 2501 Die Aktion Output wurde abgebrochen stehen.

HILFE :-\

Kann es eventuell ein Problem sein, das das Feld RE so einen Wert hat:
SMS-HR-2016-0135

Würde dann auch erklären wo die beiden Abfragen SMS und HR herkommen könnten.

el_gomero

Zitat
Er macht den Druckdialog auf, es kommen zwei Eingabefenster SMS und HR ... da ist mir noch nicht klar was er will, weil
wenn ich die Abfrage ja so öffne kommt die Frage nicht.

Du beschreibst da 2 unterschiedliche Dinge. Per Code wird der Bericht geöffnet, die Abfrage (welche?) ist etwas anderes. Der Fehler deutet darauf hin, dass 2 benötigte Felder nicht im Bericht vorhanden sind.

Da mit meinem Code als Datenquelle für den Bericht alle Felder aus A_RE_GESAMT herangezogen werden, scheint eine weitere Tabelle in Relation zu setzen zu sein.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Thomas_Klee

Ich glaube das Problem ist die SQL abfrage:

Ich habe den Code mal so angepasst:

Option Compare Database

'-----------------------------------------------------------------
' Bericht ABR_01_Rechnung und Einzelaufstellung als PDF speichern
' Abfrage: A_RE_GESAMT
' Bericht: ABR_01_Rechnungen
' Ziel: C:\Rechnungen\[RE].pdf
'-----------------------------------------------------------------
Private Sub btnRE_EinzelDruck_Click()
Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDatei As String, strWhere As String

    Set db = CurrentDb
    strSQL = "SELECT * FROM A_RE_GESAMT WHERE (((A_RE_GESAMT.[RE])='SMS-HR-2016-0135'));"
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    Do Until rs.EOF
        strDatei = "C:\Rechnung\" & rs.Fields("RE").Value & ".pdf"
        strWhere = strSQL & " WHERE RE = " & rs!RE
        DoCmd.OpenReport "ABR_01_Rechnung", acViewDesign
        Reports!ABR_01_Rechnung.RecordSource = strWhere
        DoCmd.OpenReport "ABR_01_Rechnung", acViewPreview, , , acHidden
        DoCmd.OutputTo acOutputReport, "ABR_01_Rechnung", acFormatPDF, strDatei, False
        DoCmd.Close acReport, "ABR_01_Rechnung"
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing

    Set db = Nothing

End Sub

Jetzt wird der Bericht zwar geöffnet aber er macht die Schleife nicht ;-(

PhilS

Zwei Probleme in deinem Code:
1.) Du öffnest das Recordset für eine einzelne, konkrete Rechnungsnummer. Deshalb ist die Schliefe nach einen einzigen Durchlauf auch schon fertig.
2.) Die Rechnungsnummer als Kriterium für den Bericht musst du auch in Hochkommata einschließen.
... WHERE RE = '" & rs!RE & "'"
Letzteres war sicherlich die Ursache für die Parameterabfrage, die du vorher als Problem hattest.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Thomas_Klee

Ich werde noch kirre ......

Meldung: Typen unverträglich ... Bericht kann nicht gerendert werden ;-(((

Habe den Code wie folgt angepasst:

Option Compare Database

'-----------------------------------------------------------------
' Bericht ABR_01_Rechnung und Einzelaufstellung als PDF speichern
' Abfrage: A_RE_GESAMT
' Bericht: ABR_01_Rechnungen
' Ziel: C:\Rechnungen\[RE].pdf
'-----------------------------------------------------------------
Private Sub btnRE_EinzelDruck_Click()
Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDatei As String, strWhere As String

    Set db = CurrentDb
    strSQL = "SELECT * FROM A_RE_GESAMT WHERE RE = '" & rs!RE & "'"
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    Do Until rs.EOF
        strDatei = "C:\Rechnung\" & rs.Fields("RE").Value & ".pdf"
        strWhere = strSQL & " WHERE RE = " & rs!RE
        DoCmd.OpenReport "ABR_01_Rechnung", acViewDesign
        Reports!ABR_01_Rechnung.RecordSource = strWhere
        DoCmd.OpenReport "ABR_01_Rechnung", acViewPreview, , , acHidden
        DoCmd.OutputTo acOutputReport, "ABR_01_Rechnung", acFormatPDF, strDatei, False
        DoCmd.Close acReport, "ABR_01_Rechnung"
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing

    Set db = Nothing

End Sub


PhilS

Meinen ersten Hinweis hast du nicht umgesetzt. Das Recordset öffnest du mit einer Abfrage ohne Kriterien. Einfach nur mit SELECT * FROM deineAbfrage.

Dann gibt es noch ein Problem in deinem Code, das ich vorher nicht gesehen habe.
Diese Zeilen sind unnötig, du kannst sie löschen:

        strWhere = strSQL & " WHERE RE = " & rs!RE
        DoCmd.OpenReport "ABR_01_Rechnung", acViewDesign
        Reports!ABR_01_Rechnung.RecordSource = strWhere


Die nächste Zeile änderst du wie folgt.
DoCmd.OpenReport "ABR_01_Rechnung", acViewPreview, , "RE = '" & rs!RE & "'" , acHidden

So wird dem Report direkt beim Öffnen das gewünschte Kriterium mitgegeben, ohne dass du den Entwurf ändern musst.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Thomas_Klee

oh mann ..... wird nicht besser:

Option Compare Database

'-----------------------------------------------------------------
' Bericht ABR_01_Rechnung und Einzelaufstellung als PDF speichern
' Abfrage: A_RE_GESAMT
' Bericht: ABR_01_Rechnungen
' Ziel: C:\Rechnungen\[RE].pdf
'-----------------------------------------------------------------
Private Sub btnRE_EinzelDruck_Click()
Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDatei As String, strWhere As String

    Set db = CurrentDb
    strSQL = "SELECT * FROM A_RE_GESAMT"
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    Do Until rs.EOF
        strDatei = "C:\Rechnung\" & rs.Fields("RE").Value & ".pdf"
        DoCmd.OpenReport "ABR_01_Rechnung", acViewPreview, , "RE = '" & rs!RE & "'", acHidden
        DoCmd.OutputTo acOutputReport, "ABR_01_Rechnung", acFormatPDF, strDatei, False
        DoCmd.Close acReport, "ABR_01_Rechnung"
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing

    Set db = Nothing

End Sub

Reaktion:
Laufzeitfehler 2491
Die Aktion ist ungültig, da das Formular bzw. der Bericht nicht an eine Tabelle oder Abfrage gebunden ist.

Ich geben VBA vielleicht doch besser auf ;-(

PhilS

ZitatLaufzeitfehler 2491
Die Aktion ist ungültig, da das Formular bzw. der Bericht nicht an eine Tabelle oder Abfrage gebunden ist.
Das ist nur noch eine Kleinigkeit. Du musst noch A_RE_GESAMT (oder was immer du vorher benutzt hast) als Datenherlunft für den Report eintragen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Thomas_Klee

#13
Heurka .... er macht es fast richtig.

Ich hätte vielleicht noch sagen müssen, das in der Abfrage für die Rechnungen natürlich x-Datensätze mit der gleichen Rechnungsnummer enthalten sein können und der Bericht (die Rechnung) jetzt nicht bei jedem Datensatz den Bericht drucken soll um ihn dann 20 x zu überschreiben.

Pro [RE] die x-Datensätze hat nur einmal den Bericht öffen, da hängt es momentan noch.

Noch ein Tipp?

DF6GL

Hallo,

schreib mal so:
.
.
.
strSQL = "SELECT distinct RE  FROM A_RE_GESAMT"
.
.
.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access