General

6.218 In un database per gestire la prenotazione di camere di albergo evitare la sovrapposizione di prenotazioni.
  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 un database Access per la gestione delle prenotazioni delle stanze di un albergo.
Ipotizziamo che le prenotazioni vadano registrate in una tabella chiamata Prenotazioni che abbia la seguente struttura:
Id                                 Contatore e chiave primaria
Nome_Camera         Testo
Data_Arrivo              Data/ora
Data_Partenza         Data/ora
A fronte dell'evento "Prima di aggiornare" della maschera che ha come origine record la tabella Prenotazioni generare il seguente codice VBA:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!Data_Arrivo) Then
    MsgBox "Inserisci la data di arrivo", vbCritical, _
        "Verifica periodo di prenotazione"
    Cancel = True
    Me!Data_Arrivo.SetFocus
    Exit Sub
End If
If IsNull(Me!Data_Partenza) Then
    MsgBox "Inserisci la data di partenza", vbCritical, _
        "Verifica periodo di prenotazione"
    Cancel = True
    Me!Data_Partenza.SetFocus
    Exit Sub
End If
If Me!Data_Arrivo > Me!Data_Partenza Then
    MsgBox "Data di arrivo minore a data partenza", _
        vbCritical, "Verifica periodo di prenotazione"
    Cancel = True
    Me!Data_Arrivo.SetFocus
    Exit Sub
End If

'******************************************
' Verifica che la nuova prenotazione non si accavalli con
' le prenotazioni precedenti della stessa camera
'******************************************

If DCount("*", "Prenotazioni", "Id <>" & Me!Id & _
    " AND Nome_Camera ='" & Nome_Camera & _
    "' AND Data_Arrivo <=  #" & _
    Format(Me!Data_Partenza, "mm/dd/yyyy") & _
    "# AND Data_Partenza >=  #" & _
    Format(Me!Data_Arrivo, "mm/dd/yyyy") & "#") > 0 Then
        MsgBox "Periodo già occupato da altra prenotazione", _
            vbCritical, "Verifica periodo di prenotazione"
        Cancel = True
        Me!Data_Arrivo.SetFocus
End If
End Sub
A parte alcuni controlli accessori di compatibilità delle date di arrivo e di partenza, la verifica di un eventuale accavallamento della nuova prenotazione con le precedenti prenotazioni di quella camera viene effettuata esclusivamente tramite la funzione DCount di cui sopra.


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