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]
Hallo tismo,
ist einer der Klassiker - Lösung in der faq http://www.donkarl.com?FAQ5.9
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.
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.
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 ;)
Hallo,
@Jürgen,
sorry, Du hast recht, ich habe das vor dem oder überlesen. :)
@ 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.
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"
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.
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.
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.
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.
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"
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.
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
Hallo,
wenn das eine Mehrbenutzerumgebung ist, so muss doch jeder User sein eigenes Frontend haben. Und dort kann man (der User) den Pfad doch fest eintragen. Zu seiner Hilfe könnte man noch den Dateiauswahldialog anbieten, damit sich der User seinen Pfad aussuchen kann.
Und auch gleich in einer Tabelle speichern. Diese Tabelle dann im Frontend.
Hallo,
bei der von Franz vorgeschlagegen Methode werden die Umgebungsvariablen des Benutzers ausgelesen und davon ausgehend ein weiterer vorgegebener Pfad berücksichtigt. Wenn dem Benutzer der Speicherort frei definierbar möglich sein soll, muss eine individuelle Speicherung erfolgen. Diese würde ich aber im Backend vornehmen, sonst müsste bei jeder Änderung am Frontend diese Tabelle vor Tausch aktualisiert werden.
Hallo Klaus!
du hast das glaube ich richtig verstanden. Jeder User (Computer) hat eine eigenes Frontend. In diesem Fall in Form eines Formulares Systemsteuerung (basierend auf der Tabelle 'tblSystemsteuerung'). Ich arbeite mit MS Access 2010 weil hiermit die Tabellen noch repliziert werden können. Die Tabelle 'Systemsteuerung' wird nicht repliziert und jeder User (Computer) hat seine eigene Systemsteuerung. Also ist es meines Erachtens am sinnvollsten in dieser Systemsteuerung einmal den Pfad einzugeben, dann muss der User nicht bei jedem Start den Pfad eingegeben oder den Pfad aus einer Liste aussuchen. Der Speicherpfad soll immer gleich sein.
ZitatDann wäre nur beim ersten Start des Frontends ein Erstellen des Verzeichnisses notwendig.
Ich versuche die Anwendung für den Anwender so einfach wie möglich zu gestalten, da einige Anwender jenseits der 70 sind.
Hallo,
wenn jeder User seine eigenes Frontend hat, wo ist dann das Problem ?
Lege den Pfad in die Tabelle "Systemsteuerung" und gut ist.
Zitatda einige Anwender jenseits der 70 sind.
Vorsicht bitte, das wird schnell diskriminierend. :D ;D 8)
Hallo,
ZitatDer Speicherpfad soll immer gleich sein
das ist er sowieso.. Es stellt sich eher die Frage, ob das Speicher-Verzeichnis von vornherein genau definiert sein muss. Das Ganze geht doch "automatisch", wenn einfach festgelegt wird, dass das PDF-Speicherverzeichnis (grundsätzlich) unter dem FE-Verzeichnis zu liegen kommt. Dann kann das FE-Verzeichnis liegen, wo es will, es wird immer ein darunter liegendes "PDF"-Verzeichnis geben, was man (, wie Lachtaube gezeigt hat,) beim ersten Start der DB auf Existenz prüfen und ggfls. anlegen kann.
Wo ist da noch ein Problem?
@Klaus:
ZitatVorsicht bitte, das wird schnell diskriminierend.
Gut, dass Du mich auch darauf aufmerksam machst.. 8) ;D ;D
Hallo Klaus
Zitat
Vorsicht bitte, das wird schnell diskriminierend. :D ;D 8)
dabei geht es hauptsächlich um meinen Vater und Onkel ;)
@DF6GL
ZitatWo ist da noch ein Problem?
Wie sieht der code aus um den Pfad aus der Systemsteuerung einzubinden? ???
DoCmd.OutputTo acOutputReport, "Organisation Beerdigung-Trauerfeier", acFormatPDF, "D:\Users\User\Documents\Bemopro\" & SterbefallName & ", " & Me.SterbefallVorname & " - Datenblatt-Trauerfeier.pdf"
Hi,
was denn für eine "Systemsteuerung" ?
ZitatJeder User (Computer) hat eine eigenes Frontend. In diesem Fall in Form eines Formulares Systemsteuerung (basierend auf der Tabelle 'tblSystemsteuerung')
Hallo,
DoCmd.OutputTo acOutputReport, "Organisation Beerdigung-Trauerfeier", acFormatPDF, Me.FeldNameMitPfad & SterbefallName & "_" & Me.SterbefallVorname & "_Datenblatt_Trauerfeier.pdf"
Me.FeldNameMitPfad ist das Formularfeld das den Pfad aus der Tabelle "tblSystemsteuerung" anzeigt.
Ich würde Dir dringend raten auf Leer und Sonderzeichen in Dateinamen zu verzichten. Kein - und erst recht kein Komma und auch kein Leerzeichen. Allenfalls der Unterstrich (_). Ich habe das mal angepasst.
Fehlermeldung:
Methode oder Datenobjekt nicht gefunden.
Ich gehe davon aus, dass noch kein Bezug zur Tabelle tblSystemsteuerung erstellt wurde.
Hallo,
zeigt das Formularfeld den Pfad an ?
Weiter oben hast Du geschrieben:
ZitatIn diesem Fall in Form eines Formulares Systemsteuerung (basierend auf der Tabelle 'tblSystemsteuerung').
Dann ist doch der Bezug zur Tabelle da und das Formularfeld kann den Pfad anzeigen.
Und bitte, bitte immer auch den Code zeigen, damit man sieht, ob sich ggf. andere Fehler eingeschlichen haben. Lasse mal im Direktbereich den zusammengesetzten Namen anzeigen.
Debug.Print Me.FeldNameMitPfad & SterbefallName & "_" & Me.SterbefallVorname & "_Datenblatt_Trauerfeier.pdf"
Stop
DoCmd.OutputTo acOutputReport, "Organisation Beerdigung-Trauerfeier", acFormatPDF, Me.FeldNameMitPfad & SterbefallName & "_" & Me.SterbefallVorname & "_Datenblatt_Trauerfeier.pdf"
Hallo Klaus,
hier der Code
DoCmd.OpenReport "Organisation Beerdigung-Trauerfeier", acViewPreview, , "Rechnungsnummer =" & Me!Rechnungsnummer, acHidden
DoCmd.OutputTo acOutputReport, "Organisation Beerdigung-Trauerfeier", acFormatPDF, Me.pdfPfad & SterbefallName & "_" & Me.SterbefallVorname & "-Datenblatt-Trauerfeier.pdf"
DoCmd.Close acReport, "Organisation Beerdigung-Trauerfeier"
Wie kommt der Bezug zum Formular oder der Tabelle Systemsteuerung zustande?
Der Befehl zum Erstellen einer pdf-Datei erfolgt aus dem Formular RegisterDaten (Tabelle tblRegisterDaten). Das Formular Systemsteuerung (Tabelle tblSystemsteuerung)ist nicht geöffnet.
Hallo,
wenn das Formular nicht geöffnet ist, geht das natürlich nicht.
Du kannst den Pfad per DLookup direkt aus der Tabelle holen.
Dim DateiPfad As String
DateiPfad=DLookup("Pfad","tblSystemsteuerung")
Für OutputTo musst Du dann die Variable DateiPfad verwenden.
Danke für deine Geduld :)
Klappt super.