Reservations

Retour vers Access

Dominer les réservations

Situation : Imaginons un garage qui loue ses voitures à la journée. Le patron souhaite retrouver rapidement les immatriculations de ses véhicules de location qui seraient libres pendant la période souhaitée par le client...Bien sûr, le commerce fonctionne bien et les réservations sont nombreuses, il faut donc pouvoir tester chaque réservation enregistrée et écarter les immatriculations des véhicules qui sont en prêt à la période considérée. Voyons cela sur ce petit graphique....

On observe que 6 possibilités s'offrent à nous

  1. La période de location précède la période déjà réservée
  2. La période de location chevauche le commencement de la période réservée
  3. La période de location correspond à la période réservée
  4. La période de location chevauche la fin de la période réservée
  5. La période de location suit la période réservée
  6. La période de location englobe totalement et même plus la période réservée

Il faut d'abord mettre nos outils en place, créons une table comme ceci

Sur laquelle on bâtit une requête

Sur laquelle on bâtit un formulaire

Jusque là, c'est un schéma classique rien de nouveau sous le soleil. Nous avons pour le moment 4 réservations déjà encodées. Comme vous l'avez déjà compris le bouton "Disponibilité" va nous permettre de scanner chaque enregistrement pour tester la période que le client va proposer ("Je souhaiterais une voiture du .... au .....").

C'est maintenant que notre petit graphique va nous aider. On se rend compte immédiatement que l'on ne peut prêter la voiture que si elle est libre et que cela correspond à une période avant ou après les réservations déjà faites...1ère et 5ème possibilités sur le graphique (Observez la voiture immaticulée ABC123, elle est déjà retenue pour 2 périodes ...donc si au moins une des périodes réservées est concernée, cette immatriculation devra être considérée comme indisponible). Nous allons nous servir du champ [Disponibilite] pour enregistrer le résultat de ce test, ensuite il nous suffira de trier les enregistrements sur ce champ pour ne retenir que les immatriculations où le champ [Disponibilite] sera resté vide (enfin à l'état False-Faux)

On crée un module qu'on lancera avec un Call

Voici le code en image, vous pouvez télécharger une version Access2002 et Access97 en bas de page

Option Compare Database
Option Explicit

Sub recherche()
Dim db1 As DAO.Database, rs1 As DAO.Recordset
Dim strSQL1 As String, DLoc As Date, FLoc As Date
Dim Imma As String, Dispo As Boolean
'******** les dates peuvent se situer à différents endroits **********
Dim DLocAvantDLocation As Boolean, DLocEntreDFLocation As Boolean, DLocApresFLocation As Boolean
Dim FLocAvantDLocation As Boolean, FLocEntreDFLocation As Boolean, FLocApresFLocation As Boolean
Dim i As Long


'******* on crée le recordset ********
Set db1 = CurrentDb
strSQL1 = "Select * from R_Reservation"
Set rs1 = db1.OpenRecordset(strSQL1)
'********reinitialiser disponibilité****
rs1.MoveFirst
'****** réinitialisation du champs Disponibilité ********
Do
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
rs1.MoveNext
Loop Until rs1.EOF = True

'**********Remplir les dates de réservation**********
DLoc = InputBox("Quelle date de début ?", "Question")
FLoc = InputBox("Date de Fin ?", "Question")

'*********** On remplit la case disponibilité**********
rs1.MoveFirst
Do
'********** initialisation*************
DLocAvantDLocation = False
DLocEntreDFLocation = False
DLocApresFLocation = False

FLocAvantDLocation = False
FLocEntreDFLocation = False
FLocApresFLocation = False

'**********Mise à Vrai suivant les conditions de date ******
'1ere possibilité date début plus petite que le début de période de location déjà fixée
If DLoc < rs1("DLocation") Then
DLocAvantDLocation = True
End If
'2eme possibilité date début plus grande ou égale que le début de période de location déjà fixée
'mais plus petite ou égale à la fin de la période de location déjà fixée
If DLoc >= rs1("Dlocation") And DLoc <= rs1("Flocation") Then
DLocEntreDFLocation = True
End If
'3eme possibilité date début plus grande que la fin de la période déjà fixée
If DLoc > rs1("Flocation") Then
DLocApresFLocation = True
End If

'1ere possibilité date fin plus petite que le début de période de location déjà fixée
If FLoc < rs1("DLocation") Then
FLocAvantDLocation = True
End If
'2eme possibilité date fin plus grande ou égale que le début de période de location déjà fixée
'mais plus petite ou égale à la fin de la période de location déjà fixée
If FLoc >= rs1("Dlocation") And DLoc <= rs1("Flocation") Then
FLocEntreDFLocation = True
End If
'3eme possibilité date fin plus grande que la fin de la période déjà fixée
If FLoc > rs1("Flocation") Then
FLocApresFLocation = True
End If

'****** on doit examiner les situations possibles ********
'1er DLoc est avant DLocation et FLoc est après FLocation
'c'est à dire la période réservée dans la zone demandée
If DLocAvantDLocation = True And FLocApresFLocation = True Then
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
'2eme DLoc est avant la période et FLoc est dans la période
ElseIf DLocAvantDLocation = True And FLocEntreDFLocation = True Then
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
'3eme DLoc et FLoc sont dans la période déjà fixée
ElseIf DLocEntreDFLocation = True And FLocEntreDFLocation = True Then
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
'4eme DLoc est dans la période et FLoc après la fin
ElseIf DLocEntreDFLocation = True And FLocApresFLocation = True Then
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
'5eme DLoc et FLoc sont après la période
ElseIf DLocAvantDLocation = True And FLocAvantDLocation = True Then
rs1.Edit
rs1("Disponibilite") = True
rs1.Update
'6eme
ElseIf DLocApresFLocation = True And FLocApresFLocation = True Then
rs1.Edit
rs1("Disponibilite") = True
rs1.Update
End If
'********on va passer à l'enregistrement suivant et réinitialiser array2 *******
rs1.MoveNext
Loop Until rs1.EOF = True
'=======================================================
'********on refait une boucle pour enlever la disponibité si l'immatriculation existe et que
'********sa disponibilité est déjà à faux ****************
rs1.MoveFirst
rs1.MoveNext
Do
'***** on récupére l'immatriculation de l'enregistrement précédent****
rs1.MovePrevious
Imma = rs1("Immatriculation")
Dispo = rs1("Disponibilite")
rs1.MoveNext
'***** on teste si elles sont pareilles
If Imma = rs1("Immatriculation") And Dispo <> rs1("Disponibilite") Then
rs1.MovePrevious
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
rs1.MoveNext
rs1.Edit
rs1("Disponibilite") = False
rs1.Update
End If
'********on va passer à l'enregistrement suivant et réinitialiser array2 *******
rs1.MoveNext
Loop Until rs1.EOF = True
DoCmd.ApplyFilter "", "(((R_Reservation.Disponibilite)=True))"
End Sub

Il est à remarquer que l'on peut suivre les réservations à l'heure, il suffit de donner un format "jj/mm/aa hh:mm:ss" aux champs DLocation et FLocation

Cliquez (bouton droit-enregistrez la cible sous) ici pour télécharger le fichier exemple Access2002 : reservations2002

Cliquez (bouton droit-enregistrez la cible sous) ici pour télécharger le fichier exemple Access97 : reservations97

Fin