Salvare Report su PDF

di il
10 risposte

Salvare Report su PDF

Ciao,
quando provo a salvare un report su un pdf, mi da l'errore runtime 2059 Impossibile trovare l'oggetto, non riesco a capire cosa sbaglio
Private Sub testpdf_Click()
Form_NewContract.Refresh
Dim stDocName As String, filtro As String, pth As String
pth = Application.CurrentProject.Path & "\" & Me.Cod & ".pdf"
MsgBox (pth)
Select Case Me.listLanguage.Value
Case Is = "ITA"
stDocName = "test": filtro = "Cod=" & Me.casellaRicerca
DoCmd.OutputTo acOutputReport, filtro, acFormatPDF, pth, False
End Select
End Sub

10 Risposte

  • Re: Salvare Report su PDF

    Se non apri l'oggetto da ESPORTARE è impossibile possa esportare qualche cosa...
    La guida in linea recita:
    
    You can use the OutputTo method to output the data in the specified Access database object
    (a datasheet, form, report, module, data access page) to several output formats.
    Quindi preventivamente all'invocazione del comando OutputTo, devi aprire l'Oggetto su cui andrà ad insistere il comando.

    Aggiungo che ti sei INVENTATO completamente i parametri da passare...
    
    expression.OutputTo (ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart, TemplateFile, Encoding, OutputQuality)
    Dove ha visto che [OutputTo] supporta il Filtro...?
    La GUIDA VA LETTA...!!!!!
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.outputto
    
    DoCmd.OpenReport reportName, acViewPreview, , criteria, acHidden
    DoCmd.OutputTo acOutputReport, reportName, acFormatPDF, fileName
    DoCmd.Close acReport, reportName, acSaveNo
  • Re: Salvare Report su PDF

    Grazie adattando il tuo codice alle mie variabili funziona.

    L'unica cosa che ho notato é che se ho un PDF con lo stesso nome già aperto (o forse stesso file nello stesso percorso?!) il codice crasha. C'é un modo per impedire che accada? Magari una semplice msgbox che avverta di chiudere il file aperto.
  • Re: Salvare Report su PDF

    Ovviamente ... ed ovviamente si, basta verificare, prima di generare il File.pdf che non esista un omonimo... ed eventualmente cancellarlo.
  • Re: Salvare Report su PDF

    Ok, non ci avevo pensato prima perché ho notato che quando il PDF esistente non é aperto, il codice lo sovrascrive. Quindi se il file PDF esistente é aperto, é possibile eliminarlo da codice vba senza prima chiuderlo?
  • Re: Salvare Report su PDF

    No va chiuso... si può fare tutto ma serve avere una strategia.. e riflettere sul metodo.
    Tu che metodo hai pensato di applicare...?
  • Re: Salvare Report su PDF

    Be allo stato attuale delle mie conoscenze potrei soltanto fare un if file esiste then msgbox vuoi sovrascrivere. Però non saprei come gestire il file aperto se non chiedendo tramite msgbox di verificare che sia chiuso...
  • Re: Salvare Report su PDF

    Puoi intercettare l'errore e modificare il Nome.pdf con un nome diverso... co.e fa windows (1..2..n) oppure sempre intercettando l'errore forzare la chiusura via API o WMI...
    Entrame le strade richiedono un minimo di conoscenze... magari guardaci cercando informazioni e prova qualche cosa...
  • Re: Salvare Report su PDF

    Alla fine ho deciso di fare un IF file esistente allora mi da una msgbox che mi chiede di cancellare il file prima di proseguire e poi un comando che mi apre la cartella dove sono situati i file
    VBA.Shell "EXPLORER " & pth, vbMaximizedFocus
    Mi sono accorto pero' che una volta eseguito il mio codice, fmettiamo caso che il mio path sia il desktop, se io cancello qualcosa dal desktop devo aggiornare manualmente con F5 altrimenti il file o la cartella che cancello rimane visibile sul desktop. Cosi come il file temporaneo di access rimane visibile sul desktop finché non aggiorno il desktop stesso con F5

    E' per caso dovuto ad un utilizzo errato de l mio comando vba.shell ?
  • Re: Salvare Report su PDF

    Hai un approccio che non è molto tecnico su cui io non riesco a darti un supporto.
    Ti dico però come farei io.

    1) Gestione errori nella Sub/Function di salvataggio Report
    2) Prima di Generare eseguo un KILL preventivo, se va in ERRORE per assenza del File(intercetto il N° Errore specifico che dovrebbe essere il 53)
    3) Se va in errore perchè il File è APERTO, ErrNum=70 (Autorizzazione negata) allora puoi decidere se forzarne la chiusura...

    Per la chiusura sapendo che è un PDF e basta come possibilità semplificata, hai varie opzioni la più semplice è quella che ti mostro sotto, ovvero usare WMI per identificare tra gli EXE quello di AcroRd32.exe e, identificare esattamente il processo che agisce sul File Aperto, e Terminarlo...
    A quel punto puoi generare il REPORT in PDF.

    Per semplicità ti allego un codice semplificato di Esempio:
    
    Function GeneraReportPDF()
        Dim sReportPDF      As String
        Dim sPath            As String
        On Error GoTo Err_Handler
        sPath = "C:\"           
        sReportPDF = sPath & "NomeFile.pdf"
    TryKill:
    
        Kill sReportPDF
        
        ' QUI' GENERI IL TUO PDF
        DoCmd.OpenReport reportName, acViewPreview, , criteria, acHidden
        DoCmd.OutputTo acOutputReport, reportName, acFormatPDF, fileName
        DoCmd.Close acReport, reportName, acSaveNo    
        
        Exit Function
    Err_Handler:
        Select Case Err.Number
            Case 53
                 Resume Next
            Case 70
                If TerminatePDF(sReportPDF) Then
                    Resume TryKill
                Else
                    Err.Raise 10001, "Termination", "Il tentativo di Chiusura è fallito... ora obbliga l'utente a chiuderlo e riprovare..!"
                End If
            Case Else
                MsgBox Err.Description, vbCritical, "ERR Num = " & Err.Number
        End Select
        
    End Function
    
    Function TerminatePDF(strFileToClose As String) As Boolean
        On Error Resume Next
        Dim objWMIService
        Dim colProcessList
        Dim objProcess
        Dim strComputer As String
        strComputer = "."
        Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
        Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'AcroRd32.exe'")
        For Each objProcess In colProcessList
            If InStr(objProcess.CommandLine, strFileToClose) > 0 Then
                objProcess.Terminate
                TerminatePDF= True
            End If
        Next
    End Function
  • Re: Salvare Report su PDF

    Ciao Alex,
    grazie per il codice, proverò non appena ho tempo, per adesso mi limito ad avvisare l'utente che il file è esistente e quindi di eliminarlo prima di creare il nuovo pdf, in questo modo sarà compito suo occuparsi eventualmente di chiudere prima il pdf e dopo di eliminarlo.
Devi accedere o registrarti per scrivere nel forum
10 risposte