Come impostare una maschera di input di Access con il VBA
Impariamo ad impostare e personalizzare una maschera di input di Access con il VBA Visual Basic for Application.
Per l’esempio che segue, si passi al database Libri.
Aprire il database e lasciar partire l’applicazione, registrarsi (la password per tutti gli account protetti è “password”), fare clic sul pulsante Ordini (o Orders) nella maschera del pannello di controllo principale e quindi fare clic su uno dei pulsanti di esame degli ordini (il pulsante 2 o il 3 ) nella finestra di dialogo Opzioni ordini.
Per ogni cliente è caricato almeno un ordine “aperto” (non stampato), che si può modificare se si è registrati col nome di quel cliente.
Come probabilmente si sa già, le principali società che emettono carte di credito usano schemi numerici e cifre diverse per i numeri delle loro carte di credito.
Se si lavora su una maschera di immissione dati nella quale c’è un campo per il numero della carta di credito, sarebbe carino avere in quel campo una maschera di input che aiuti a immettere il numero correttamente.
Se qualcuno si è mai chiesto perché gli chiedono che tipo di carta di credito vuole utilizzare quando fa un ordine al telefono, ciò potrebbe essere dovuto al fatto che il venditore si serve di un’applicazione dotata di un meccanismo di accoppiamento dello schema numerico come quello che stiamo per esaminare.
Per vedere come questo funziona, scegliereCash come metodo di pagamento per l’ordine. Così facendo, il campo carta di credito viene nascosto. Scegliere poiVisa come metodo di pagamento. Fare clic nella casella di testo Carta credito #.
Lo schermo a questo punto dovrebbe presentarsi come nella figura 1 .
Portarsi sul campo Carta di credito col tasto Tab e si dovrebbe vedere una maschera di input formata da una serie di quattro gruppi di quattro spazi ciascuno, separati da trattini, che è lo schema di questo tipo di carta di credito.
Fare poi ancora clic sulla casella combinata Metodo pagam. e scegliere American Express.
Quando si passa col Tab sul campo Carta di credito e si comincia a scrivere, si vede lo schema di quattro-sei-cinque cifre che caratterizza quel tipo dicarta di credito, come si può osservare nella figura 2 .
Come si sarà capito, c’è una routine evento chegira nell’evento AfterUpdate della casella combinata PagaMediante (PayBy) della maschera frmOrders. Ecco qui il codice:
Private Sub PayBy_AfterUpdate()
' Scopre la casella CCNumber (Numero della carta di credito)
' e imposta la maschera di input sul metodo di pagamento
Select Case Me!PayBy
Case 1, 2
Me!CCNumber = Null
Me!CCNumber.Visible = False
Case 3
Me!CCNumber.Visible = True
Me!CCNumber.InputMask = "0000\-000000\-00000;0;_"
Case Else
Me!CCNumber.Visible = True
Me!CCNumber.InputMask = "0000\-0000\-0000\-0000;0;_"
End Select
End Sub
Come si può vedere, se il metodo di pagamento è Cash (contanti) o Check (assegno), che hanno i codici i e 2, la routine cancella il numero della carta di credito e nasconde la relativa casella di testo.
Se PayBy è 3 (American Express), la routine controlla che il campo CCNumer sia visibile e imposta la sua proprietà InputMask (Maschera di input) sullo schema particolare di quella carta di credito.
In tutti gli altri casi (Case Else), la proprietà Maschera di input viene impostata sul più comune schema 4-4-4-4.
Se si dà un’occhiata alla routine dell’evento Current della maschera, si vedrà anche il codice per nascondere o scoprire la casella di testo CCNumber, in base a quello che c’è in PayBy, quando ci si sposta da un ordine all’altro.
Gestire l’evento “NoninElenco”
In quasi tutte le maschere per l’immissione di dati che si andranno a costruire, si dovrà fornire un sistema che consenta all’utente di impostare la chiave esterna del record modificato sul lato “molti” di una relazione in modo che punti allato “uno” corretto del record: per esempio, per impostare I’IDCliente in una tabella Ordini o l’IDAutore nella tabella di collegamento Libri-Autori.
Nel database Libri, la maschera frmOrders costringe a creare nuovi ordini per il cliente attualmente registrato impostando il valorepredefinito dell’IDCliente di tblLibri.
(Si può trovare una routine evento NonlnElenco per la casella combinata IDCliente in frmOrders, ma questa non ha effetto perché l’evento PrimaDiAggiornare costringe a usare soltanto l’IDCliente corrente.)
Supponiamo di essere uno degli amministratori dei dati per l'applicazione Libri.
Abbiamo bisogno di aggiungere un autore per un libro, ma l’autore non è ancora nel database.
Non vorremmo scoprirlo mentre stiamo modificando le informazioni sui libri, essere quindi costretti a interrompere quello che stiamo facendo, aggiungere un record per l’autore e poi tornare alla maschera dei libri per rimettere dentro ancora una volta i dati corretti.
Sarebbe un’ottima cosa poter aggiungere il record dell’autore senza dover sospendere quello che stiamo facendo sulla maschera dei libri.
Per vedere come questo funziona aprire la finestra Debug (premere Ctrl-G) e impostare la variabile globale gintIsAdmin su True.
Questoflag dà l’autorizzazione a modificare informazioni su libri e autori nel database usando le maschere campione.
Aprire poi la maschera frmBooks facendo clic sul pulsante Libri nel pannello comandi principale e poi ancora clic sul pulsante Modifica tutti nella finestra di dialogo Seleziona libri.
(Oppure, più semplicemente, aprire frmBooks dalla finestra Database.) Fare clic sulla scheda Autori nella maschera per vedere gli autori definiti per qualunque libro.
Abbiamo usato la finestra di dialogo Cerca libri per trovare il libro che volevamo, poi abbiamo fatto clic sulla scheda Autori e cominciato a scrivere il nome di Fjermedal, Antony su un nuovo record nella sottomaschera, come si vede nella figura 3.
Quando col tasto Tab si esce dal campo Autore, ciò che era stato digitato nella casella combinata non era nell’elenco dei record restituiti dall’origine dei record di questa casella.
La routine evento NotlnList (NonInElenco), definita per questacasella combinata, come prima cosa conferma che si voglia davvero definire un nuovo autore, (potrebbe essere stato scritto in modo sbagliato il nome di un autore esistente).
Se si fa clic su Sì (figura 4) per confermare che si vuole davvero aggiungere questo autore, la routine evento apre la maschera frmAuthorAdd in modalità Dialogo, per consentire di immettere i nuovi dati, come si vede nella figura 5.
L’apertura di una maschera in modalità Dialogo forza l’utente a rispondere prima che l’applicazione riprenda l’esecuzione.
Si può vedere che il nome dell’autore che è stato immesso è già stato scomposto, separando il nome dal cognome, e sono stati inseriti valori predefiniti per quei campi.
Si può ancora cambiare idea a questo punto, in modo che i dati non vengano materialmente immessi nel nuovo record: questo richiederebbe un nuovo IDAutore nella chiave primaria di tipo Contatore della tabella tblAutori.
Per vedere il funzionamento di tutto questo, aprire la maschera fsubBookAuthors in visualizzazione Struttura, fare clic sulla casella combinata AuthorlD, trovare l’evento Su non in elenco nellafinestra Proprietà (figura 6) e fare clic sul pulsante Genera per aprire il codice, che è riportato di seguito.
Private Sub AuthorID_NotInList(NewData As String, Response As Integer)
Dim strAuth As String, strLast As String, strFirst As String, intComma As Integer Dim intReturn As Integer, varName As Variant
strAuth = NewData
intComma = InStr(strAuth, ",")
If intComma = 0 Then
strLast = strAuth
Else
strLast = Left(strAuth, intComma - 1)
strFirst = Mid(strAuth, intComma + 2)
End If
intReturn = MsgBox("L'autore " & strAuth & _
" non è presente nel database. Vuoi aggiungerlo ora?", _
vbQuestion + vbYesNo, "Libri")
If intReturn = vbYes Then
DoCmd.OpenForm FormName:="frmAuthorAdd", _
DataMode:=acAdd, WindowMode:=acDialog, OpenArgs:=strAuth
If IsNull(DLookup("AuthorID", "tblAuthors", "[LastName] = """ & strLast & """")) Then
Response = acDataErrContinue
Else
Response = acDataErrAdded
End If
Exit Sub
End If
Response = acDataErrDisplay
End Sub
Come si può vedere, Access passa due parametri all’evento NotlnList.
Il primo parametro (NewData) contiene la stringa che è stata digitata nella casella combinata. Si può impostare il valore del secondo parametro (Response) prima di uscire dalla routine evento per dire ad Access che cosa si vuole fare.
Questi sono parametri non accessibili da una macro, per cui si può vedere che questo evento esige una routine VBA per essere gestito correttamente.
La routine come prima cosa utilizza la funzione incorporata InStr per cercare una virgola nella stringa che è stata digitata.
Se trova una virgola, suppone che quanto è stato digitato a sinistra della virgola sia il cognome dell’autore e tutto ciò che sta a destra sia il nome.
Successivamente la routine ricorre alla funzione MsgBox per chiedere se si vuole aggiungere questo autore al database.
Chi ha consultato nella Guida in linea la documentazione sulla funzione MsgBox saprà che il secondo parametro è un numero, ottenuto sommando tutte le opzioni che si desiderano.
Fortunatamente, il VBA mette a disposizione per queste opzioni costanti individuate da nomi, per cui non occorre ricordare a memoria i codici numerici.
In questo caso, la routine chiede che vengano visualizzati l’icona punto interrogativo e i pulsanti Sì e No.
Se si risponde Sì alla finestra messaggio, la routine apre la maschera frmAuthorAdd in modalità Dialogo e le passa il nome che era stato immesso nella proprietà OpenArg della maschera.
Si osservi il ricorso alla sintassi con parametri denominati nella chiamata a DoCmd.OpenForm, per agevolare l’immissione dei parametri voluti.
La maschera deve essere aperta in modalità Dialogo, in caso contrario il codice continuerà a girare mentre la maschera è aperta.
Tutte le volte che una maschera con caratteristiche di finestra di dialogo viene aperta, l’esecuzione del codice VBA si arresta fino a quando la finestra di dialogo non viene chiusa, il che è di importanza critica in questo caso, perché è necessario che il record venga salvato prima di poter procedere con altre verfiche.
Dopo la chiusura della maschera frmAuthorAdd, l’enunciato successivo chiama la funzione DLookup per verificare che l’autore sia stato davvero aggiunto al database. In questo esempio, la verifica non è molto specifica, perché controlla soltanto il cognome dell’autore.
Questo dovrebbe funzionare anche se l’aggiunta di Michael Viescas viene annullata perché un autore di cognome Viescas è già nel database, quindi la routine imposta la risposta per indicare che ritiene che il record mancante sia stato aggiunto.
Access riesegue la query per la casella combinata e tenta un nuovo accoppiamento. Questo non riuscirà se noi non abbiamo davvero salvato una riga corrispondente per Michael.
Se Access non trova l’accoppiamento, l’impostazione di Response su acDataErrContinue evita un ulteriore messaggio di errore Access.
Infine, se si risponde No nella casella messaggio, la routine imposta Response su acDataErrDisplay per dire ad Access di visualizzare il suo normale messaggio d’errore.
Apriamo ora la maschera frmAuthorAdd in visualizzazione struttura quindi visualizziamo il codice corrispondente all'evento Load (Caricamento) della maschera.
Il codice è il seguente:
Private Sub Form_Load() Dim
strAuth As String, intComma As Integer
' Controlla se c'è un argomento di apertura: se non c'è esce
If IsNothing(Me.OpenArgs) Then Exit Sub
' Scompone le parti del nome e del cognome e imposta
' i valori predefiniti per una nuova riga
strAuth = Me.OpenArgs
intComma = InStr(strAuth, ",")
If intComma = 0 Then
Me![LastName].DefaultValue = """" & strAuth & """"
Else
Me![LastName].DefaultValue = """" & Left(strAuth, intComma - 1) & """"
Me![FirstName].DefaultValue = """" & Mid(strAuth, intComma + 2) & """"
End If
End Sub
Come si ricorderà, la routineevento NotlnList per AuthorlD passa come parametro OpenArg al metodo OpenForm lastringa immessa all’inizio.
Questo fa aprire la proprietà OpenArgs della maschera. La routine Form_Load controlla quella proprietà e scompone di nuovo i campi nome e cognome usandoli poi per impostare la proprietà DefaultValue (Valore predefinito) delle opportune caselle di testo.
Potrebbe, più semplicemente, impostare direttamente i valori dei campi, ma ciò porterebbe Access a creare un nuovo record e a consumare un altro valore Contatore in AuthorlD, persino se l’utente annullasse immediatamente il nuovo record. Si osservi che non si può impostare meramente la proprietà DefaultValue sul valore della stringa.
Questa proprietà è una stringa, ma Access tratta i valori delle proprietà come espressioni da valutare. Se si imposta Me!(Cognome].DefaultValue = “Viescas”, Access cerca un comando o una routine sub chiamata Viescas.
Non ce ne sono e quindi si finisce per ritrovarsi la segnalazione di errore #Nome nella casella di testo. Il codice aggiunge le virgolette doppie intorno al nome, quindi Access vede un’espressione stringa nella proprietà (“Viescas” invece di Viescas) e restituisce un valore corretto.
Esempi di accesso ai dati con VBA Microsoft Access
Tutorials su Microsoft Access
Dr.Maurizio Cucchiara
autore del corso:
"Corso Base di Microsoft Access"
disponibile on line su questo sito
MC2 E-Learning S.a r.l.
Formazione per il Web
http://www.mc2.it/html/access.html
Cerca sul web con Google:
Ricerca personalizzata
