Newsgroup: it.comp.appl.access
Titolo: Output to PDF


    'Newsgroups:  it.comp.appl.Access
 
DoCmd.OpenReport ReportName, acViewPreview, , , acHidden
PdfName = ReportName
PdfPath = "c:\Sviluppo\temp\" & PdfName & ".pdf" 
DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, PdfPath
DoCmd.Close acReport, ReportName
 
' found on 
https://answers.microsoft.com/en-us/msoffice/forum/all/variable-
 
not-defined-on-outputto-acformatpdf/7d6f9cdd-6ca5-4716-b688-bdd6f3cea831
 
StartDoc (PdfPath)
 
End Sub
 
§
 
premesso quanto sopra, la cosa funziona egregiamente quando viene eseguita 
sul pc degli utenti, che hanno un software PDF installato normalmente
 
qualcuno però esegue il programma collegandosi in RDP al server dove il 
lettore dei file PDF è in versione Portabile
Nonostante nelle associazioni l'estensione PDF sia correttamente collegata 
all'eseguibile, quando ci provano ottengono l'errore:
 
Execution of this application has stopped due to a run-time error.
The application can't continue and will be shut down.
 
(arffha pbqvpr qv reeber, arffhan vfgehmvbar, avragr qv avragr, pur vy 
fvtaber noovn va tybevn dhrfgv qrsvpvragv r pur cbffnab nirer yn qvneern 
frzcvgrean)
 
 
Il problema è che sul server c'è solo il runtime, per cui non posso 
eseguire passo-apsso e vedere se ci sia qualche codice di errore.
 
Cosa posso inventarmi per capire qualcosa di più? (a parte installare il 
lettore PDF invece che usarlo portabile, sperando che funzioni...)
 
Grazie e buona Pasqua, chissà se nell'uovo trovo la lieta sorpresa ;)
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........


Non si capisce se e' la creazione pdf che non va (DoCmd.OutputTo 
acOutputReport, ReportName, acFormatPDF, PdfPath) oppure la 
visualizzazione del pdf appena creato, che immagino sia realizzata 
dentro la  StartDoc(pdfPath) (per il momento oscura)
Consiglierei per il momento di capire dove avvenga il problema, e 
metterci una routine per vedere numero erore e riga dove avviene, e poi 
si agira' di conseguenza

 StartDoc(pdfPath) (per il momento oscura)
 
mi ero dimenticato...
 
Function StartDoc(DocName As String) As Long
      Dim Scr_hDC As Long
      Scr_hDC = GetDesktopWindow
      StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _
      "", "C:\", SW_SHOWNORMAL)
 End Function


 
 
scusate il codice quasi illeggibile :(
 
Option Compare Database
 
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias 
"ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd 
As Long) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "USER32" () As 
LongPtr
#Else
Private Declare Function GetDesktopWindow Lib "USER32" () As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias 
"ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd 
As Long) As Long
#End If


 
 
ho provato: tolto il portabile, installato il pdf reader, controllata 
l'associazione dell'estensione, niente da fare



Va tutto bene ma...
...numero errore + riga dove avviene, mi sembrano essenziali
Ce l'abbiamo questa informazione oppure no?
Se non ce l'abbiamo, bisogna cercarla e trovarla
E quindi mettere codice gestione errori sia su funzione che crea pdf sia 
su funzione che visualizza pdf
Finche' non si sa' dove avviene l'errore qualsiasi azione e' presa senza 
seguire una logica
 

 
 
 
ho inserito questo codice, già usato in altre parti del programma, sia 
nella routine che genera il PDF (OutputPDF) che in quella che lo visualizza 
(StartDoc)
 
 
ExitErrore:
    Exit Sub
 
Errore:
    ' MsgBox Err.Description
    ' GB 07.09.2017 - more details, maybe helps
    MsgBox "The following error has occured" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: Modulo Importing dbf / IMPORTTables" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occured!"
    MessaggioFine ("ImpLog.Txt")
    Resume ExitErrore
 
 
 
 
in entrambi i casi l'errore non viene intercettato oppure viene gestito 
malamente
 
in pratica non esce la finestra con i dettagli :(



Prova a togliere temporaneamente dal codice lo StartDoc
Se l'errore avviene ancora allora e' probabile avvenga nella creazione 
del pdf, viceversa se non avviene nessun errore allora vuol dire che il 
colpevole e' dentro lo StartDoc
 

 e' dentro lo StartDoc
 
giusto, non ci avevo pensato
 
test fatto: il pdf viene creato correttamente quindi l'errore è, come 
avevo presupposto, nell'apertura del PDF
 
cerco una alternativa, peccato perché questo StartDoc sta funzionando 
egregiamente quando non è usato sul server


 
 
ho sostituito l'istruzione con:
 
Application.FollowHyperlink (PdfPath), NewWindow:=True
 
funziona ma, come già visto, si ferma a chiedere il permesso con un avviso 
che potrebbero esserci pericolo e quant'altro :( proprio il motivo che mi 
aveva spinto a cambiare con StartDoc
 
la cosa strana è che in un'altra applicazione StartDoc funziona 
benissimo... ma ho confrontato i codici, non ci sono differenze evidenti
 
boh, lascio passare la Pasqua e poi ci torno su


 
 
eh... non ho resistito a fare un'altra prova :)
 
ho sostituito un pezzo di codice con una versione credo leggermente 
diversa:
 
vecchio:
 
Option Compare Database
 
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias 
"ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd 
As Long) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "USER32" () As 
LongPtr
#Else
Private Declare Function GetDesktopWindow Lib "USER32" () As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias 
"ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd 
As Long) As Long
#End If
 
Nuovo:
 
#If VBA7 And Win64 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" _
  Alias "ShellExecuteA" (ByVal hWnd As Long, _
  ByVal lpOperation As String, ByVal lpFile As String, _
  ByVal lpParameters As String, ByVal lpDirectory As String, _
  ByVal nShowCmd As Long) As Long
#Else
Private Declare Function ShellExecute Lib "shell32.dll" _
  Alias "ShellExecuteA" (ByVal hWnd As Long, _
  ByVal lpOperation As String, ByVal lpFile As String, _
  ByVal lpParameters As String, ByVal lpDirectory As String, _
  ByVal nShowCmd As Long) As Long
#End If
 
adesso è ok :)


 
 
 
se ho ben capito devi aprire un pdf
 
perchè non usi questo codice
 
 
Dim x As Variant
Dim Applicazione As String
Dim File As String
 
 
Applicazione = "C:\Program Files (x86)\Adobe\Acrobat Reader 
DC\Reader\AcroRd32.exe"
File = "c:\tuo.pdf"
x = Shell(Applicazione + " " + File, vbNormalFocus)
 
 
 
e imposti tra i parametri dell'appliativo il percorso "Applicazione" che 
vuoi usare per i pdf
 
BFS
 
 
-- 
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
 
 


Bene, se ora va allora e' risolto
Io uso questo codice per aprire un file col programma predefinito
Che sia pdf, un txt, un xls, un eml, un xml, si avvia sempre col 
programma che Windows ha associato a quell'estensione
Lo posto perche' a me e' tornato molto comodo, e sicuramente lo sara' 
anche per qualche altro utente Access
 
Shell("RUNDLL32.EXE URL.DLL,FileProtocolHandler " & NOME_FILE, 
vbMaximizedFocus)