Generazione PDF individuali da template

di il
16 risposte

Generazione PDF individuali da template

Buonasera a tutti,
sto lavorando su un database di persone e mi è stato richiesto di poter generare un PDF di una tessera per ogni persona, che poi troverò il modo di inviare via mail automaticamente. Partendo dal presupposto che non sono un programmatore di Access, ho risolto tutte le altre richieste usando SQL e/o Macro varie, ma qui leggendo un po' in giro son stato costretto a provare VB. Da ciò che son riuscito a capire il metodo migliore sembra usare un Report, quindi ho creato un report Tessere con i campi nome, cognome, numero tessera. Ho provato questo codice che sembrava il più decente ma alla fine fa un PDF unico con tutti i nomi e mi dà pure degli errori. Avete qualche idea?
Private Sub Comando193_Click()

    Dim myrs As Recordset
    Dim myPDF, myStmt As String

    ' Open a record set with a list of invoice number to print
    myStmt = "SELECT distinct [n° tessera] from [elenco generale iscritti]"
    Set myrs = CurrentDb.OpenRecordset(myStmt)

    ' For each invoice, print in a .pdf
    Do Until myrs.EOF

        ' Set the output path of your PDF file invoice
        myPDF = "C:\tessere\tessera_" & Format(myrs.Fields("[n° tessera]"), "000000") & ".pdf"

        ' Open the report with the proper where condition
        DoCmd.OpenReport "Tessere", acViewPreview, , "n° tessera" & myrs.Fields("[n° tessera]").Value

        ' Generate the output in pdf
        DoCmd.OutputTo objectType:=acOutputReport, objectName:="Tessere", outputformat:=acFormatPDF, outputfile:=myPDF, outputquality:=acExportQualityPrint

        DoCmd.Close ' Close the report
        myrs.MoveNext ' read next

    Loop

    ' some cleanup
    myrs.Close
    Set myrs = Nothing

End Sub
Per agevolare la lettura, [elenco generale iscritti] è la tabella principale, [n° tessera] è la colonna del numero tessera, Tessere è il report con il template della tessera. Idee alternative all'uso di VB sono ovviamente ben accette!
Grazie in anticipo per l'aiuto

16 Risposte

  • Re: Generazione PDF individuali da template

    RpiUser ha scritto:


    Dim myrs As Recordset
    Dim myPDF, myStmt As String
    Io lavorerei con la tecnica DAO dichiarando
    Dim myDB As DAO.Database
    Dim myrs As DAO.Recordset
    Leggi poi qui


    poi le dichiarazioni variabili String si scrivono per intero così
    Dim myPDF As Stringa, myStmt As String
    poi occorre rivedere tutta la logica...che passo passo non ho capito...
  • Re: Generazione PDF individuali da template

    OsvaldoLaviosa ha scritto:


    RpiUser ha scritto:


    Dim myrs As Recordset
    Dim myPDF, myStmt As String
    Io lavorerei con la tecnica DAO dichiarando
    Dim myDB As DAO.Database
    Dim myrs As DAO.Recordset
    Leggi poi qui


    poi le dichiarazioni variabili String si scrivono per intero così
    Dim myPDF As Stringa, myStmt As String
    poi occorre rivedere tutta la logica...che passo passo non ho capito...
    Grazie per la guida!
    scusa per gli errori grossolani.. come detto io e VB siamo su mondi diversi e ho preso pezzi di codice in giro. Ora mi guardo bene la guida per vedere come leggere i dati, per la logica il concetto è solo che mi serve inviare via mail un PDF con una tessera, che è fatta da Nome Cognome Numero e una foto, quindi ho provato a usare i report. Devo però inviare a ognuno il suo quindi non mi serve un PDF con 100 tessere ma 100 PDF da una tessera
  • Re: Generazione PDF individuali da template

    Va bene l'idea del report. Va bene il ciclo Do...Loop. All'interno del ciclo esporti (se necessario) con DoCmd.OutputTo. Per inviare via mail si usa DoCmd.SendObject, leggi qui
    https://docs.microsoft.com/en-us/office/vba/api/Access.DoCmd.SendObject
  • Re: Generazione PDF individuali da template

    Buongiorno Osvaldo,
    ho provato a modificare un po' il codice, dopo numerosi tentativi ora mi da un type mismatch e mi è venuto il dubbio di aver sbagliato a formattare il report.
    Il codice attuale è questo:
    Private Sub Comando193_Click()
    
    Dim DBCorrente As DAO.Database 'Apertura collegamenti
    Dim Tabella As DAO.Recordset
    
    Set DBCorrente = CurrentDb
    Set Tabella = DBCorrente.OpenRecordset("elenco generale iscritti", dbOpenDynaset) 'Apertura tabella
    
    Tabella.FindNext "[n° tessera] IS NOT NULL" 'trova record con numero tessera assegnato
    DoCmd.OpenReport "Tessere", acViewPreview, , "nome=" & Tabella.Fields("[nome]").Value, "cognome=" & Tabella.Fields("[cognome]").Value, "[n° tessera]=" & Tabella.Fields("[n° tessera]").Value
    
    End Sub
    Niente loop, pdf o invio via mail, per ora volevo solo vedere se riuscivo a selezionare il primo utente con tessera e aprire un report con dentro solo lui. Ricevo run-time error 13, ma non capisco dove sbaglio.
    Il report l'ho creato da vuoto, ho inserito due immagini e 3 etichette. Le etichette hanno nel campo a sinistra un nome (uguale per comodità, quindi Cognome, Nome, n° tessera) e nel campo a destra hanno origine controllo la relativa colonna della tabella (cognome, nome, n° tessera).

    Hai qualche idea?
    Grazie per l'aiuto
  • Re: Generazione PDF individuali da template

    Il suggerimento che ti ho fornito indicando il link riguardo DAO.Recordset ha una sua logica mirata. Aprire un recordset significa poi lavorare sul RECORDSET...esattamente come indicato. Il codice che hai postato è incompleto, illogico.
    Se preferisci:
    1. Punti su un Nominativo (lo puoi fare da maschera)
    2. Apri il report filtrando il IDNominativo, ottieni una Tessera
    3. Tale tessera può essere esportata in pdf
    4. Tale pdf può essere inviato via mail
    Anche questa strada è percorribile (metti da parte la logica DAO), lavori manualmente un record alla volta e risolvi.
  • Re: Generazione PDF individuali da template

    Io la questione la vedo così. Nomino la tua tabella Nominativi, avente i campi IDNominativo, Nominativo, NTessera, email (+ altri campi). Il report si chiama NomeReport. Il clic di un pulsante fa questo
    Private Sub NomePulsante_Click()
    Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Set DB = CurrentDB
    Set rs = DB.OpenRecordset("Nominativi", dbOpenDynaset)
    Do Until rs.EOF
        DoCmd.OpenReport, "NomeReport", acViewPreview, , "[IDNominativo] = " & rs!IDNominativo
        DoCmd.SendObject acSendReport, "NomeReport", acFormatPDF, rs!email
        DoCmd.Close acReport, "NomeReport"
        rs.MoveNext
    Loop
    rs.Close
    DB.Close
    End Sub
  • Re: Generazione PDF individuali da template

    Un record alla volta ovviamente non è percorribile, devo automatizzare il tutto. Provo il codice che hai scritto qui sopra, devo solo aggiungerci il filtraggio solo per chi ha tessera, gli altri campi e configurare la mail, vediamo come va
    Grazie mille!
  • Re: Generazione PDF individuali da template

    Allora ci sono quasi, il codice al momento è questo
    Private Sub Comando193_Click()
    
    Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Set DB = CurrentDb
    Set rs = DB.OpenRecordset("SELECT * FROM [elenco generale iscritti] WHERE tessera IS NOT NULL", dbOpenDynaset)
    
    Do Until rs.EOF
        DoCmd.OpenReport "Tessere", acViewPreview, , , , "[nome]= " & rs!NOME & "[cognome]= " & rs!COGNOME & "[tessera]= " & rs![tessera]
        DoCmd.SendObject acSendReport, "Tessere", acFormatPDF, rs!email, , , "test", "prova invio tessera", 0
        DoCmd.Close acReport, "Tessere"
        rs.MoveNext
    Loop
    
    rs.Close
    DB.Close
    
    End Sub
    Il report viene aperto e la mail è a posto, però i parametri non vengono presi




    non capisco se è sbagliato il formato del report o se sbaglio il passaggio dei parametri, purtroppo arrivo da altri linguaggi di programmazione in cui è tutto diverso. In debug mi mostra che il dato viene letto correttamente dal recordset quindi fin lì ci siamo. Il report sono solo 3 etichette in cui ho messo come origine controllo [elenco generale iscritti].nome ecc
  • Re: Generazione PDF individuali da template

    DoCmd.OpenReport "Tessere", acViewPreview, , , , "[nome]= " & rs!NOME & "[cognome]= " & rs!COGNOME & "[tessera]= " & rs![tessera]
    A che ti serve questo filtro complesso se in sostanza ti basta un solo campo per filtrare? Io ho proposto IDNominativo (già perchè non hai un campo così?), altrimenti potresti usare [tessera] se è univoco.
  • Re: Generazione PDF individuali da template

    Perchè nella mia testa bacata questo era un passaggio parametri. Ho provato a mettere solo tessera e fa la stessa cosa, non dovrei nemmeno avere bisogno di filtri visto che il recordset che apro è già filtrato dalla query
    Come faccio a dirgli "siamo sul record attuale, ora apri il report e metti nell'etichetta "nome" il nome del record attuale, idem per cognome, idem per tessera" ?
  • Re: Generazione PDF individuali da template

    Non ti seguo su vari fronti. Se hai la query, questa query ha un NOME PROPRIO? Se sì usala e basta, lascia perdere SELECT.
  • Re: Generazione PDF individuali da template

    No, la query è quella in alto -- "SELECT * FROM [elenco generale iscritti] WHERE tessera IS NOT NULL"
    io devo solo:
    -trovare una persona che ha il campo tessera non nullo
    -aprire un form che contenga 3 campi: nome, cognome, tessera e inserire in quei 3 campi i dati del record trovato nel punto precedente
    -inviare
    -ripetere per ogni persona con campo tessera

    Non funziona il passaggio dei tre parametri al form. Il codice non riempie le 3 caselline del form con i dati presi dal record, che però sono letti correttamente come ho verificato in debug
  • Re: Generazione PDF individuali da template

    Scusa ma la tabella Tessere non identifica in modo UNIVOCO la tessera con una PK(Chiave primaria)...?

    SI o NO...?

    Nel caso sia NO, hai commesso un grosso errore, devi usare una PK che peraltro recuperi dal RS ciclato...
    Nel caso sia SI, è inutile usare NOME e COGNOME... non ti pare...?

    In ogni caso da qualsiasi linguaggio arrivi, il costrutto SQL di campi Testo si effettua con la sintassi di un campo testo... mentre tu hai usato la sintassi di campi Numerici.
  • Re: Generazione PDF individuali da template

    Tessere non è una tabella, è un Report
    La tabella è [elenco generale iscritti], la chiave primaria è solo un numero a numerazione automatica, le tessere le inseriamo a mano e sono univoche anche se non sono chiavi
    Nome e cognome non voglio usarli come filtri, voglio passarli come parametri. Per me il recordset è già filtrato dicendogli che n° tessera è not null (non tutti hanno tessera).
    Cognome e nome sono campo Testo Breve, tessera è numerico
    Il Database non è mio, sto solo aggiungendo un bottone per fare un favore, non ho le capacità per metterglielo completamente in ordine

    Riassumo quello che devo fare nel caso si sia creata confusione:

    -Dalla tabella [elenco generale iscritti], prendi il primo record che abbia campo tessera non nullo
    -Sfruttando un template componi la tessera passando i campi nome, cognome, n° tessera del record che stiamo attualmente visualizzando. Mi sembra di aver capito che i Report siano il metodo migliore, ci ho messo 2 foto e tre Etichette, che hanno come origine controllo [elenco generale iscritti].nome etc. Lo sbaglio deve essere o nel report o nel passaggio dei parametri al report.
    -Invia via mail
    -Passa al record successivo e ricomincia
Devi accedere o registrarti per scrivere nel forum
16 risposte