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/oraA 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 SubA 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. |