Esporta report pdf cliente e nome personalizzato

di il
44 risposte

Esporta report pdf cliente e nome personalizzato

Buona sera,
ho realizzato un database che come scopo ultimo ha l'esportazione in pdf di un report (1 report per ogni cliente) dove vengono riepilogati tutti i rifornimenti effettuati nel giorno selezionato dal cliente.

Sono riuscito tramite un pulsante di comando su una maschera ad esportare un unico pdf con il nome del primo cliente (che nel mio database di test si chiama Veicolo) che ha fatto rifornimento per primo il giorno selezionato

Premessa: utilizzo Access da un mese e il codice che vi incollo di seguito è il risultato di varie ricerche fatte sul web

Private Sub cmdesportapdf_Click()

DoCmd.OpenReport "Report", acViewPreview, , , acHidden
DoCmd.OpenReport "Report", acViewPreview, , , acHidden
DoCmd.OutputTo acOutputReport, "Report", acFormatPDF, "C:\Users\Luca Masenelli\Desktop\SYNC GOOGLE DRIVE\CTF SERVICES\test stampa\" & Reports![Report]![Veicolo] & ".pdf", True
DoCmd.Close

End Sub
Ho fatto molta fatica perchè non sono riuscito a trovare una spiegazione a me comprensibile sulla sintassi.

Di seguito quello che avrei bisogno di realizzare:
1 - Esportare 1 pdf per ogni cliente fino a che non ci sono più report esportabili (ho letto che è possibile utilizzare il Do ... Loop oppure il For ... Next ma non riesco a comprendere la sintassi.

2 - Il nome del file esportato deve essere NomeCilente - Rifornimenti del Data (ho provato a realizzarlo con la sintassi seguente ma non funziona)

DoCmd.OutputTo acOutputReport, "Report", acFormatPDF, "C:\Users\Luca Masenelli\Desktop\SYNC GOOGLE DRIVE\CTF SERVICES\test stampa\" [b]& Reports![Report]![Veicolo] & " - Rifornimenti del " & Reports![Report]![Data] &[/b] ".pdf", True
Potete aiutarmi spiegandomi la sintassi?

Grazie mille in anticipo della disponibilità

44 Risposte

  • Re: Esporta report pdf cliente e nome personalizzato

    1. A te serve CICLARE tutti i Clienti. Questa cosa la fai con un Do...Loop, ma prima di capire questo occorre sapere che In VBA i record di una tabella si "indagano/ciclano" con DAO.Recordset. Leggi qui
    http://forum.masterdrive.it/access-79/access-leggere-scrivere-dati-nelle-tabelle-tramite-vba-dao-13176/

    2. Volta per volta che tu "analizzi/prendi in considerazione" l'IDCliente di ogni record, tale valore a te serve come filtro (Condizione WHERE) per il tuo DoCmd.OpenReport, leggi tutti gli argomenti da qui
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.openreport
    ma anche da qui per catturare meglio le sintassi della WhereCondition
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.openform
  • Re: Esporta report pdf cliente e nome personalizzato

    Grazie mille, mi metto subito all'opera
  • Re: Esporta report pdf cliente e nome personalizzato

    Ho fatto vari tentativi ma non riesco a capire come inserire la condizione where.
    La tabella da prendere in considerazione è una query che ho chiamato qfiltrogiornaliero, in cui ci sono i seguenti campi Tessera, OraRif, Data, LitriInterni, Km, Pompa, Veicolo.
    Il criterio della query è la data e l'ho collegata ad un report che raggruppa i rifornimenti per il campo "Veicolo" e li ordina in base al numero di tessera; una pagina per ogni veicolo.

    Il tasto esporta singoli report dovrebbe fare quanto segue:
    1 - Apre il DBCorrente
    2 - Cicla con DAO.Recordset i valori filtrati con il criterio della query
    3 - Genera il report del primo record e lo esporta in pdf con il nome assegnato nella cartella specifica
    4 - Si sposta sul record successivo e ripete il punto 3
    5 - Quando non ci sono più dati successivi si ferma

    Di seguito il codice:
    
    Private Sub cmdexport1_Click()
    
    Dim DBCorrente as DAO.Datatbase
    Dim qfiltrogiornaliero as DAO.Recordset
    
    Set qfiltrogiornaliero = DBCorrente.OpenRecordset("qfiltrogiornaliero",DBopendynaset)
    
    Do Until Veicolo.EOF
    	DoCmd.OutputTo acOutputReport, "Report", acFormatPDF, "C:\Users\Luca Masenelli\Desktop\SYNC GOOGLE DRIVE\CTF SERVICES\test stampa\" & Format(Reports![Report]![Veicolo]) & ".pdf", True
    	DoCmd.Close
    	
    	Veicolo.MoveNext
    Loop
    qfiltrogiornaliero.Close
    DBCorrente.Close
    
    Forse sono duro io, ma non riesco a capire.
    Scusate la mia ignoranza.
  • Re: Esporta report pdf cliente e nome personalizzato

    Commetti uno sproposito di errori dati sicuramente dal fatto che non sai cosa stai scrivendo.
    Innanzitutto dichiarinuna variabile come recordset poi ne usi un'altra che non hai dichiarato ... Veicolo da dove arriva...?
    La variabile DbCorrente cosa sarebbe...? La dichiari ma non la valorizzi...

    Poi segui la logica
    Se devi generare un report per ogni Record... devi aprirlo ogni volta... passando al parametro Wherecondition il criterio di filtro...e stamparlo o esportarlo... lo chiudi e riparti.

    La sequenza è questa:
    1) Apri il recordset
    2) verifichi non sia vuoto controllando EOF
    3) inizi il ciclo Di Until...
    4) Apri il report passando il parametro "idPk=" & rs in modalita hidden
    5) generi l'output del report in pdf assicurandosi che il nome sia univoco
    6) chiudi il report
    7) avanzi al successivo record
    riparti dal punto 4

    Prima però se non correggi il codice che hai fatto non andrà mai a prescindere.
  • Re: Esporta report pdf cliente e nome personalizzato

    Per Monster 88, dopo aver letto attentamente il primo link da me suggerito e gli errori indicati da @Alex, prova questo
    Private Sub cmdexport1_Click()
    Dim DBCorrente as DAO.Datatbase
    Dim rsqfiltrogiornaliero as DAO.Recordset   'ti sconsiglio di dare lo stesso nome variabile con quello della query. La variabile potresti chiamarla rsqfiltrogiornaliero.
    Set DBCorrente = CurrentDB    'CurrentDB è una "parola chiave" e questa assegnazione va fatta comunque
    Set rsqfiltrogiornaliero = DBCorrente.OpenRecordset("qfiltrogiornaliero", dbopendynaset)  
    Do Until rsqfiltrogiornaliero.EOF
            DoCmd.OpenReport "Report", , , "[IDCliente] = " & rsqfiltrogiornaliero![IDCliente]  'punto 4) suggerito da @Alex
    	DoCmd.OutputTo acOutputReport, "Report", acFormatPDF, "C:\Users\Luca Masenelli\Desktop\SYNC GOOGLE DRIVE\CTF SERVICES\test stampa\" & Format(Reports![Report]![Veicolo]) & ".pdf", True
    	DoCmd.Close "Report"   'indica sempre esplicitamente l'oggetto che stai chiudendo
    	rsqfiltrogiornaliero.MoveNext
    Loop
    rsqfiltrogiornaliero.Close
    DBCorrente.Close  'dopo la chiusura del recordset occorre anche chiudere il DB
    End Sub
    
  • Re: Esporta report pdf cliente e nome personalizzato

    Osvaldo guarda bene quello che hai suggerito...
    
    Set qfiltrogiornaliero =....
    Non serve chiudere il DbCorrente, sarebbe stato meglio usare DbEngine(0)(0)... ma sicuramente serve distruggerle l'oggetto.
    Set NomeVariabileOggetto=Nothing
    E così pure con il recordset... cheninvece va chiuso.

    Devi verificare che il recordset non sia VUOTO... manca la gestione errori...
  • Re: Esporta report pdf cliente e nome personalizzato

    @Alex ha scritto:


    Osvaldo guarda bene quello che hai suggerito...
    
    Set qfiltrogiornaliero =....
    OK, corretto direttamente nel post precedente.
  • Re: Esporta report pdf cliente e nome personalizzato

    Intanto grazie mille della pazienza e del tempo che mi state dedicando sia OsvaldoLaviosa che Alex ,
    alcune domande per capire meglio:
    
    Private Sub cmdexport1_Click()
    Dim DBCorrente As DAO.Datatbase 
    ' questa è la dichiarazione che DBCorrente(il mio DB si chiama Report Giornaliero) è di tipo Database, qui devo mettere il nome del mio DB o va bene anche DB corrente?
    Dim rsqfiltrogiornaliero As DAO.Recordset   
    'questa è la dichiarazione della variabile che è all'interno della mia query di tipo Recordset, la mia variabile si chiama Veicolo che identifica ogni cliente, quindi al posto di rsqfiltrogiornaliero potrei mettere Veicolo?
    Set DBCorrente = CurrentDb    
    'CurrentDB è una "parola chiave" e questa assegnazione va fatta comunque, questa assegnazione che è da fare comunque cosa fa? cpsa sognifica che CurrentDB è una parola chiave?
    Set rsqfiltrogiornaliero = DBCorrente.OpenRecordset("qfiltrogiornaliero", dbOpenDynaset) 
    'qui non capisco bene, setta la variabile nel dbcorrente e apre il recordset all'interno della query qfiltrogiornaliero?
    Do Until rsqfiltrogiornaliero.EOF 
    'qui inizia il Do Until... Loop e controlla se la variabile è vuota
        DoCmd.OpenReport "Report", , , "[IDCliente] = " & rsqfiltrogiornaliero![IDCliente]  
        'a cosa si riferisce l'ID Cliente?
        DoCmd.OutputTo acOutputReport, "Report", acFormatPDF, "C:\Users\Luca Masenelli\Desktop\SYNC GOOGLE DRIVE\CTF SERVICES\test stampa\" & Format(Reports![Report]![Veicolo]) & ".pdf", True 
        'qui esporta il report con il nome assegnato, qui avrei necessita che venisse fuori il nome cosi composto: Reports![Report]![Veicolo] & "rifornimenti del" & Reports![Report]![Data] la sintassi è corretta o la devo inserire dopo Format(?
        DoCmd.Close "Report"   
        'qui chiude il report, indica sempre esplicitamente l'oggetto che stai chiudendo
        rsqfiltrogiornaliero.MoveNext 
        'qui va al prossimo record 
    Loop 
    ' qui torna all'inizio del Do Until
    rsqfiltrogiornaliero.Close
     'qui chiude il recordset
    DBCorrente.Close 
    'dopo la chiusura del recordset occorre anche chiudere il DB
    End Sub
    
    Nel punto suggerito da Alex 4)Apri il report passando il parametro "idPk=" & rs in modalita hidden, "idPk=" a cosa si riferisce & rs(presumo sia la variabile dichiarata all'inizio) in modalità hidden (nascosta) ma nel codice che ha gentilmente scritto OsvaldoLaviosa non vedo la modalità hidden, mi sbaglio?

    Altra cosa il criterio della query (Data) viene letto solo una volta all'apertura del report o deve essere impostato ad ogni ciclo Do Untill...Loop?

    Spero di non aver fatto troppa confusione, vorrei allegare anche il DB (non riesco ad allegarlo mi dice "Estensione del file non valida: Report Giornaliero.accdb" perchè secondo me mi sono dimenticato di indicarvi qualcosa di importante, purtroppo non ho basi di VBA e anche cercando sul web non ho trovato documenti o manuali che mi possano aiutare a partire e capire meglio la sintassi.

    Attendo vostre.

    Grazie mille
  • Re: Esporta report pdf cliente e nome personalizzato

    Monster88 ha scritto:


    Dim DBCorrente As DAO.Database
    ' questa è la dichiarazione che DBCorrente(il mio DB si chiama Report Giornaliero) è di tipo Database, qui devo mettere il nome del mio DB o va bene anche DB corrente?
    Qui tu stai dichiarando una variabile con un nome che vuoi tu. Puoi chiamarla anche Pippo, l'importante è che non contenga spazi all'interno. Non sei obbligato a nominarla come si chiama il tuo database.

    Monster88 ha scritto:


    Dim rsqfiltrogiornaliero As DAO.Recordset
    'questa è la dichiarazione della variabile che è all'interno della mia query di tipo Recordset, la mia variabile si chiama Veicolo che identifica ogni cliente, quindi al posto di rsqfiltrogiornaliero potrei mettere Veicolo?
    Sì, per lo stesso motivo di prima.

    Monster88 ha scritto:


    Set DBCorrente = CurrentDb
    'CurrentDB è una "parola chiave" e questa assegnazione va fatta comunque, questa assegnazione che è da fare comunque cosa fa? cosa sognifica che CurrentDB è una parola chiave?
    CurrentDB significa esattamente "database corrente" e scritto così il VBA lo riconosce immediatamente. Diciamo che se (generalmente) non hai bisogno di pescare informazioni da "altro database", questa istruzione la scrivi così come è.

    Monster88 ha scritto:


    Set rsqfiltrogiornaliero = DBCorrente.OpenRecordset("qfiltrogiornaliero", dbOpenDynaset)
    'qui non capisco bene, setta la variabile nel dbcorrente e apre il recordset all'interno della query qfiltrogiornaliero?
    La parte a destra di = APRE il recordset della query qfiltrogiornaliero...non solo... e il recordset viene impostato dentro la variabile rsqfiltrogiornaliero. Ti faccio notare che quando si impostano istruzioni dentro VARIABILI OGGETTO (database, recordset e tutte quelle che stanno sotto DAO...) l'impostazione richiede la parola Set all'inizio.

    Monster88 ha scritto:


    Do Until rsqfiltrogiornaliero.EOF
    'qui inizia il Do Until... Loop e controlla se la variabile è vuota
    Qui inizia il ciclo Do Until...Loop, ma non controlla se la variabile è vuota. Per quello che ne so io, non ti serve tale controllo.

    Monster88 ha scritto:


    DoCmd.OpenReport "Report", , , "[IDCliente] = " & rsqfiltrogiornaliero![IDCliente]
    'a cosa si riferisce l'ID Cliente?
    Nel tuo report avrai certamente un campo "chiave primaria". Io l'ho chiamato [IDCliente] convenzionalmente.

    Monster88 ha scritto:


    DoCmd.OutputTo acOutputReport, "Report", acFormatPDF, "C:\Users\Luca Masenelli\Desktop\SYNC GOOGLE DRIVE\CTF SERVICES\test stampa\" & Format(Reports![Report]![Veicolo]) & ".pdf", True
    'qui esporta il report con il nome assegnato, qui avrei necessita che venisse fuori il nome cosi composto: Reports![Report]![Veicolo] & "rifornimenti del" & Reports![Report]![Data] la sintassi è corretta o la devo inserire dopo Format(?
    Non ho afferrato completamente come deve essere la stringa del nome file. Dovresti fare un po' di prove. Se non ti raccapezzi perché la sintassi dell'intera istruzione è molto lunga, ti consiglio di usare altre variabili classiche di tipo String. Su di esse fai il Format PRIMA, poi dai in pasto all'istruzione finale il valore della variabile.
    P.S. Nella funzione Format non dichiari come deve essere questo Format. Leggi bene qui
    https://support.office.com/it-it/article/funzione-format-6f29d87b-8761-408d-81d3-63b9cd842530
  • Re: Esporta report pdf cliente e nome personalizzato

    Ciao OsvaldoLaviosa, grazie mille per la paienza nelle spiegazioni;
    nel mio caso il report che prende i dati dalla query non ha un campo "chiave primaria".
    Il database fa un lavoro molto semplice:
    1 - Importa un file di excel dove ci sono i campi Tessera, OraRif, Data, LitriInterni, Km, Pompa, Veicolo
    2 - Da questi campi con una query con criterio data filtro i dati per "Data" scusa il giro di parole
    3 - Genero un report per ogni veicolo e sotto vengono elencati in una tabella i campi Tessera, OraRif, Data, LitriInterni, Km, Pompa, ordinati per tessera e data
    4 - Dovrebbe esportare un pdf per ogni veicolo della data scelta nella query

    L'unico Id presente è nella tabella Importa dati e si riferisce a quanto importato dal foglio excel,
    Posso esimermi da utilizzare una "chiave primaria"?
  • Re: Esporta report pdf cliente e nome personalizzato

    Scusami,
    ho fatto una prova ma mi da errore e mi apre il debug su
    Dim DBCorrente As DAO.Database

    "Errore di compilazione: Tipo definito dall'utente non definito"
    come mai?
  • Re: Esporta report pdf cliente e nome personalizzato

    Monster88 mi pare di essere dal pizzicagnolo... che dice "fanno 1 etto e 15, che faccio lascio...?"

    Un database relazionale ha delle regole precise che devi conoscere per usare un prodotto basato su un database relazionale, altrimenti, come stai facendo vai solo a tentoni senza minimamente capire nulla.

    Ora ti sono state date tutte le.indicazioni tecniche ma non è possibile fare un trattato su ognuna...
    Prova a studiare le regole di Normalizzazione dei database, almeno le prime 3 Forme Normali, ti sono indispensabili sia per capire cosa devi fare ma anche gli orientamenti tecnici che ti vengono dati.
  • Re: Esporta report pdf cliente e nome personalizzato

    Grazie Alex, farò quanto suggerito da voi.
    Ultima domanda, quando avrò "finito" è possibile mandarvi il database e chiedere un vostro giudizio?
    In questo caso il database come posso inviarlo? in allegato al messaggio non lo accetta.

    Grazie ancora
  • Re: Esporta report pdf cliente e nome personalizzato

    Personalmente No, guardare e giudicare il lavoro di altri è complicato e farlo in modo superficiale non serve, mentre farlo seriamente diventa un vero e proprio lavoro... e su un forum direi non serve a nessuno.
Devi accedere o registrarti per scrivere nel forum
44 risposte