General

6.209 In una agenda realizzata con Access verificare che un nuovo appuntamento non si accavalli con impegni precedenti
  Roberto

In alcune applicazioni Access capita spesso di dover verificare se un nuovo impegno temporale si accavalla e quindi è incompatibile con impegni temporali presi precedentemente e già accettati e registrati nel database.

Potrebbe essere il caso di applicativi con i quali si noleggiano auto, si affittano campi sportivi, si prenotano camere d'albergo ecc. ecc.; in tutti questi casi è doveroso, prima di accettare di inserire un nuovo record di noleggio o affitto o prenotazione, verificare che nel periodo richiesto il bene sia disponibile e nel caso contrario non registrare il nuovo record.
La verifica è realizzabile usando semplicemente una funzione di aggregazione Dcount.
Per meglio camprendere questa tecnica si ipotizzi che si stia realizzando una agenda di appuntamenti con un database Access.
Ipotizziamo che gli appuntamenti vadano registrati in una tabella chiamata Agenda che abbia la seguente struttura:
Id                    Contatore e chiave primaria
DataApp        Data/ora
OraInizio       Data/ora
OraFine          Data/ora
Descrizione  Testo o Memo
Ipotizziamo anche che gli appuntamenti possono essere presi solamente tra le ore 9:00 e le ore 17:00.
Nella maschera di inserimento dati associata a tale tabella, a fronte dell'evento "Prima di aggiornare" della casella di testo associata al campo OraInizio generare il seguente codice VBA:
Private Sub OraInizio_BeforeUpdate(Cancel As Integer)
If IsNull(Me!OraInizio) _
    Or Me!OraInizio < #9:00:00 AM# Then
        MsgBox "Ora inizio fuori range", vbCritical, _
            "Verifica orario appuntamento"
        Cancel = True
        Me!OraInizio.Undo
        Exit Sub
End If
End Sub
A fronte dell'evento "Prima di aggiornare" della casella di testo associata al campo OraFine generare il seguente codice VBA:
Private Sub OraFine_BeforeUpdate(Cancel As Integer)
If IsNull(Me!OraFine) _
    Or Me!OraFine > #5:00:00 PM# Then
        MsgBox "Ora fine fuori range", vbCritical, _
            "Verifica orario appuntamento"
        Cancel = True
        Me!OraFine.Undo
        Exit Sub
End If
End Sub
Infine a fronte dell'evento "Prima di aggiornare" della maschera genera il seguente codice VBA:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!OraInizio) Then
    MsgBox "Inserisci ora inizio", vbCritical, _
        "Verifica orario appuntamento"
    Cancel = True
    Me!OraInizio.SetFocus
    Exit Sub
End If
If IsNull(Me!OraFine) Then
    MsgBox "Inserisci ora fine", vbCritical, _
        "Verifica orario appuntamento"
    Cancel = True
    Me!OraFine.SetFocus
    Exit Sub
End If
If Me!OraInizio >= Me!OraFine Then
    MsgBox "Ora inizio minore o uguale ad ora fine", _
        vbCritical, "Verifica orario appuntamento"
    Cancel = True
    Me!OraInizio.SetFocus
    Exit Sub
End If

'******************************************************
'Verifica che il nuovo appuntamento non si accavalli con i precedenti
'******************************************************

If DCount("*", "Agenda", "Id <>" & Me!Id & _
    " AND DataApp =#" & Format(Me!DataApp, "mm/dd/yyyy") & _
    "# AND OraInizio <#" & Me!OraFine & _
    "# AND OraFine > #" & Me!OraInizio & "#") > 0 Then
        MsgBox "Periodo già occupato da altro appuntamento", _
            vbCritical, "Verifica orari appuntamento"
        Cancel = True
        Me!OraInizio.SetFocus
End If
End Sub
A parte alcuni controlli accessori di compatibilità degli orari di inizio e di fine appuntamento, la verifica di un eventuale accavallamento del nuovo appuntamento con i precedenti appuntamenti viene effettuata esclusivamente tramite la funzione DCount di cui sopra contenuta nella Sub Form_BeforeUpdate.


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.