5. Report

5.1   Cambiare la stampante o le impostazioni stampante/pagina 5.10 Ordinamento dell'origine dati ignorato
5.2   Le linee nere non vengono stampate 5.11 Finestra di Ordinamento e Raggruppamento scomparsa
5.3   Ogni riga pari in grigio 5.12 Pagine vuote involontarie
5.4   Aprire un report con un fattore di zoom 5.13 Solo 999 pagine e/o copie in A97
5.5   Testo verticale 5.14 Evitare le righe vuote in stampa
5.6   Esportare con formattazione 5.15 Fare espandere le linee verticali
5.7   Sub-totali e Riporti 5.16 Numero e/o somma incrementale nei report
5.8   Evitare la stampa in assenza di dati 5.17 Stampare un report in PDF
5.9   Stampare solo il record corrente 5.18 Campo memo troncato dopo 255 caratteri
   
5.1 Cambiare la stampante o le impostazioni stampante/pagina
http://www.donkarl.com/it?FAQ5.1 aggiornato 2010-03-29

Problema

In un MDB/MDE vuoi cambiare la stampante e/o qualunque delle impostazioni per un processo di stampa in maniera dinamica, a run-time.

Soluzione

Da AX vi è l'oggetto Printer e l'insieme Printer (vedi <F1> in VBA). Usandoli diviene più facile cambiare la stampante corrente di un certo report. P. e.:

DoCmd.OpenReport "MioReport", acViewPreview, , , acHidden
Reports!MioReport.Printer = Application.Printers("NomeDiAltraStampante")


Questa assegnazione di una stampante non sarà salvata ma è soltanto valida per il corrente processo di stampa.
In maniera similare funziona per la maggior parte delle impostazioni di stampa:
http://support.microsoft.com/?kbid=284286

Un altro metodo è cambiare la stampante predefinita:
'*********** INIZIO CODICE ************
'salva la stampante originale predefinita in una variabile
Dim strPrinterOld As String
strPrinterOld = Application.Printer.DeviceName

'cambia la stampante predefinita di Access
Application.Printer = Application.Printers("NomeDiAltraStampante")

'qui puoi fare delle splendide stampe

'alla fine resettare alla stampante predefinita originale
Application.Printer = Application.Printers(strPrinterOld)
'************ FINE CODICE *************

Se vuoi avere in una casella combinata (p.e. "cbo_Stampanti") tutte le stampanti disponibili devi soltanto impostare la proprietà Tipo origine riga a Elenco valori ed utilizzare il seguente codice nell'evento Su apertura della maschera o nell'evento Su Invio della casella combinata.

Dim prtloop As Printer
Me!cbo_Stampanti.RowSource = ""
For Each prtloop In Application.Printers
Me!cbo_Stampanti.AddItem prtloop.DeviceName
Next prtloop


Qui trovi alcune informazioni per le versioni precedenti di Access che non hanno l'oggetto Printer:

Fino ad A00 devi utilizzare delle scappatoie o complicate API o le proprietà PrtMip e PrtDevMode. (vedi <F1>)

Puoi aprire il report in anteprima stampa e poi richiamare la finestra di dialogo stampa per l'utente:

DoCmd.OpenReport "MioReport", acViewPreview
RunCommand acCmdPrint


Se vuoi soltanto utilizzare differenti cassetti di alimentazione della carta o altre impostazioni di una stampante, puoi installare più di una volta la stampante per Windows e impostare individualmente le differenti proprietà come altro cassetto etc. Poi nel report utilizzi la stampante con il cassetto desiderato. Eventualmente anche più copie del report con relative stampanti (cassetti).

Qui vi è un esempio per cambiare il cassetto in modo programmatico:
http://support.microsoft.com/?kbid=200546

Altrimenti hai bisogno di un codice complesso per cambiare la stampante. Alle seguenti pagine puoi trovare esempi:
http://www.groupacg.com
http://www.mcwtech.com/downloads.aspx

in alto

5.2 Le linee nere non vengono stampate
http://www.donkarl.com/it?FAQ5.2

Problema

Vedi in anteprima di stampa le linee nere, ma in alcune stampanti esse non vengono stampate.

Causa

Secondo MS l'errore può accadere se il formato dello spooler della stampante è impostato a RAW.

Soluzione

Se vuoi assolutamente le linee nere allora cambia l'impostazione dello spooler in EMF. Altrimenti modifica il colore della linea, p. e., a grigio scuro o blu scuro.

Vedi anche http://support.microsoft.com/?kbid=164254

in alto

5.3 Ogni riga pari in grigio
http://www.donkarl.com/it?FAQ5.3 aggiornato 2007-07-26

Problema

Vuoi impostare a grigio (o altro colore) il colore di sfondo di ogni record pari in un report, per ottenere un disegno strutturale.

Soluzione

Utilizza il seguente codice nell'evento Su stampa della sezione corpo (suggerimento modificato da Mike Küster):

If Me.Section(acDetail).BackColor = 16777215 Then 'bianco
  Me.Section(acDetail).BackColor = 12632256 'grigio
Else
  Me.Section(acDetail).BackColor = 16777215
End If


Suggerimento di Götz Müller:
In caso di un numero dispari di record, l'anteprima e la stampa differiscono (i colori sono invertiti). Il rimedio, se ciò da' fastidio, è quello di aggiungere alla precedente procedura il seguente codice nell'evento Su pagina del report:
Me.Section(acDetail).BackColor = 16777215

Suggerimento di Karl-Heinz Signus, una singola riga e facilmente variabile:
Me.Section(acDetail).BackColor = IIf(CurrentRecord Mod 2 = 1, 12632256, 16777215)
'(ogni terza riga: ...Mod 3 = 1... ecc.)


Suggerimento di Thomas Pfoch:
Se utilizzi sottoreport osserverai che hanno uno sfondo colorato predefinito che ricopre i colori che imposti per le righe. Puoi aggiustarli con il seguente codice nell'evento Su stampa della sezione corpo del sottoreport:
Me.Section(acDetail).BackColor = Me.Parent.Section(acDetail).BackColor

Suggerimento di Arne Dieckmann:
Si puo anche utilizzare un numero incrementale (FAQ 5.16) e poi nell'evento Format della sezione corpo:

If Me!NoIncr Mod 2 = 1 Then
  Me.Section(acDetail).BackColor = 12632256
Else
  Me.Section(acDetail).BackColor = 16777215
End If


Questo soprattutto è utile per sempre impostare a grigio il primo record di un sottoreport, perché così non importa il colore dell'ultima sezione di un sottoreport precedente.

in alto

5.4 Aprire un report con un fattore di zoom
http://www.donkarl.com/it?FAQ5.4

Problema

Vuoi aprire un report in anteprima non con dimensione 100% (impostazione predefinita), ma con un particolare fattore di zoom come se potessi selezionarlo nella barra degli strumenti della finestra di anteprima.

Soluzione

Puoi impostare il fattore di zoom con VBA. Questo non puoi farlo nel report ma soltanto "dall'esterno", p. e., in una maschera con codice che apre il report. Per far ciò utilizza la costante corrispondente del metodo RunCommand dopo che hai aperto l'anteprima del report. P. e., per una dimensione del 50%:
DoCmd.OpenReport "MioReport", acViewPreview
RunCommand acCmdZoom50


Puoi trovare le altre costanti di RunCommand nell'help in linea al "Metodo RunCommand"-->"Costanti del metodo RunCommand". Lo schema è: acCmdZoomPercentuale
L'eccezione è la costante per "Fit", cioè regolata alla dimensione della finestra di anteprima. Quella costante è chiamata acCmdFitToWindow.

Un'alternativa al metodo RunCommand è la proprietà non documentata ZoomControl (suggerimento di Günther Ritter) che può essere usata per regolare la variabile del fattore zoom con una variabilità infinita. P. e., per uno zoom dell'80%:
DoCmd.OpenReport "MioReport", acViewPreview
Reports!MyReport.ZoomControl = 80


Come con tutte le caratteristiche non documentate, dovresti utilizzarla con qualche cautela. P.e., potrebbe non funzionare nelle versioni future. Finora, però, non ho udito alcun problema.

in alto

5.5 Testo verticale
http://www.donkarl.com/it?FAQ5.5

Problema

Vuoi ruotare e stampare un testo verticalmente o diagonalmente.

Soluzione

Nelle versioni >= A00 esiste la proprietà Verticale per le caselle di testo che permette di ruotare il testo di 90 gradi in senso orario.

Parecchi controlli ActiveX offrono maggiori possibilità:

Spinlbl.oxc di Andrew R. Miller che puoi trovare a
http://www.access-paradies.de/download/spinning_label.php  

Stephen Lebans ha alcune parti in maniera artigiana a
http://www.lebans.com/xrotatetext.htm

Esiste anche un controllo ActiveX di tipo commerciale chiamato Rotated Label Custom Control
http://www.mabry.com/rotext

in alto

5.6 Esportare con formattazione
http://www.donkarl.com/it?FAQ5.6 aggiornato 2007-01-03

Problema

Vuoi esportare un report (p. e., in Word, HTML, RTF). Facendo ciò, però, perdi tutta la grafica (linee, rettangoli etc..)

Soluzione

Sfortunatamente non esiste alcuna possibilità di esportare un report assieme a tutta la formattazione in modo che esso sia ancora pienamente modificabile.

Stephen Lebans ha dei tool, che almeno possono realizzare parzialmente questi desideri:
http://www.lebans.com/ReportUtilities.htm

Se vuoi soltanto visualizzare il risultato puoi utilizzare lo Snapshot Viewer di MS.
Esso è un controllo ActiveX che ti permette di visualizzare e stampare i report (senza la necessità di avere Access) con la loro completa formattazione. I report sono salvati nel formato proprietario Snapshot. L'ActiveX può anche essere incorporato come un oggetto, p. e., in Word.
Sito download del Snapshot Viewer

Un'altra possibilità è il formato PDF.

in alto

5.7 Sub-totali e Riporti
http://www.donkarl.com/it?FAQ5.7

Problema

In un report multipagina vuoi mostrare i Sub-totali e i Riporti.

Soluzione

Supponiamo di avere un controllo "Prezzo". Ad ogni pagina, in basso, vuoi mostrare il suo Sub-totale ed in cima, ad ogni pagina successiva, il corrispondente Riporto:

1. Nella sezione corpo creare un controllo "txtRunSum" con Origine controllo:
=[Prezzo]
Impostare la proprietà Somma parziale del controllo a Su tutto, la proprietà Visibile a No.

2. Nel piè di pagina creare un campo "txtSubTotal" con Origine controllo:
=[txtRunSum]

3. Nell'intestazione pagina creare un controllo non associato "txtRiporto".

4. Utilizzare il seguente codice nell'evento Su formattazione del Piè di pagina:
Me!txtRiporto = Me!txtSubTotal

5. Per evitare che sia mostrato un Riporto a 0 nella prima pagina, impostare la proprietà dell'Intestazione (pagina) del report Senza int. report. Ugualmente impostare la proprietà del Piè di pagina (pagina) Senza piè pag. report.

in alto

5.8 Evitare la stampa in assenza di dati
http://www.donkarl.com/it?FAQ5.8 aggiornato 2006-12-19

Problema

Se un report non contiene dati, non vuoi mostrarlo in anteprima di stampa o non vuoi stamparlo.

Soluzione

1. Variante

Se il report è aperto via codice (di solito in una maschera) puoi controllare prima dell'apertura/stampa se la sua origine dati è vuota. P. e.,

If Dcount("*", "OrigineDati_del_MioReport") > 0 Then
  DoCmd.OpenReport "MioReport"
Else
  MsgBox "Il report non contiene dati.", _
    vbInformation + vbOKOnly, "Nessun contenuto"
End If


2. Variante

Utilizza il seguente codice nell'evento Su report vuoto del report:

MsgBox "Il report non contiene dati.", _
  vbInformation + vbOKOnly, "Nessun contenuto"

Cancel = True


Se il report è aperto via codice, questo metodo, allora, incorre in un errore di run-time poichè l'azione OpenReport è stata annullata. Puoi intercettare l'errore in questo modo:

On Error GoTo ErrNoData

DoCmd.OpenReport "MioReport"

ErrNoData:
If Err.Number = 2501 Then Resume Next 'oppure Exit Sub

in alto

5.9 Stampare solo il record corrente
http://www.donkarl.com/it?FAQ5.9

Problema

Vuoi stampare soltanto il record corrente di una maschera. Quando, però, apri il corrispondente report, vengono restituiti tutti i record della maschera, cioè della tabella o query sottostante.

Soluzione

Utilizza una query come origine dati del report che ha, come criterio in una colonna che la identifica univocamente, un riferimento alla tua maschera. P. e.:

Forms!MiaMaschera!Id

Oppure

Se apri il report via VBA puoi direttamente dare il riferimento al record corrente nella maschera. P. e.,:

Per un campo numerico:
DoCmd.OpenReport "MioReport", , , "Id =" & Me!Id

Per un campo testo:
DoCmd.OpenReport "MioReport", , , "Azienda = " & Chr$(34) & Me!Azienda & Chr$(34)

Nello stesso modo puoi gestire il caso in cui non vuoi stampare proprio un singolo (corrente) record ma un gruppo di record che hanno un argomento in comune.

in alto

5.10 Ordinamento dell'origine dati ignorato
http://www.donkarl.com/it?FAQ5.10

Problema

L'origine dati del tuo report è una tabella o query che è ordinata secondo campi particolari. Comunque nel report questo ordinamento è ignorato.

Causa

I report utilizzano proprie query intermedie che solo incidentalmente possono mantenere l'ordinamento dell'origine dati. Così non puoi mai fare affidamento su esso.

Soluzione

Utilizza l'ordinamento e raggruppamento nel report. In visualizzazione Struttura del report puoi aprire la finestra di dialogo Ordinamento e raggruppamento con un pulsante nella Barra degli strumenti (appare come un razzo-vettore orientato a sinistra) o la voce di menu Visualizza/Ordinamento e raggruppamento.
Nella finestra di dialogo puoi definire l'ordinamento desiderato che ha sempre la priorità sopra qualunque delle impostazioni di ordinamento dell'origine dati.

in alto

5.11 Finestra di Ordinamento e Raggruppamento scomparsa
http://www.donkarl.com/it?FAQ5.11

Problema

In visualizzazione struttura di un report, il pulsante della barra degli strumenti per Ordinamento e raggruppamento è attivo (anche la voce di menù Visualizza/Ordinamento e raggruppamento), ma la finestra di dialogo dove puoi modificare le impostazioni non è visibile.

Causa

Il più delle volte ciò accade in A97, e dopo che è stata modificata la risoluzione dello schermo (p. e., quando copi il database su un portatile). Allora le impostazioni del registro, relative alla posizione della finestra, possono modificarsi in modo tale che essa non è più situata nell'area visibile dello schermo.

Soluzione

Apri il report in visualizzazione struttura.
Se il pulsante per Ordinamento e raggruppamento non è attivato fai click su di esso. Premi i tasti <ALT> + <SPAZIO>, poi <S>. Questo attiva Sposta nel menù della finestra fuori vista. Ora puoi usare i tasti freccia per muovere la finestra finché sia visibile nuovamente. Vai a tentativi.

Se questo non ti è d'aiuto, puoi cercare, dopo la seguente chiave di registro (per A97, altrimenti il numero della versione dopo "Office" sarà diverso):
HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Access\Settings\SGST

Uno dei cinque dati valore potrebbe essere negativo.
Modificali a positivi, p. e.: 1;1;1;1;1;

in alto

5.12 Pagine vuote involontarie
http://www.donkarl.com/it?FAQ5.12

Problema

Nell'anteprima e/o nella stampa di un report, ogni seconda pagina è vuota.

Causa

La larghezza delle pagine è eccessiva.

Soluzione

Riduci la larghezza totale del report. Essa è influenzata da:

- la larghezza del report (impostazioni della finestra delle proprietà)
- margine sinistro e destro della pagina (menu File/Impostazione pagina)
- lo spazio della colonna in caso di colonne multiple (menu File/Impostazione pagina)
- molti driver di stampante necessitano di margini addizionali e così si riduce la possibile ampiezza teorica.

in alto

5.13 Solo 999 pagine e/o copie in A97
http://www.donkarl.com/it?FAQ5.13

Problema

In A97 vuoi impostare un intervallo di stampa a 4 cifre o stampare 1000 o più copie di un report. Tuttavia nella finestra di dialogo Stampa i campi dell'Intervallo Stampa (Pagine - Da - A) e quello per il Numero di copie permettono solo 3 cifre, cioè un massimo di 999.

Causa

Il problema ha origine nella Service Release 2 (SR2) di Office 97. Nella versione originale di A97 potresti impostare quattro cifre, SR2 installa una nuova versione del font Tahoma di cui solo 3 cifre vanno nei campi di dialogo. Nelle versioni più recenti di Access il problema è risolto.

Soluzione

Puoi usare VBA, cioè il metodo PrintOut (vedi <F1>) per impostare valori più alti. Puoi anche utilizzare l'azione macro Stampa. Vedi la descrizione nella KB:
http://support.microsoft.com/?kbid=224158

Altro metodo è quello di reinstallare i file originali Tahoma dalla directory OS\Fonts di un CD di Office97 senza SR2.

in alto

5.14 Evitare le righe vuote in stampa
http://www.donkarl.com/it?FAQ5.14

Problema

In un report vi sono controlli che possono risultare vuoti. In questo caso vuoi eliminare le corrispondenti linee vuote e spostare verso l'alto le successive.

Soluzione

Imposta la proprietà Riducibile dei controlli e della sezione del report, dove gli stessi sono posizionati, a Sì. L'help online dice più cose circa queste proprietà, le loro possibilità, e restrizioni.

Se queste impostazioni non determinano il risultato che desideri, vi sono ulteriori soluzioni come, p. e., impostare l'altezza del controllo a 0,01 cm, e la proprietà Espandibile a .

Se vi sono delle etichette poste a fianco dei controlli, esse potrebbero rimanere visibili, e dare fastidio. Puoi evitare ciò, p. e., con il seguente codice inserito nell'evento Su formattazione della sezione:

Me!MiaEtichetta.Visible = Not IsNull(Me!MiaCasellaDiTesto)

in alto

5.15 Fare espandere le linee verticali
http://www.donkarl.com/it?FAQ5.15

Problema

In un report hai linee verticali tanto alte quanto l'intera altezza di una sezione. Comunque, se un altro controllo aumenta l'altezza e la sezione si espande con esso, le linee non possono, perché esse non hanno una proprietà Espandibile come gli altri controlli e la sezione.

Soluzione

Puoi disegnare linee espandibili utilizzando il metodo Line nel codice della procedura d'evento Su stampa della sezione. Nella KB si trova un esempio:
http://support.microsoft.com/?kbid=170838
Vi sono ulteriori informazioni circa il metodo Line nell'Help on-line (p. e., ottenere con i rettangoli effetti simili).

in alto

5.16 Numero e/o somma incrementale nei report
http://www.donkarl.com/it?FAQ5.16

Problema

In un report vuoi avere un controllo che mostri un numero o una somma incrementale.

Soluzione

Diversamente dalle query e dalle maschere i report hanno una corrispondente proprietà: Somma parziale, che facilita il portare a termine questo lavoro.

Numero incrementale

- creare un nuova casella di testo
- impostare la proprietà Origine controllo della casella di testo a
=1
- impostare la proprietà Somma parziale della casella di testo a Su tutto.

Somma incrementale

- creare un nuova casella di testo
- impostare la proprietà Origine controllo della casella di testo a
=[Nome_del_campo_che_vuoi_sommare]
- impostare la proprietà Somma parziale della casella di testo a Su tutto.

Puoi anche impostare la proprietà Somma parziale a Su gruppo per ottenere una somma per ciascun gruppo in un report raggruppato.

in alto

5.17 Stampare un report in PDF
http://www.donkarl.com/it?FAQ5.17 aggiornato 2013-09-20

Problema

Vuoi stampare un report in formato PDF (Portable Document Format di Adobe).

Soluzione

Partendo dalla versione 2007 Office supporta il formato PDF. Se in O07 non vedi il formato PDF nei dialoghi di esportazione, dovrai scaricare il relativo Add In dalla MS: http://www.microsoft.com/downloads/details.aspx?displaylang=it&FamilyID=f1fc413c-6d89-4f15-991b-63b07ba5f2e5
Office 2010 contiene il formato PDF a priori.
In quest'ultime versioni di Access si può anche effettuare l'esportazione e il salvataggio semplicemente da VBA assegnando un percorso di archivazione:

DoCmd.OutputTo acOutputReport, "MioReport", acFormatPDF, "c:\MioPercorso\MioNomeFile.pdf"

Nelle versioni prima di A07 la soluzione più semplice è il tool gratis di Stephen Lebans:
http://www.lebans.com/reporttopdf.htm
Si tratta di 2 DLL, che devi copiare nella cartella dell'applicazione o in Win/System32, e un modulo da importare nell'applicazione. Poi con una riga di codice VBA puoi creare un file PDF da un report, salvarlo in un qualsiasi percorso, mostrarlo in Acrobat Reader ecc. Così non è più necessario installare i driver della stampante ecc. come per le altre soluzioni.

In alternativa vi sono molti programmi che si vanno ad aggiungere all'elenco delle stampanti disponibili e creano un file PDF.

Potente e costoso è l'originale: Adobe Acrobat
vedi anche le istruzioni su: http://www.mvps.org/access/reports/rpt0011.htm

Un ampio insieme di funzionalità è offerto dal tool PDF and Mail Class Library for Access: http://www.groupacg.com

Più economici sono programmi come, p. e.

Pdf995+pdfEdit995: http://www.pdf995.com
dove puoi scrivere in un file .ini il percorso del file da salvare, la modalità multidocumento etc..

PDFMachine: http://www.pdfmachine.com/
dove il driver della stampante offre la possibilità di impostare il percorso del file da salvare

Win2PDF: http://www.win2pdf.com
dove si puo cambiare dinamicamente il percorso del file con la modificazione del Registry (SaveSetting)

PDFFactory: http://www.fineprint.com
PDFMailer: PDFFactory: http://www.gotomaxx.com/cgi-bin/gm/site.cgi?lan=us

Un'alternativa gratuita è PDFCreator: http://sector7g.wurzel6.de/pdfcreator/index_en.htm
che consente di scrivere in un INI il percorso del file da salvare

in alto

5.18 Campo memo troncato dopo 255 caratteri
http://www.donkarl.com/it?FAQ5.18 aggiornato 2010-03-29

Problema

Nel tuo report hai un campo memo che mostra solo i primi 255 caratteri, sebbene la proprietà Espandibile della casella di testo sia impostata a .

Soluzione

Il caso più frequente è che il report sia basato su una query in cui il campo memo sia già troncato. Nelle versioni >=A00 puoi raggruppare i campi memo nelle query. Comunque, in questo caso, coll'intento di una ottimizzazione interna della prestazione, Access riduce il campo memo alla lunghezza di un normale campo testo = 255 caratteri.
Un DISTINCT, cioè "Valori univoci", nella query ha lo stesso effetto di troncare il campo memo.

Così se il campo memo è raggruppato nella query (GROUP BY in SQL), allora devi sostituire o evitare questo raggruppamento sul campo memo. "Sostituire" significa che invece di Group by scegli una differente funzione, p.e. First. "Evitare" significa, p. e., che tu rimuovi il campo memo completamente dal risultato della query e crei una seconda query che contiene soltanto un campo chiave/collegamento e il campo memo. Successivamente combini le due query in un'altra che diventa l'origine record del report.

Anche nelle query union accade il troncamento. Il motivo è che UNION include un raggruppamento di valori identici. Pertanto, il più semplice rimedio è l'uso di UNION ALL, cioè mostrare anche duplicati. In questo modo il campo memo non viene troncato.

Un motivo diverso per il troncamento può essere che una formattazione del tipo "<" o ">" (= lettere minuscole o maiuscole) sia impostata per il campo memo. Vedi: http://support.microsoft.com/?id=259893

in alto