Stampa report in singoli file

di il
3 risposte

Stampa report in singoli file

Buongiorno a tutti,
questo è il mio primo post che inserisco e spero di essere chiaro e di non commettere errori.
Ho la necessità di stampare tramite un report di access una serie di attestati di formazione divisi per singola pagina.
Con la mia semplice conoscenza di VBA ho creato la routine di seguito riportata, che se pur funzionando, mi crea un solo file Pdf con il nome del primo dicente.

Avrei bisogno che mi creasse tanti file pdf intestati con il nome del discente.

Grazie a tutti per il supporto


Sub Stampa()

Rem Dimensionamento delle variabili
Dim Primorecord As Long
Dim Ultimorecord As Long
Dim Recordcorrente As Long
Dim Nomefile As String
Dim DBCorrente As DAO.Database
Dim Tabella As DAO.Recordset

Rem Apertura tabella
Set DBCorrente = CurrentDb
Set Tabella = DBCorrente.OpenRecordset("9999 - Stampa attestati", dbOpenDynaset)

Rem Definizioni delle varibili
Nomereport = "Stampa attestati"
Recordcorrente = counter
Primorecord = Tabella.Fields("IDattestato")
Tabella.MoveLast
Ultimorecord = Tabella.Fields("IDattestato")
Tabella.MoveFirst

Rem Ciclo di stampa

For counter = Primorecord To Ultimorecord
Recordcorrente = counter
Nomefile = "c:\test\" & Tabella.Fields("Discente") & ".pdf"

DoCmd.OpenReport Nomereport, acViewNormal, , "[9999 - Stampa attestati].[IDattestato] =" & Recordcorrente, acHidden
DoCmd.OutputTo acOutputReport, Nomereport, acFormatPDF, Nomefile
DoCmd.Close acReport, Nomereport

Next

End Sub

3 Risposte

  • Re: Stampa report in singoli file

    Il codice quando serve faccia una cosa e non la fa.. NON FUNZIONA, non è ammissibile il "Seppur funzionando"...!
    Quello che infatti esponi è ovvio dal momento che non Modifichi il Nome del File PDF, quindi sovrascrivi sempre quello e si salva l'ultimo.
    
    For counter = Primorecord To Ultimorecord
    Recordcorrente = counter
    Nomefile = "c:\test\" & Tabella.Fields("Discente") & "_" & Recordcorrente & ".pdf"
    Il codice potrebbe contenere un grave errore concettuale...
    Se il campo [IdAttestato] nella Tabella fosse una ChiavePrimaria di tipo Couner, la Coerenza tra Recordcorrente(contatore progressivo) e [IDAttestato] è vera se e solo se non cancelli nessun dato... basta avere un salto in progressione ed il codice fallisce.
    Diciamo che non serve a nulla quella parte di recupero del Primo ed Ultimo, e il Corrente è quello in analisi al momento... se invece di ciclare dei numeri ciclassi il Recordset...!

    Nella sostanza puoi partire da un concetto simile: [Code] Sub Stampa() Dim Nomefile As String Dim DBCorrente As DAO.Database Dim Tabella As DAO.Recordset Dim i As Integer Set DBCorrente = CurrentDb Set Tabella = DBCorrente.OpenRecordset("9999 - Stampa attestati", dbOpenSnapshot,dbReadOnly) If not Tabella.Eof And Tabella.Bof Then Tabella.MoveFirst Do Until Tabella.Eof i=i+1 ' Serve solo a numerare progressivamente il File, non si usa MAI per queste cose la PK se vuoi la numerazione progresiva Nomefile = "c:\test\" & Tabella.Fields("Discente") & "_" & i & ".pdf" DoCmd.OpenReport Nomereport, acViewNormal, , "[IDattestato] =" & Tabella.Fields("IDattestato").Value, acHidden DoCmd.OutputTo acOutputReport, Nomereport, acFormatPDF, Nomefile DoCmd.Close acReport, Nomereport Tabella.Movenext Loop Next Tabella.Close Set Tabella=Nothing Set DBCorrente=Nothing End Sub
  • Re: Stampa report in singoli file

    Grazie Alex, mi sei stato di aiuto evidenziando i miei errori...
    In base ai tuoi consigli ho modifica il codice in questo modo (inserendo anche altri piccoli dettagli) ed ora funziona.

    Sicuramente è migliorabile (considera che è il mio primo codice) anche perché se lancio la routine due volte consecutivamente mi appare il seguente errore :

    Errore di run-time '3014' :
    Impossibile aprire altre tabelle

    Grazie ancora per l'aiuto
    
    Sub Stampa()
    
    Rem Dimensionamento delle variabili
    Dim Recordcorrente As Long
    Dim Nomefile As String
    Dim DBCorrente As DAO.Database
    Dim Tabella As DAO.Recordset
    Dim Repository As String
    Dim Discente As String
    Dim Nomecorso As String
    
    Rem Apertura tabella
    Set DBCorrente = CurrentDb
    Set Tabella = DBCorrente.OpenRecordset("9999 - Stampa attestati", dbOpenDynaset)
    
    Rem Definizioni delle varibili
    Nomereport = "Stampa attestati"
    Repository = Environ("USERPROFILE") & "\Desktop\Stampa Attestati"
    
    
    Rem Creazione repository
    
    If Len(Dir(Repository, vbDirectory)) = 0 Then
         MkDir Environ("USERPROFILE") & "\Desktop\Stampa Attestati"
    End If
    
    Rem Ciclo di stampa
    
    Do While Not Tabella.EOF
    Discente = Tabella.Fields("Discente")
    Recordcorrente = Tabella.Fields("Idattestato")
    Nomecorso = Tabella.Fields("Descrizione")
    Nomefile = Repository & "\" & Nomecorso & " - " & Tabella.Fields("Discente") & ".pdf"
    
    DoCmd.OpenReport Nomereport, acViewReport, , "[9999 - Stampa attestati].[IDattestato] =" & Recordcorrente, acHidden
    DoCmd.SelectObject acReport, Nomereport
    DoCmd.OutputTo acOutputReport, Nomereport, acFormatPDF, Nomefile
    DoCmd.Close acReport, Nomereport
    
    Tabella.MoveNext
    
    Loop
    
    Rem Chiudi Database/Tabelle
    Tabella.Close
    DBCorrente.Close
    
    Rem Avvisi
    
    MsgBox "Stampa completata. Gli attestati sono nella cartella STAMPA ATTESTATI sul desktop."
    
    End Sub
    
  • Re: Stampa report in singoli file

    Perché hai tolto i controlli che c'erano...?
    Se la query fosse vuota...?
    Manca anche un DoEvents nel ciclo.
Devi accedere o registrarti per scrivere nel forum
3 risposte