CREAZIONE REPORT E FILE PDF MULTIPLI

di il
22 risposte

CREAZIONE REPORT E FILE PDF MULTIPLI

Buonasera e grazie per chi vorrà darmi una mano,
dovrebbe essere una cosa semplice, sono io che sono un neofita testardone:
Il seguente codice, dovrebbe attingere da una tabella (chiamata Database certificati), creare per ciascuna riga di record (richiamando il primo ID ed arrivando fino all'ultimo), riportare in un report i dati contenuti in ogni riga di record e salvare (creandolo) il report in formato pdf nel percorso sul mio pc chiamando il file creato "Mandato" dandogli come nome del file il valore univoco del campo "ID" e quello del campo cognome.
Il codice, eseguito da button su una maschera, mi crea solo un file con il primo dei record.
Come fare a farli creare tutti ?
Ecco il codice:


Private Sub Creazione_Click()
Dim retval As Integer
'Dim db As Database
Dim rst1 As Recordset
Set db = CurrentDb
Set rst1 = db.OpenRecordset("DATABASE CERTIFICATI", dbOpenDynaset) 'Nome della Query 'da sotto
Dim DocName As String
Dim stLinkCriteria As String
stLinkCriteria = "[ID]=" & Me![id]
DocName = "Mandato"
rst1.MoveFirst
Do While True
DoCmd.OutputTo acOutputReport, "Mandato", acFormatPDF, "C:\Users\Famiglia\Desktop\Mandati\" & [id] & "-" & [COGNOME] & ".PDF", False
On Error Resume Next
rst1.MoveNext
If rst1.EOF Then GoTo Fine:
Loop
Close
Fine:
Close
MsgBox (Err.Description)
Exit Sub
DoCmd.Close
End If
End Sub

22 Risposte

  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Quando posti Codice DEVI usare i TAG per il codice, che attivi dai comandi sopra l'Editor [</>]

    In realtà quel codice crea TANTI REPORT tutti uguali che sovrascrive N volte quanti sono i Records.
    Al fine di filtrare il Report devi aprirlo in modalità Nascosta passando i Parametri nella WHERE CONDITION che filtrano il Report per campo ID pescandoli dai campi del Recordset.
    Stamnpato devi richiuderlo e mettere un DOEVENTS nel Loop altrimenti se ne stampi molti rischi si impalli tutto.
    Ovviamente anche il NomeReport deve pescare dall'ID del Recordset e non quello che hai scritto tu che è il riferimenti ID di Maschera.
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Io ho capito che il report si chiama "Mandato". Poi, se interpreto correttamente il pensiero di @Alex, scriverei così:
    Private Sub Creazione_Click()
     Dim db As DAO.Database
     Dim rst1 As DAO.Recordset
     Dim strPath As String
     Set db = CurrentDb
     Set rst1 = db.OpenRecordset("DATABASE CERTIFICATI", dbOpenDynaset)
     rst1.MoveFirst
     Do Until rst1.EOF
     strPath = "C:\Users\Famiglia\Desktop\Mandati\" & rst1![ID] & "-" & rst1![COGNOME] & ".PDF"
     DoCmd.OpenReport "Mandato", acViewPreview, , "[ID] = " & rst1![ID], acHidden
     DoCmd.OutputTo acOutputReport, "Mandato", acFormatPDF, strPath, False
     rst1.MoveNext
     Loop
     rst1.Close
     db.Close
     End Sub
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Provo immediatamente, vi faccio sapere, e scusate per le parentesi non utilizzate.
    Siete fantastici!
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Allora...
    fatto il test.
    Sembra funzionare, ovvero, i file pdf vengono tutti creati e ciascuno riporta - come nome file - l'id ed il cognome che il codice pesca da ciascun record, tuttavia tutti i pdf riportano al loro interno solo i dati del primo record. Come è possibile ???
    Tks
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    fdimattei ha scritto:


    ...
    Sembra funzionare... tuttavia
    Penso che in questo recentissimo thread si possano trovare tutte le risposte alle tue necessità
    Come esportare PDF di una pagina filtrata
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Ho letto l'intero trhead, proverò ad applicare quel codice alle mie esigenze.
    Intanto ringrazio sul serio
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Philcattivocarattere ha scritto:


    fdimattei ha scritto:


    ...
    Sembra funzionare... tuttavia
    Penso che in questo recentissimo thread si possano trovare tutte le risposte alle tue necessità
    Come esportare PDF di una pagina filtrata
    Ho applicato il codice di cui al thread qui sopra, MEDESIMO PROBLEMA.
    Il codice crea i file, assegnando a ciascun record il nome corrispondente al record, ma i valori dei campi che sono all'interno dei file pdf creati sono riferiti solo e sempre al primo record.
    Posto il codice mutuato per le miei esigenze:
    
    Dim rs                    As DAO.Recordset
        Dim rpt                   As Access.Report
        Dim sFolder               As String
        Dim sFile                 As String
        Const sReportName = "Mandato"
    
        sFolder = "C:\Users\Famiglia\Desktop\Mandati\"
    
        Set rs = Me.RecordsetClone
        With rs
            If .RecordCount <> 0 Then
                'Open the Report
                DoCmd.OpenReport sReportName, acViewPreview, , , acHidden
                'Define a report object so we can manipulate it below
                Set rpt = Reports(sReportName).Report
                
                .MoveFirst
                Do While Not .EOF
                    'Build the PDF filename we are going to use to save the PDF with
                    sFile = Nz(![id], "") & " " & Nz(![COGNOME], "") & ".pdf"
                    sFile = sFolder & sFile
                    DoEvents
                    DoCmd.OutputTo acOutputReport, sReportName, acFormatPDF, sFile, , , , acExportQualityPrint
                    .MoveNext
                Loop
                DoCmd.Close acReport, sReportName
            End If
        End With
    
    
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    fdimattei ha scritto:


    Philcattivocarattere ha scritto:


    Come esportare PDF di una pagina filtrata
    Ho applicato il codice di cui al thread qui sopra, MEDESIMO PROBLEMA.
    e nel thread c'è anche scritto come risolverlo (o almeno in quel caso ha funzionato e non vedo perché non debba funzionare anche questa volta).
    Prima di usare Sleep prova a spostare DoEvents dopo DoCmd.OutputTo. Se non funziona allora fai come indicato nel thread richiamato.
    (hai capito perché si è passati all'uso del RecordsetClone, vero?)
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Provo immediatamente, prima invertendo le due righe di codice, poi nel caso passo allo sleep.
    Recordsetclone....?? Mhhhh no, non proprio. Se ho capito bene il codice anziché attingere i record dalla tabella li prende dai valori caricati in memoria nel set di dati creato all'atto dell'apertura del form. E quindi?
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    fdimattei ha scritto:


    Provo immediatamente, prima invertendo le due righe di codice, poi nel caso passo allo sleep.
    Recordsetclone....?? Mhhhh no, non proprio. Se ho capito bene il codice anziché attingere i record dalla tabella li prende dai valori caricati in memoria nel set di dati creato all'atto dell'apertura del form. E quindi?

    nulla, nulla di nulla. Sempre il solito problema, il codice crea file distinti (uno per ogni record, assegnando il nome e l'id corretto preso dalla tabella in questione) ma il contenuto dei campi è sempre relativo al primo dei record
    Ho invertito, come suggerito, il "do.cmd" con il "doevents" e nulla. Inserito "lo sleep" con la relativa dichiarazione iniziale (ho un 64bit), ma nulla.
    Ecco il codice, potete aiutarmi? se è un disturbo eccessivo, posso - se nessun si offende - pagare le spese per il tempo e l'ingegno posto.
    
    Option Compare Database
    Option Explicit
    
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
    
    Private Sub Creazione_Click()
    Dim rs                    As DAO.Recordset
        Dim rpt                   As Access.Report
        Dim sFolder               As String
        Dim sFile                 As String
        Const sReportName = "Mandato"
    
        sFolder = "C:\Users\Famiglia\Desktop\Mandati\"
    
        Set rs = Me.RecordsetClone
        With rs
            If .RecordCount <> 0 Then
                'Open the Report
                DoCmd.OpenReport sReportName, acViewPreview, , , acHidden
                'Define a report object so we can manipulate it below
                Set rpt = Reports(sReportName).Report
                
                .MoveFirst
                Do While Not .EOF
                    'Build the PDF filename we are going to use to save the PDF with
                    sFile = Nz(![id], "") & " " & Nz(![COGNOME], "") & ".pdf"
                    sFile = sFolder & sFile
                    DoCmd.OutputTo acOutputReport, sReportName, acFormatPDF, sFile, , , , acExportQualityPrint
                    Call Sleep(1000)
                    DoEvents
                   .MoveNext
                Loop
                DoCmd.Close acReport, sReportName
            End If
        End With
    
     End Sub
    
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Stai impiegando l'istruzione DoCmd.OpenReport senza indicare i criteri che deve soddisfare il report.
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.openreport
    Quindi visto che cicli il recordset devi fornire la chiave di ogni singolo record, per avere i dati dello specifico PDF.
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    willy55 ha scritto:


    Stai impiegando l'istruzione DoCmd.OpenReport senza indicare i criteri che deve soddisfare il report.
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.openreport
    Quindi visto che cicli il recordset devi fornire la chiave di ogni singolo record, per avere i dati dello specifico PDF.
    Ti giuro ti credo, ma tradotto?
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Il concetto è, come detto, il criterio con cui vai a porre i dati nei vari file PDF, quindi visto che cicli il recordset e vuoi produrre un file PDF per ciascun record (con nome del file e valori di ciascuna occorrenza) devi:
    - porre l'istruzione DoCmd.OpenReport all'interno del loop;
    - indicare il criterio di selezione (WhereCondition) quale quarto parametro della suddetta istruzione, come ad esempio "[ID] = " & rst1![ID].
    Ti indico anche delle discussioni che trattano medesimo argomento ed hanno esempi esplicativi:
    https://stackoverflow.com/questions/31530537/access-print-individual-page-to-pdf-individually-named-file
    https://social.msdn.microsoft.com/Forums/en-US/53f85f8b-6800-4c5a-a8c8-c974ca6b4d53/print-each-record-to-separate-pdf-file-using-certain-field-for-filename?forum=accessdev
    https://stackoverflow.com/questions/24416137/print-reports-to-pdf-in-access-2013-but-use-a-looping-filter
    https://stackoverflow.com/questions/41338235/create-loop-to-open-and-export-reports
    https://stackoverflow.com/questions/47304589/looping-through-a-recordset-to-output-ms-access-report-to-a-pdf-file
  • Re: CREAZIONE REPORT E FILE PDF MULTIPLI

    Wow!
    Sei stato chiarissimo
    Ci provo subito
Devi accedere o registrarti per scrivere nel forum
22 risposte