logo MC2 E-Learning S.a r.l.
Logo Einstein grigio sfumato
e = m x c al quadrato





Usare il controllo calendario di access con il VBA

Impariamo ad usare e a programmare il controllo personalizzato calendario di Access con il VBA







Se si apre la maschera frmContracts in visualizzazione Struttura, si vedranno pulsanti con una freccia rivolta verso il basso accanto sia al campo Start Date, sia al campo End Date.

Se si fa clic su uno di questi pulsanti, si visualizza un calendario grafico, come mostrato nella figura 1.

Questa visualizzazione fa parte del controllo Calendario personalizzato che viene distribuito insieme con Access. (Il controllo Calendario va installato espressamente usando il programma di installazione di Access.)

Se si apre la maschera frmContracts in visualizzazione Struttura, come si vede nella figura 2, si vedranno due controlli Calendario sovrapposti alla maschera, subito sotto ai campi Start Date ed End Date.

La proprietà Visibile di ciascun controllo è impostata su No.

Come si può immaginare, il controllo dietro all’interruttore con l’icona della freccia rivolta in giù è responsabile della visualizzazione del controllo Calendario.

Siccome l’area di visualizzazione che ho definito per entrambi i controlli Calendario è troppo piccola per visualizzare il titolo nel controllo a lato delle caselle a discesa Month e Year, ho impostato la proprietà TitleFontColor di entrambi i controlli su un grigio chiaro (come la proprietà BackColor) perché coincida con il colore di sfondo del controllo.

In questo modo si maschera realmente il titolo. Si può anche impostare su No la proprietà ShowTitle.

Per collocare un controllo calendario in una maschera, si può aprirla in visualizzazione Struttura e poi fare clic sul pulsante Altri controlli nella Casella degli strumenti.

Scegliere Controllo calendario 8.0 dall’elenco a comparsa.

I controlli personalizzati usano la tecnologia ActiveX, quindi è possibile acquistare altri controlli da vari fornitori di software, la Office 97 Developer Edilion contiene ulterioti controlli personalizzati utilizzablili nelle applicazioni.

Si può associare il controllo calendario ai dati nell’origine dei record della maschera. Quando si seleziona una nuova data sul calendario, il controllo aggioma il campo.

Tuttavia, vi sono parecchi punti importanti che occorre conoscere per lavorare con i controffi ActiveX e con i due controffi associati allo stesso campo.

• Quando in una maschera si ha più di un controllo associato a un campo nel recordset sottostante, è bene dare ai controlli nomi univoci, in modo che si possa far riferimento al campo e a ciascuno dei controlli in modo indipendente.

In questo caso, il campo BeginningDate è associato a una casella di testo chiamata txtBeginningDate e a un controllo calendario ActiveX chiamato acxCalBegin.

Analogamente, il campo EndingDate è associato a una casella di testo chiamata txtEndingDate e a un controllo calendario ActiveX chiamato acxCalEnd.

• Access genera le proprietà evento Su aggiornato, Su INVIO, Su uscita, Su attivato, Su disattivato nella finestra Proprietà pertutti i controlli ActiveX. Alcuni controlli, però, non supportano tutti questi eventi (per esempio, il controllo calendario ActiveX non supporta l’evento Su aggiornato).

• La maggior parte dei controlli ActiveX supporta ulteriori eventi utili quali ad esempio Prima di aggiornare e Dopo aggiornamento.

A parte leggersi bene la documentazione di ciascun controllo, l’unico modo per scoprire gli eventi supportati da un controllo è quello di aprire il modulo della maschera, scegliere il controllo ActiveX dalla lista Oggetto (se il controllo non ha routine evento questo genera la routine evento di default Updated) e quindi esaminare l’elenco disponibile degli eventi nella lista Routine.

• In alcuni casi, bisogna riferirsi alla proprietà Value dell’oggetto interno al controllo ActiveX per scoprirne il suo valore corrente. Come vediamo qui sotto, bisogna usare questa sintassi nell’evento BeforeUpdate del controllo calendario per trovare quale valore è stato appena scelto.

Se esaminiamo il codice associato alle caselle di testo txtBeginningDate e txtEndingDate, troveremo routine BeforeUpdate che chiamano una routine comune per convalidare il giorno della settimana che è stato scelto.

Se la stringa ContractDayTimes indica che il giorno iniziale è un mercoledì (si veda la routine ValDaysTimes nell’esempio precedente) si vuole essere certi che BeginningDate sia sempre un mercoledì.
Analogamente, il controllo calendario acxCalBegin ha una routine evento BeforeUpdate per chiamare la stessa funzione ValBegin, come indicato qui avanti.

Si ricordi che non si troverà la proprietà Prima di aggiornare (Before Update) nell’elenco delle proprietà di questo controllo.

Si può scegliere il controllo e poi scegliereBeforeUpdate nell’elenco Routine, oppure si può digitare l’enunciato Private Sub nel modulo della maschera esattamente come indicato qui per definire tale routine evento.

Si osservi che questo codice esamina la proprietà Value dell’oggetto interno al controllo calendario per individuare il valore da impostare.

Private Sub acxCalBegin_BeforeUpdate(Cancel As Integer)
    If Not ValBegin(Me!acxCalBegin.Object.Value) Then
        Cancel = True
    End If
End Sub

Se la nuova data di inizio o di fine è formalmente corretta, bisogna aggiungere un po’ di codice nell’evento AfterUpdate di entrambi icontrolli calendario perricalcolare il campo NumberOfWeeks.

Sarebbe anche simpatico chiudere automaticamente il calendario perché non serve averlo di traverso dopo aver scelto una nuova data.

Qui sotto c’è il codice AfterUpdate che se ne occupa per il controllo calendario acxCalBegin. Si osservi che a questo punto il controllo associato avrà aggiornato i campi sottostanti, per cui ci si può riferire direttamente ai nomi dei campi nel calcolo del nuovo numero di settimane.

Private Sub acxCalEnd_AfterUpdate()
    ' Move the focus off this control so we can hide it
    Me!txtEndingDate.SetFocus
   ' Close the calendar after picking a new valid date
    Me!acxCalEnd.Visible = False
    Me!tglEnd = False
   ' Calculate a new number of weeks
    If IsNothing(Me!BeginningDate) Or IsNothing(Me!EndingDate) Then Exit Sub
    Me!NumberOfWeeks = DateDiff("ww", Me!BeginningDate, Me!EndingDate) + 1
End Sub

Anche la routine evento Current della maschera chiude automaticamente entrambi i controffi calendario quando si passa a un nuovo record.

Infine, c’è una routine Click per ciascuno degli interruttori che si vedono a lato di ciascun controllo calendario.

La procedura per l’interruttore tglBegin a fianco del controllo acxCalBegin è la seguente:

Private Sub tglBegin_Click()
    ' Reset the visibility of the calendar
    Me!acxCalBegin.Visible = Me!tglBegin
    ' If opened the calendar
    If Me!tglBegin Then
         ' and beginning date not set yet,
        If IsNothing(Me!BeginningDate) Then
             ' Set date to today as a default
            Me!acxCalBegin.Year = Year(Date)
            Me!acxCalBegin.Month = Month(Date)
            Me!acxCalBegin.Value = Date
        End If
    End If
End Sub

Per prima cosa questa routine imposta la proprietà Visibile del controllo calendario a cui è associata uguale al valore del controllo calendario stesso.

Se l’interruttore è “premuto” (il suo valore è True), il controllo calendario deve essere visualizzato.

Poi, se il calendario viene visualizzato ma non c’è una data impostata in BeginningDate, la routine imposta il calendario sulla data di oggi.

Quando si apre ilcontrollo calendario facendo clic sul pulsante a freccia in giù, si possono usare le due caselle combinate in testa ai controlli per selezionare un mese o un anno diverso.

Come abbiamo visto in questo tutorial, il VBA è un linguaggio estremamente potente: le attività che con esso si possono realizzare sono limitate soltanto dalla nostra immaginazione.

Nel prossimo tutorial, impareremo comeimpostare proprietà di avvio, creare menu personalizzati e costruire una maschera pannello di controllo principale per le nostre applicazioni.



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:


Google