Neuigkeiten:

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

Mobiles Hauptmenü

Schleife: Bericht als PDF automatisiert am Laufwerk speichern

Begonnen von ReitDa, Februar 12, 2017, 22:11:05

⏪ vorheriges - nächstes ⏩

ReitDa

Hallo,

ich würde dringend Hilfe benötigen und hoffe, dass mir jemand von euch helfen kann.
Leider bin ich im Bereich Access richtig eingerostet und komme einfach nicht weiter.

Es gab schon einige Threads im Forum zu meinem Thema, aber ich bekomme meine Schleife nicht zum Laufen.

Es geht um folgendes:
Es gibt mehrere hundert Rechnungen, welche in einer Tabelle gespeichert sind.
Alle Artikeldaten zur jeweiligen Rechnung sind in einer weiteren Tabelle gespeichert.
Ein Bericht verknüpft beide Tabellen und erstellt eine Rechnung, welche ich aktuell manuell als PDF abspeichere.
Beim Aufrufen des Berichtes gebe ich dazu die Rechnungsnummer als Selektionskriterium/Parameter ein.

Ich würde gerne eine Schleife haben, welche diesen Prozess automatisiert.
1.)   Aufruf des Berichtes
2.)   Selektion der Rechnungsnummer
3.)   Speichern des Berichtes als PDF (In einem Zielordner z.B. C.\Rechnungen und der Name des Berichtes sollte die Rechnungsnummer sein)
4.)   Schließen des Berichtes

Danach wieder von vorne mit der nächsten Rechnungsnummer.


Anbei mein Code-Versuch in Access 2013:

Private Sub SaveAsPDF_Click()

'-----------------------------------------------------------------
' Tabelle: 2017 MKM AT Verkäufe - Datenfeld "Rechnungsnummer"
' Bericht: Ausgangs-Rechnung AT
' Ziel: C:\Rechnungen\"Rechnungsnummer".pdf
'-----------------------------------------------------------------

Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDatei As String, strWhere As String

    Set db = CurrentDb
    'Der Code soll die aktuelle Datenbank aktiv setzen

    strSQL = "SELECT distinct Rechnungsnummer FROM 2017 MKM AT Verkäufe"
    'Das Datenfeld "Rechnungsnummer" aus der Tabelle "2017 MKM AT Verkäufe" soll selektiert werden.
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    'Der erste Eintrag soll genommen werden ( in diesem Fall AT-17-00001)
    Do Until rs.EOF
        strDatei = "C:\Rechnung\" & rs.Fields("AT-17-").Value & ".pdf"
        'Die Datei soll im Zielordner den Namen des Datenfeldes bekommen (=AT-17-00001)
        DoCmd.OpenReport "Ausgangs-Rechnung AT", acViewPreview, , "RE = '" & rs!RE & "'", acHidden
        'der Report wird geöffnet und als Selektionskriterium wird die Rechnungsnummer eingetragen.
        DoCmd.OutputTo acOutputReport, "Ausgangs-Rechnung AT", acFormatPDF, strDatei, False
        'Das PDF wird erzeugt und mit der Rechnungsnummer im Ordner abgelegt.
        DoCmd.Close acReport, "Ausgangs-Rechnung AT"
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing

    Set db = Nothing

End Sub

DF6GL

Hallo,

beherzige folgenden Ratschlag und setze ihn vollständig um:


ZitatAuf Sonder- und Leerzeichen in benutzerdefinierten Objektnamen DRINGEND verzichten.

Im Zweifelsfall unbedingt Eckklammern um den Namen verwenden.

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

MaggieMay

Hi,

im vorliegenden Fall muss (wie bereits erwähnt) der Tabellenname zwingend in eckige Klammern gesetzt werden, also so:
    strSQL = "SELECT Distinct Rechnungsnummer FROM [2017 MKM AT Verkäufe]"


Wenn die PDF-Datei den Namen der Rechnungsnummer enthalten soll, dann sähe das so aus:
strDatei = "C:\Rechnung\" & rs.Fields(0).Value & ".pdf"

Beim Filtern des Berichts muss ebenfalls und in gleicher Weise auf das erste und einzige Datenfeld des Recordsets zugegriffen werden:
DoCmd.OpenReport "Ausgangs-Rechnung AT", acViewPreview, , "RE = '" & rs(0) & "'", acHidden
Ob dies nun "Rechnungsnummer" oder "RE" heißt, kannst nur du wissen.

Hoffe, das hilft dir weiter - zumindest etwas mehr als der pauschale Hinweis auf Vermeidung von Sonderzeichen in den Bezeichnern deiner Objekte.


PS:
Des weiteren solltest du dir Gedanken darüber machen, wie sich jahresspezifische Tabellen und/oder Abfragen vermeiden lassen könnten.
Freundliche Grüße
MaggieMay

ReitDa

Euch beiden VIELEN, VIELEN Dank!
Ich habe die Benennung umgestellt und den Code mit den Vorschlägen ergänzt.

So funktioniert es einwandfrei:

Private Sub Befehl1_Click()

'-----------------------------------------------------------------
' Tabelle: "AT17VK"
' Datenfeld in AT17VK: "Rechnungsnummer"
' Bericht: "RechnungAT"
' Ziel: C:\Rechnungen\[Rechnungsnummer].pdf
'-----------------------------------------------------------------

Dim strSQL As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDatei As String, strWhere As String

    Set db = CurrentDb
    'Der Code soll die aktuelle Datenbank aktiv setzen
    strSQL = "SELECT Distinct [Rechnungsnummer] FROM [AT17VK]"
    'Das Datenfeld "Rechnungsnummer" aus der Tabelle "AT17VK" soll selektiert werden.
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    'Der erste Eintrag soll genommen werden ( in diesem Fall AT-17-00001)
    Do Until rs.EOF
        strDatei = "C:\Rechnung\" & rs.Fields(0).Value & ".pdf"
        'Die Datei soll im Zielordner den Namen des Datenfeldes bekommen (=AT-17-00001)
        DoCmd.OpenReport "RechnungAT", acViewPreview, , "Rechnungsnummer = '" & rs(0) & "'", acHidden
        'der Report wird geöffnet und als Selektionskriterium wird die Rechnungsnummer eingetragen.
        DoCmd.OutputTo acOutputReport, "RechnungAT", acFormatPDF, strDatei, False
        'Das PDF wird erzeugt und mit der Rechnugnsnummer im Ordner abgelegt.
        DoCmd.Close acReport, "RechnungAT"
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing

    Set db = Nothing

End Sub


Eine letzte Frage hätte ich noch:
Wie könnte ich die Auswahl so einschränken, dass nur das Monat meiner Wahl an Rechnungen generiert wird?
Z.B. nur der Jänner. (ich habe in meiner Tabelle ein Feld mit dem Namen "Monat", auf welches man Filtern kann)

DF6GL

Hallo,

ich hoffe , es hilft auch weiter, wenn ich wieder nur den "pauschalen Vorschlag" mache, auf reservierte Wörter (wie "Monat") zu verzichten.

Es ist Dir aber schon klar, dass im Fall der Filterung nur nach "Monat" die notwendige Jahreszahl außer Acht gelassen wird.

strSQL = "SELECT Distinct [Rechnungsnummer] FROM [AT17VK] Where [Monat] = " & nz(Me!txtMonat,0)


Dabei ist "txtMonat" ein Textfeld im Formular, in das die Monatszahl eingetragen wird.

Soll nur das akt. Jahr berücksichtigt werden, könnte das so aussehen:


strSQL = "SELECT Distinct [Rechnungsnummer] FROM [AT17VK] Where [Monat] = " & nz(Me!txtMonat,0) & "Jahreszahl = Year(Date())"

Insgesamt wäre es besser, ein Feld mit einem gültigen Datum für die Filterung zu nutzen.
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