Stampa diretta di report

di il
11 risposte

Stampa diretta di report

Ciao a tutti, ho una routine di stampa di report con 2 “modalità”, la prima è questa

        DoCmd.OpenReport NomeReport, acViewPreview, , FILTRO, acHidden, Argomento
        DoCmd.SelectObject acReport, NomeReport, False
        DoCmd.PrintOut acPrintAll, , , , Copie, True
        DoCmd.Close acReport, NomeReport

la seconda è questa

        For i = 1 To Copie
            DoCmd.OpenReport NomeReport, acViewNormal, , FILTRO, acHidden, Argomento
        Next i

vorrei capire perchè nel primo caso si attiva l'evento LOAD mentre nel secondo no …

inoltre avere un parere tecnico su quale sia la tecnica migliore per stampare direttamente tra le 2 … o se ne avete di migliori.

11 Risposte

  • Re: Stampa diretta di report

    acViewPreview---->acViewNormal

    Prova a verificare e vedrai che l'evento LOAD si scatena solo in una delle 2 modalità, non ricordo quale a memoria, ma da quanto dici solo in acViewPreview.

    Apri lo stesso report nei 2 modi e metti un MsgBox su Load… dovresti avere conferma.

  • Re: Stampa diretta di report

    Si si è così, solo che così non posso usare il metodo 2 (quello col acViewNormal) per stampare se ho cose nell'evento load 

    Scusa Alex ma tu per stampare direttamente un report quindi usi il primo metodo? 

  • Re: Stampa diretta di report

    Ti faccio un esempio, in un report stampo un certificato con la firma del medico e del lavoratore.

    Ho quindi 2 oggetti immagine in cui devo caricare quello che ho nei relativi campi “link” per cui nel LOAD ho

    Me.FirmaMED.Picture = miaFunzione(Me!PATH_FirmaMED)
    Me.FirmaLAV.Picture = miaFunzione(Me!PATH_FirmaLAV)

    ma se stampo direttamente col metodo 2 come faccio ? non posso metterlo nell'OPEN perchè non funzionerebbe la “ricognizione” dei campi dell'SQL di origine

  • Re: Stampa diretta di report

    Uso il 2° se in singola stampa, il primo quando devo gestire Copie Multiple.

    In ogni caso prova ad usare l'evento OPEN per caricare le immagini, al posto di LOAD, sempre a memoria, funziona sempre e dovrebbe andare.

    Oppure ancora più semplice, metti nella proprietà Picture la funzione

  • Re: Stampa diretta di report

    10/07/2024 - @Alex ha scritto:


    Uso il 2° se in singola stampa, il primo quando devo gestire Copie Multiple.

    direi che sulla fiducia farò così anche io :)

    10/07/2024 - @Alex ha scritto:


    In ogni caso prova ad usare l'evento OPEN per caricare le immagini, al posto di LOAD, sempre a memoria, funziona sempre e dovrebbe andare.

    ma se devo caricare (come nel mio caso) da un campo dell'origine dati non va se è nell'open

    10/07/2024 - @Alex ha scritto:


    Oppure ancora più semplice, metti nella proprietà Picture la funzione

    cosa intendi? tipo che invece di caricare dal campo come ora, cioè così

    Private Sub Report_Load()
    	me.miaPic.picture = me!nomeCampo
    End Sub

    carico con una funzione tipo così?

    Private Sub Report_Open(Cancel As Integer)
    
    	me.miaPic.picture = dlookup("nomeCampo","nomeQuery","filtro")
    End Sub
    

    ah forse intendi proprio nella proprietà dell'oggetto … però non dovrebbe differire dal farlo nell'open come ho scritto qui sopra…  o si?
    Attendo tue indicazioni maestro :D

  • Re: Stampa diretta di report

    Se piazzi il controllo immagine, e nella proprietà “Origine Controllo” scrivi così come la metto con l'UGUALE davanti:

    = miaFunzione(Me!PATH_FirmaMED)
    oppure
    = dlookup("nomeCampo","nomeQuery","filtro")

    Senza alcun codice si carica l'immagine.

  • Re: Stampa diretta di report

    Ok grazie Alex, rimane che l'evento LOAD che ho sempre usato viene completamente bypassato se stampo direttamente col metodo che usa acViewNormal … e io lo scopro solo ora … e tra le altr enon ne capisco il senso.

  • Re: Stampa diretta di report

    Non capisco tuttavia perchè dici che l'Evento OPEN non va bene…? 

    Ho creato questa funzione Public in un Modulo:

    Function xImage()
        xImage = CurrentProject.Path & "\MiaImmagine.bmp"
    End Function

    Ho usato OPEN in questo modo:

    Private Sub Report_Open(Cancel As Integer)
        Me.ImmagineProva.Picture = xImage()
    End Sub

    Chiamo l'apertura del Report da una Form nei 2 modi che hai citato:

    Private Sub ComandoPreview_Click()
    	DoCmd.OpenReport "MioReport", acViewPreview
    End Sub
    
    Private Sub ComandoNormal_Click()
    	DoCmd.OpenReport "MioReport", acViewNormal
    End Sub

    Il Report carica sempre l'immagine in entrambi i casi e l'evento OPEN viene rilevato in entrambe le modalità.

    Cosa sbaglio per seguire il tuo ragionamento…?

    P.S. L'evento LOAD nei Report è stato implementato se non ricordo male, ma ne sono abbastanza certo, solo dalla versione 2007, prima non c'è mai stato.

    Cito la Guida, sostanzialmente evidenzia che i 2 eventi si equivalgono a parte la possibilità di Open di essere annullato:

    If you are trying to decide whether to use the Open or Load event for your macro or event procedure, 
    one significant difference is that the Open event can be canceled, 
    but the Load event cannot. For example, if you are dynamically building a record source for a report in an event procedure 
    for the report's Open event, you can cancel opening the report if there are no records to display.

    P.S. Ho compreso forse nel tuo caso la costruzione del percorso viene fatta con un Valore recuperato da un dato appartenente al RecordSource dei dati, quindi probabilmente su OPEN non è valorizzato.

    In questo caso devi usare il mio suggerimento precedente

  • Re: Stampa diretta di report

    Si, è come dici alla fine, carico cose nei controlli che arrivano dal recordset.

    Ho fatto prove e ho visto che in realtà le differenze tra acViewNormal e acViewPreview sono proprio solo (almeno per quel che ho testato) sull'evento LOAD e la cosa interessante (per il mio “problema”) è che altri eventi, tipo Corpo_Print e Corpo_Format, funzionano regolarmente e “leggono” i campi che arrivano dal recordset per cui sposterò in quelle “sezioni” alcuni pezzi di codice così non ho bisogno di ricorrere a funzioni tipo lookup che rallenterebbero (del resto il dato è già caricato nel recordset, la lookup sarebbe un doppione findamentalmente)

    Sbaglio? 

    In caso non abbia detto fesserie … capisco ancora meno il LOAD, o quantomeno perchè venga bypassato se in acViewNormal … ma me ne farò una ragione.

    Se non ci sono altre cose ti ringrazio Alex. alla prossima

  • Re: Stampa diretta di report

    Si direi che la logica è quella giusta io uso sempre e solo OPEN e Format della sezione specifica anche in caso di raggruppamenti.

    Anche la Formattazione Condizionale con i Report non ha senso, proprio perché usando evento Format si fa tutto ed è molto più leggero.

    Fai solo attenzione a come apri il report in modalita LAYOUT, classica invenzione inutile di MS, non esegue gli eventi Format… quindi non farti ingannare apri sempre in Preview se vuoi vedere il risultato finale.

  • Re: Stampa diretta di report

    Si d'ora in avanti userò anche io solo l'open e format della sezione specifica … solo dopo tutti questi anni di sviluppo scopro sta cosa dell'OPEN … sono un pò incredulo sinceramente.

    Si formattazione condizionale sempre fatta da codice come te.

    Modalità LAYOUT ?!? si usa? mi sa che la uso solo per aggiungere “pagine” per gli oggetti “controllo di spostamento”
    e cmq all'utente finale non la si dà mai 

    Grazie Alex! (c'e sempre da imparare)    

Devi accedere o registrarti per scrivere nel forum
11 risposte