Sei sulla pagina 1di 6

Access 2000 – Corso Avanzato Lezione 35

35 Esercizi di riepilogo

Per stampare i record che abbiamo estratto nella nostra maschera dovremo fare una serie di
operazioni: modificare la maschera della rubrica, creare una query, creare un report basato su questa
(continua 2)

query, modificare le proprietà del pulsante sulla maschera scrivere alcune righe di codice VBA (vi
ricordate che avevo detto che molte azioni possono essere svolte tramite macro, ma purtroppo non
tutte), modificare la macro e, da non trascurare, testare il tutto.

Iniziamo quindi col modificare la maschera.

Sappiamo che la macro,sulla pressione degli interruttori non fa altro che andare a modificare l’SQL
della query sulla quale si appoggia la maschera, viene cioè modificata una proprietà (filtro) di questa
nella sezione “dati” delle proprietà. È possibile reperire, tramite codice VBA questa proprietà. Una
delle soluzioni è quella di andare a scrivere questo dato in una casella di testo (txtCriteri) sulla
maschera. Successivamente creeremo la query che avrà come criterio il valore di questo oggetto
cosicché verranno estratti solo i record visualizzati .
Si presentano però alcuni problemi:

1. la proprietà “filter” della maschera conterrà la stringa intera che la macro utilizza
[ragsoc] Like "[AÀÁÂÃÄ]*"
dobbiamo prendere solo una parte della stringa
2. in caso venga premuto il tasto “Tutti”, il campo di memorizzazione dei criteri deve essere
svuotato
3. in caso la scelta di una lettera non produca risultati, dopo il messaggio di avvertimento, il
campo di memorizzazione deve essere svuotato

Per risolvere il primo problema, nel momento in cui reperiremo il valore della maschera, opereremo
sulla stringa con la funzione MID(). Per chi non la conoscesse questa funzione, assieme alle
funzioni Left() e Right() si occupa di restituire una parte della stringa a nostra scelta e più
precisamente:

Funzione Sintassi Descrizione


LEFT() Left([stringa],lungh) Stringa: stringa di caratteri che verranno restituiti a
partire dall’estrema sinistra
Lungh: espressione numerica che indica quanti caratteri
devono essere restituiti.
RIGHT() Left([stringa],lungh) Stringa: stringa di caratteri che verranno restituiti a
partire dall’estrema destra
Lungh: espressione numerica che indica quanti caratteri
Claudio Russo - Manuali.Net © 2004 Tutti i diritti riservati 1
Access 2000 – Corso Avanzato Lezione 35

devono essere restituiti.


MID() Mid([stringa],lungh1,lungh2) Stringa: stringa di caratteri che verranno restituiti
Lungh1: : Posizione di un carattere in Stringa dalla
quale inizia la parte che deve essere prelevata
Lungh2: Numero di caratteri da restituire (se omessa
vengono restituiti tutti i caratteri da Lungh1 fino alla
fine della stringa)

Per gli altri due problemi agiremo sempre sulla maschera creando una casella di controllo (chkTutti)
che andremo sempre a impostare a “falso” all’apertura della macro e che andremo a modificare
quando premeremo il tasto Tutti e quando non ci saranno record che soddisfano i criteri.

Ecco il risultato

Non è necessario mettere etichette agli oggetti appena creati, infatti, una volta testato il
funzionamento delle procedure, non dovranno essere visibili, e ne andremo a modificare le proprietà
in modo da nasconderli.

Riapriamo la macro, dopo aver salvato e chiuso la maschera, e apportiamo le seguenti modifiche:

1. inseriamo una riga prima del primo test sulla lettera “A”
2. nelle azioni selezioniamo “ImpostaValore”
3. in basso a sinistra scriviamo negli elementi il nome del chkTutti e nell’espressione mettiamo
“falso”
4. inseriamo una riga sotto l’ultimo test degli interruttori ([FiltriNomeSocieta]=27)
5. nelle condizioni mettiamo i punti di sospensione (…) cosicché l’azione verrà eseguita solo
se il test sarà positivo, e nell’azione scegliamo “ImpostaValore”, nell’elemento mettiamo
chkTutti e nell’espressione “vero”
6. sotto il primo controllo sul numero di record estratti ([CurrentRecord]>0) inseriamo una riga
con i soliti puntini nelle condizioni e nelle azioni scegliamo “EseguiCodice”.
7. Scriviamo in basso a sinistra Criteri()
8. come ultima riga inseriamo, sotto all’ImpostaValore un'altra azione uguale, solo che
mettiamo nello spazio riservato all’elemento la casella di testo [txtCriteri] e nell’espressione
i doppi apici.

Spiegazione:
Punto 3: ogni volta che verrà eseguita la macro la casella di controllo verrà impostata su falso
Punto 5: se viene selezionato il pulsante Tutti, la casella di controllo verrà impostata a vero, cosa
che poi testeremo in fase di esecuzione del codice VBA per decidere se eseguire un MID() sulla
stringa dei criteri

Claudio Russo - Manuali.Net © 2004 Tutti i diritti riservati 2


Access 2000 – Corso Avanzato Lezione 35

Punto 6: Se viene contato almeno un record, allora verrà eseguita una procedura evento che
eseguirà, come spiegherò meglio dopo, una selezione sulla stringa solo se la casella di controllo
posta sulla maschera risulterà impostata a “vero”
Punto 8: Se non ci sono record che soddisfano la richiesta, verrà in automatico selezionato
l’interruttore “tutti” e verrà svuotata la casella di testo che conteneva la stringa con i criteri
dell’ultima estrazione utile e che ha restituito dei risultati.

A questo punto dobbiamo ancora una volta intervenire nel codice VBA. Entrate nella sezione
“Moduli” nella finestra del Database e premete il pulsante nuovo.

Sotto la scritta “Option Compare Database” inserite il seguente codice, in seguito lo


commenteremo.

Public Function criteri()


Dim criteri_full As String
Dim criteri_short As String
If Forms!frmelenco_telefonico_clienti!chkTutti = False Then
criteri_full = Forms!frmelenco_telefonico_clienti.Filter
criteri_short = Mid([criteri_full], 10)
Forms!frmelenco_telefonico_clienti!txtCriteri = criteri_short
End If
End Function

Salvate dando ok alla domanda se volete salvare gli altri oggetti del database elencati e date un
nome significativo alla vostra Routine (per esempio “basCriteri”).

Spiegazione
La procedura da voi creata controlla il valore della casella di controllo sulla maschera della rubrica
(True o False); se il valore corrisponde a false, quindi se il controllo risulta non selezionato, allora,
dopo aver fatto una serie di passaggi di variabili per estrarre la proprietà Filter della maschera e
prendere una parte della stringa, scrive il valore del filtro nella casella di testo txtCriteri sulla
maschera.

Fate un po’ di prove e se tutto funziona, andate in struttura della maschera e modificate il valore
“Visibile” sia della casella di testo sia della casella di controllo.

La creazione del report non è proprio semplicissima, infatti non possiamo semplicemente creare una
query parametrica come quelle spiegate in precedenza, ma dobbiamo passare noi alla query i criteri
per l’esecuzione andando recuperare il valore della casella di testo nascosta. Questa operazione la si
può eseguire solo tramite codice VBA.

Iniziamo comunque a replicare la query che origina il contenuto della maschera e ne andiamo ad
aggiungere alcuni campi, come per esempio il nome del referente, il telefono diretto, l’indirizzo
email e tutto ciò che ci può essere utile in fase di stampa. (ricordatevi comunque di mantenere il
Join esterno, ci servono comunque anche tutte le società che non hanno contatti).

Claudio Russo - Manuali.Net © 2004 Tutti i diritti riservati 3


Access 2000 – Corso Avanzato Lezione 35

Salvatela con il nome “qrySocieta_Contatti_rpt”.

Creiamo ora un report basato su questa query facendo inoltre un raggruppamento per ragione sociale
ordinandoli per lo stesso campo.
Per velocizzare le operazioni di creazione utilizzeremo l’autocomposizione:
1. scegliere nuovo report, autocomposizione e, dalla casella combinata trovare la query
qrySocieta_Contatti_rpt

2. dopo aver dato l’OK trasportiamo a destra tutti i campi che vogliamo vengano visualizzati
nella nostra pagina

Claudio Russo - Manuali.Net © 2004 Tutti i diritti riservati 4


Access 2000 – Corso Avanzato Lezione 35

3. Effettuiamo un raggruppamento per IDCliente


4. Ordiniamo per ragione sociale e per cognome
5. Lasciamo il Layout come ci viene proposto invertendo però l’orientamento del foglio da
verticale a orizzontale.
6. scegliamolo stile che più ci piace e scegliamo sulla pagina successiva di entrare in modifica
struttura in modo da rifinire il layout finale.

Per dividere le società tra loro aggiungere una riga nell’”intestazione IDCliente” prima dei campi.

Dopo aver provato a visualizzare la pagina in anteprima di stampa salvare il report col nome
“rptElenco_Telefonico” e chiuderlo.

Entrate in struttura della maschera e selezionando il pulsante “stampa” scegliete la sezione eventi
delle proprietà. Selezionando la riga “su clic” premete sul pulsante raffigurante i puntini di
sospensione e scegliete “generatore codice”

Claudio Russo - Manuali.Net © 2004 Tutti i diritti riservati 5


Access 2000 – Corso Avanzato Lezione 35

Scrivete il seguente codice che, come prima, commenteremo

Private Sub cmdStampa_Click()

criterio = "[ragsoc] " & Me!txtCriteri


DoCmd.OpenReport "rptElenco_Telefonico", acViewPreview, , criterio

End Sub

Spiegazione:
?? viene assegnata una variabile (chiamata “criterio”)al contenuto della casella di testo nascosta
che raccoglie il filtro della maschera.
?? Viene comandato ad Access di aprire il report che si chiama “rptElenco_Telefonico” in
modalità anteprima di stampa con la particolarità che dovrà usare un filtro dato dalla
variabile “criterio”

Salvare il tutto e chiudere la finestra VBA e la maschera dopo averla salvata.


Fare alcuni test e controllare la correttezza dei dati.

Claudio Russo - Manuali.Net © 2004 Tutti i diritti riservati 6