ich grueble gerade ueber einem Problem mit Acc2003, Acrobat 5.0 und
der dazugehoerigen Anforderung.
In Access sollen mehrere Berichte hintereinander in verschiedene
PDF-Dateien ausgegeben werden. Dies funktioniert auch ueber die
Umstellung des Standarddruckers auf den Acrobat Distiller -und nach
dem Druck anschliessende Rueckstellung des Standarddruckers.
Was nicht schoen ist, dass das erzeugte PDF erst geladen und dann erst
ueber eine Dialogbox gespeichert werden muss. Der zweite Punkt,
welcher in diesem Zusammenhang unangenehm auffaellt ist der, dass der
Datei-Pfad immer der Adobe-Acrobat-Standardpfad ist und somit jedesmal
geaendert werden muss.
Kennt in diesem Zusammenhang jemand eine brauchbaren Loesung fuer
PDF-Erzeugen im Hintergrund ? Ueber Google oder die Access-Faq habe
ich nichts gefunden.
Fuer Tips dankbar
Hans
Hans Glasbrenner <news...@despammed.com> schrieb:
> In Access sollen mehrere Berichte hintereinander in verschiedene
> PDF-Dateien ausgegeben werden. Dies funktioniert auch ueber die
> Umstellung des Standarddruckers auf den Acrobat Distiller -und nach
> dem Druck anschliessende Rueckstellung des Standarddruckers.
Das ist der Standardweg....
> Was nicht schoen ist, dass das erzeugte PDF erst geladen und dann erst
> ueber eine Dialogbox gespeichert werden muss. Der zweite Punkt,
> welcher in diesem Zusammenhang unangenehm auffaellt ist der, dass der
> Datei-Pfad immer der Adobe-Acrobat-Standardpfad ist und somit jedesmal
> geaendert werden muss.
Über die Optionen im Distiller kannst Du steuern, dass
1. Der Dialog für den Dateinamen nicht erscheint
2. Das Ergebnis hinterher nicht im Adobe Reader angezeigt wird.
Zum Thema Dateipfad schau Dir mal den folgenden Code an:
- - - - - - - - - - - - - - - - - -
Option Compare Database
Option Explicit
Private Sub cmdDatenverteilung_Click()
'Fehlerbehandlung definieren
On Error GoTo Err_cmdDatenverteilung_Click
'Variablen deklarieren
Dim strDatei_AdobePDF As String
Dim strTitel As String
Dim strHinweis As String
Dim strDruckerBisher As String
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strBerichtName As String
Dim strPDFName As String
Dim strDateiName As String
'Pfade ermitteln
strPfadZiel = "C:\DeinPfad\DeinPfad\"
'Pfad zum UserDesktop ermitteln
strDatei_AdobePDF = Environ("USERPROFILE") & "\Desktop\"
'Prüfen, ob Distiller vorhanden ist
If Not fIstDruckerVorhanden("Acrobat Distiller") Then
strTitel = "Aktion nicht möglich"
strHinweis = "Sie können die Berichte nicht PDF'en, da bei" & vbCrLf
& _
"Ihnen der Drucker 'Acrobat Distiller' nicht in-" &
vbCrLf & _
"stalliert ist." & vbCrLf & vbCrLf & _
"Bitten Sie jemanden mit 'Distiller' diesen Job zu" &
vbCrLf & _
"übernehmen."
MsgBox strHinweis, vbCritical, strTitel
Exit Sub
End If
'Bisherigen Drucker ermitteln
strDruckerBisher = strStandarddruckerLesen
'Acrobat Distiller als Standarddrucker einstellen
StandardDruckerWechseln ("Acrobat Distiller")
'Variablen initialisieren
Set db = CurrentDb
'PDF's erstellen
Set rst = db.OpenRecordset("qry_ZuErstellendeBerichte", dbOpenSnapshot)
While Not rst.EOF
Application.Echo False
strBerichtName = rst!dtaBericht
Application.Echo True
strPDFName = strPDFNameLesen(strBerichtName)
strDateiName = Nz(rst!DateiName, "")
Application.Echo False
DoCmd.OpenReport strBerichtName, acViewNormal
Application.Echo True
Call AusgabeUmbenennen(strPDFName, strDateiName, strDatei_AdobePDF)
FileCopy strDatei_AdobePDF & strDateiName, strPfadZiel &
strDateiName
Kill strDatei_AdobePDF & strDateiName
rst.MoveNext
Wend
rst.Close
'Standarddrucker zurücksetzen
StandardDruckerWechseln (strDruckerBisher)
'Abschlusshinweis
strTitel = "Aktion erfolgreich beendet"
strHinweis = "Die Aktion wurde erfolgreich beendet."
MsgBox strHinweis, vbInformation, strTitel
'Ende
Exit_cmdDatenverteilung_Click:
On Error Resume Next
Application.Echo True
DoCmd.SetWarnings True
rst.Close
db.Close
Set db = Nothing
Exit Sub
'Fehlerbehandlung
Err_cmdDatenverteilung_Click:
Select Case Err.Number
Case 0
Resume Next
Case Else
TM_Fehler Me.Name, "cmdDatenverteilung_Click"
'Standarddrucker zurücksetzen
StandardDruckerWechseln (strDruckerBisher)
Resume Exit_cmdDatenverteilung_Click
End Select
End Sub
Private Function strPDFNameLesen(strDokumentName As String)
'Fehlerbehandlung definieren
On Error GoTo Err_strPDFNameLesen
'Variablendeklaration
Dim rpt As Report
If intExistObjekt(acReport, strDokumentName) Then
DoCmd.SetWarnings False
DoCmd.OpenReport strDokumentName, acViewDesign
Set rpt = Reports(strDokumentName)
rpt.Visible = False
If IsNull(rpt.Name) Then
strPDFNameLesen = strDokumentName
Else
strPDFNameLesen = rpt.Caption
End If
End If
'Ende
Exit_strPDFNameLesen:
On Error Resume Next
DoCmd.Close acReport, strDokumentName
DoCmd.SetWarnings True
Exit Function
'Fehlerbehandlung
Err_strPDFNameLesen:
Select Case Err.Number
Case 0
Resume Next
Case Else
TM_Fehler Me.Name, "strPDFNameLesen"
Resume Exit_strPDFNameLesen
End Select
End Function
Private Sub AusgabeUmbenennen(strBericht As String, strPDF As String,
strDatei_AdobePDF As String)
'Benennt den Bericht um und kopiert ihn
On Error GoTo Err_AusgabeUmbenennen
'Variablendeklaration
Dim strOutput As String
'Variablen initialisieren
strOutput = strDatei_AdobePDF & strBericht & ".pdf"
'Erstellte PDF-Datei umbenennen und kopieren
On Error Resume Next
Do
Open strOutput For Input Access Read Lock Read Write As #1
If Err.Number <> 0 Then
Close #1
Err.Clear
Else
Close #1
Name strOutput As strDatei_AdobePDF & strPDF
Sleep (1000)
Exit Do
End If
Loop
'Ende
Exit_AusgabeUmbenennen:
On Error Resume Next
Exit Sub
'Fehlerbehandlung
Err_AusgabeUmbenennen:
Select Case Err.Number
Case 0
Resume Next
Case Else
TM_Fehler Me.Name, "AusgabeUmbenennen"
Resume Exit_AusgabeUmbenennen
End Select
End Sub
Private Sub Sleep(Millisec As Integer)
'Fehlerbehandlung definieren
On Error GoTo Err_Sleep
'Variablen deklarieren
Dim i As Integer
For i = 1 To Millisec
' Nichts tun, nur warten
Next i
'Ende
Exit_Sleep:
On Error Resume Next
Exit Sub
'Fehlerbehandlung
Err_Sleep:
Select Case Err.Number
Case 0
Resume Next
Case Else
TM_Fehler Me.Name, "Sleep"
Resume Exit_Sleep
End Select
End Sub
- - - - - - - - - - - - -
Den Code habe ich gerade aus einer Anwendung kopiert und auf die
wesentlichen Funktionen gekürzt.
Der Trick besteht darin, den Bericht einfach als PDF zu drucken. Der
Distiller nimmt dazu die Caption des Berichts als Dateinamen. Wenn diese
Datei sich exklusiv öffnen lässt, dann ist der Distiller fertig und Du
kannst die Datei umbenennen und an den gewünschten Ort kopieren.
Ich habe diesen Code seit mehr als drei Jahren im Einsatz.
HTH
--
Thomas
Homepage: www.Team-Moeller.de
TM-AbhängigeObjekte: Update auf Version 3.76 (seit 02.07.05)
Ermittelte Abhängigkeiten können jetzt als Datei exportiert werden.
> Private Sub Sleep(Millisec As Integer)
> 'Fehlerbehandlung definieren
> On Error GoTo Err_Sleep
>
>
> 'Variablen deklarieren
> Dim i As Integer
>
>
> For i = 1 To Millisec
> ' Nichts tun, nur warten
> Next i
>
>
> 'Ende
[...]
Anstelle von "Nichts tun" würde ich wenigsten ein DoEvents
einfügen, damit die Anwendung während Sleep nicht einfriert.
Ich würde aber für die Sleep-Funktionalität lieber den
üblichen API-Aufruf verwenden.
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)
Dann hast du zumindest näherungsweise eine Wartedauer, die
der übergebenen Anzahl an Millisekunden entspricht. In deiner
Prozedur ist das völlig willkürlich, abhängig von der
Prozessorleistung.
Gruß
Phil
danke fuer die hilfreichen Tips.
Der VBA-Code ist plausibel und teilweise mit meinem uebereinstimmend
(Druckerumstellung ...).
An einer Stelle komme ich gerade nicht weiter. Die Frage waere
vermutlich im Adobe-Forum besser aufgehoben, doch die Experten mit
einschlaegiger Erfahrung wissen dies bestimmt auch.
Wo sind im Distiller die entsprechenden Einstellungen fuer den
Zielpfad und fuer das Abschalten des Dialogs? Ich habe sowohl in der
GUI, als auch in den Druckereigenschaften gesucht. Da findet sich
alles moegliche, ausser das was gerade gesucht wird.
Viele Gruesse aus dem "wilden Sueden"
Hans
> ich grueble gerade ueber einem Problem mit Acc2003, Acrobat 5.0
> und der dazugehoerigen Anforderung.
>
> In Access sollen mehrere Berichte hintereinander in verschiedene
> PDF-Dateien ausgegeben werden.
<schnipp>
Schau mal in die Access FAQ www.donkarl.com
5.17 Bericht als PDF drucken
Ich nutze für sowas die äußerst komfortable PDF and Mail Class
Library for Access, das Geld ist es allemal wert.
HTH,
Carsten
Hans Glasbrenner <news...@despammed.com> schrieb:
> Wo sind im Distiller die entsprechenden Einstellungen fuer den
> Zielpfad und fuer das Abschalten des Dialogs? Ich habe sowohl in der
> GUI, als auch in den Druckereigenschaften gesucht. Da findet sich
> alles moegliche, ausser das was gerade gesucht wird.
IMHO findet sich in den Eigenschaften des Druckers eine Registerseite, auf
denen diese Einstellungen dauerhaft gesichert werden können.
(Ich habe leider auf diesem Rechner keinen Distiller - sonst würde ich
konkreter Antworten.)
CU
Philipp Stiefel <ph...@codekabinett.de> schrieb:
> Ich würde aber für die Sleep-Funktionalität lieber den
> üblichen API-Aufruf verwenden.
> Dann hast du zumindest näherungsweise eine Wartedauer, die
> der übergebenen Anzahl an Millisekunden entspricht. In deiner
> Prozedur ist das völlig willkürlich, abhängig von der
> Prozessorleistung.
Danke für den Hinweis. Der Code ist mittlerweile über drei Jahre alt. Damals
war ich wohl noch nicht so weit... ;-)
THX