Neuigkeiten:

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

Mobiles Hauptmenü

Bericht als pdf exportieren

Begonnen von tismo, Juli 19, 2017, 18:32:30

⏪ vorheriges - nächstes ⏩

tismo

Hallo,

ich versuche einen Bericht aus einem Formular heraus in ein pdf zu exportieren. Dazu versuche ich es mit folgendem Code:

DoCmd.OutputTo acOutputReport, "Organisation Beerdigung-Trauerfeier", acFormatPDF, "C:\Bemopro\Dokumente\" & Me.KurzzeichenSterbefall & "\Datenblatt-Trauerfeier.pdf"

Das pdf soll in C:\Bemopro\Dokumente\(kurzzeichen) erstellt werden
Mit dem o.g. Code werden allerdings alle  vorhandenen Datensätze in ein pdf konvertiert und nicht nur ein bestimmter Datensatz.

Wie muss der Code aussehen, damit ich einen Bericht aus dem geöffneten Datensatz in ein pdf konvertieren kann. Beim Ausdruck über ein Makro habe ich folgende Bedingung ein gefügt: [Rechnungsnummer]=[Formulare]![RegisterDaten]![Rechnungsnummer]

el_gomero

Hallo tismo,

ist einer der Klassiker - Lösung in der faq  http://www.donkarl.com?FAQ5.9
Gruß
Jürgen


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

tismo

danke für die Antwort.

aber da war ich auch schon
ich bekomme trotzdem nicht das gewünschte Ergebnis.
Ich habe den Code wie folgt erweitert:

DoCmd.OutputTo acOutputReport, "Organisation Beerdigung - Trauerfeier", , , "Rechnungsnummer =" & Me!Rechnungsnummer ', acFormatPDF, "C:\Bemopro\Dokumente\Datenblatt-Trauerfeier.pdf"

Fehler:

Sie haben für eines der Argumente einen Ausdruck eingegeben, der nicht den für das Argument erforderlichen Datentyp hat.


MzKlMu

#3
Hallo,
OutputTo kennt keine Where Klausel 5.9 greift daher hier nicht.
Du musst die Abfrage die dem Bericht zu Grunde liegt entsprechend filtern, sodass nur ein Datensatz (der gewünschte) enthalten ist.
Gruß Klaus

el_gomero

Moin zusammen,

aus der faq 5.9

Zitat
Verwende als Datensatzherkunft des Berichtes eine Abfrage und schreibe dort bei den Kriterien eines passenden, eindeutigen Feldes einen Bezug auf dein Formular. z.B.
Forms!MeinFormular!Id

also passt die Lösung schon ;)
Gruß
Jürgen


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

MzKlMu

Hallo,
@Jürgen,
sorry, Du hast recht, ich habe das vor dem oder überlesen.  :)
Gruß Klaus

el_gomero

@ Tismo

Zitat
Sie haben für eines der Argumente einen Ausdruck eingegeben, der nicht den für das Argument erforderlichen Datentyp hat.

richtig müsste es heissen:

Sie haben für mehrere der Argumente ...

Dein Befehl mal lesbarer:

DoCmd.OutputTo acOutputReport,
"Organisation Beerdigung - Trauerfeier",
,
,
"Rechnungsnummer =" & Me!Rechnungsnummer ',
acFormatPDF,
"C:\Bemopro\Dokumente\Datenblatt-Trauerfeier.pdf"


Syntax für diesen Befehl (wird zB nach Eingabe des ersten Komma in der IDE angezeigt):

DoCmd.OutputTo acOutputReport,
OjbejktName,
Outputformat ,
Outputfile ,
Autostart,
Templatefile,
Encoding,
OutputQuality


Bevor du aber diese Stelle angehst, solltest du dafür sorgen, dass nur der beabsichtige Datensatz im Bericht enthalten ist. Wie das geht steht wie angegeben in der faq.
Gruß
Jürgen


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

PhilS

Zitat von: MzKlMu am Juli 19, 2017, 23:00:09OutputTo kennt keine Where Klausel 5.9 greift daher hier nicht.
Du musst die Abfrage die dem Bericht zu Grunde liegt entsprechend filtern, sodass nur ein Datensatz (der gewünschte) enthalten ist.
Das funktioniert, es gibt jedoch noch eine andere, aus meiner Sicht einfachere, Variante.

Den Bericht versteckt mit WhereCondition öffnen, PDF erstellen, Bericht schließen. Wenn der Bericht bereits geöffnet ist, dann wird er so wie er ist, als PDF exportiert.

Hier in Code:
DoCmd.OpenReport "derReportName",acViewPreview,,"XYZ = 1234",acHidden
DoCmd.OutputTo acOutputReport,"derReportName",acFormatPDF
Docmd.Close acReport,"derReportName"


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tismo

Danke für die Hilfe, :)
klappt einwandfrei!  :) :) :)

Eine Frage habe ich dann doch noch. ???
Der Bericht wird nun als pdf auf dem Computer auf Laufwerk D:\ gespeichert

DoCmd.OutputTo acOutputReport, "Organisation Beerdigung-Trauerfeier", acFormatPDF, "D:\Users\User\Documents\Bemopro\" & SterbefallName & ", " & Me.SterbefallVorname & " - Datenblatt-Trauerfeier.pdf"

Da die Anwendung auf mehreren Computer und Laptops läuft ist der Speicherpfad auch jedesmal anders. Wie sieht der Code aus, wenn der Speicherpfad von einem Textfeld aus dem Formular Systemdaten stammt? Somit kann ich im Formular einstellen wo das pdf gespeichert werden soll.

DF6GL

Hallo,

ich würde das anders lösen:


a) Eine "ParameterTabelle", in der solche "kundenspezifischen" Daten eingetragen sind (Customizing)

b) ein Unterverzeichnis ("PDF") unter dem Frontend-Datei-Verzeichnis anlegen.  Dadurch kann mit
Currentproject.Path & "\PDF\" & Me.SterbefallVorname & "_Datenblatt-Trauerfeier.pdf"
die PDF-Datei gespeichert werden.




btw:  auch in Dateinamen möglichst auf Leerzeichen verzichten.

tismo

Hallo Franz,

funktioniert dies auch, wenn der pdf-Pfad nicht der Pfad ist, in dem access läuft?
Bsp.
Access läuft auf c:bemopro
pdf Speicherung Computer 1 in D:\Users\User\Documents\Bemopro\
pdf Speicherung Laptop 2 in C:User\Documents\Bemopro\

Deshalb dachte ich, es wäre für den Anwender einfacher, wenn er im Formular Systemsteuerung im Textfeld "pdf-Pfad" den Speicherpfad für den aktuellen Computer/Laptop eingibt.

el_gomero

Hallo,

Zitat

funktioniert dies auch, wenn der pdf-Pfad nicht der Pfad ist, in dem access läuft?

Welche Kräfte halten dich davon ab es zu probieren? Falls es nicht klappt kannst du das Resultat (Fehlermeldung, Verhalten) hier posten.
Gruß
Jürgen


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

DF6GL

Hallo,


und Du willst den Usern tatsächlich zumuten, den Speicherort jedes Mal neu einzutippen ??

3. Möglichkeit:

Wenn es sich um ein System-Verzeichnis handelt, könnte der Pfad auch mit einer Umgebungsvariablen zusammengebaut werden:


Dim strDatei As String
strDatei = Environ(Userprofile) & "\Documents\" & Me.SterbefallVorname & "_Datenblatt-Trauerfeier.pdf"


tismo

Hallo Franz,

ich sehe das Problem darin, dass die Anwendung regelmäßig erneuert wird. Wenn ich also einen festen Pfad eingebe, ist dieser Pfad auf jedem Computer / Laptop gleich. Da dies technisch nicht möglich ist, sind auf einigen Computer die Pfade anders. Um nicht auf jedem Computer nach jedem Update den Pfad im Code "von Hand" einstellen zu müssen, dachte ich mit, ich stelle einmal in dem Formular (Systemdatei) in dem Textfeld (pdf-Pfad) den jewiligen Pfad ein und anschließend wir automatisch der richtige Pfad ausgelesen und das pdf in diesem Pfad erstellt. Leider kann ich mit

ZitatDim strDatei As String
strDatei = Environ(Userprofile)

nichts anfangen.  :-[
Wo steht der Hinweis auf das Formular und das Textfeld?

Danke für die bisherige Hilfe.

Lachtaube

Ich würde Franzens Vorschlag aus #9 in Betracht ziehen. Dann wäre nur beim ersten Start des Frontends ein Erstellen des Verzeichnisses notwendig.Private Sub DeinPdfProzedere()
   Const ReportName As String = "Organisation Beerdigung-Trauerfeier"
   
   Dim Path As String
   
   
   Path = CurrentProject.Path & "\Pdf"
   If Not DirExists(Path) Then MkDir Path
   
   '...
   DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, _
         Pfad & "\" & SterbefallName & ", " & Me.SterbefallVorname & " - Datenblatt-Trauerfeier.pdf"
   '...
End Sub
und in einem allgemeinen VBA-Modul kannst Du die Funktion zur Prüfung, ob ein Verzeichnis existiert unterbringen.
Public Function DirExists(Path As String) As Boolean
   
   On Error Resume Next
   
   DirExists = CBool(GetAttr(Path) And vbDirectory)
   
   On Error GoTo 0
   
End Function
Grüße von der (⌒▽⌒)