1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| '-----
'afficher les salles disponibles sur une période donnée
Private Sub CmdAfficher_Click()
'déclaration des variables
Dim dt1 As Date
Dim dt2 As Date
Dim ch_salle As String
'vérifier que tous les champs sont renseignés
If IsNull(Me.tdebut) Then
MsgBox "renseigner la date de début"
Exit Sub
End If
If IsNull(Me.tfin) Then
MsgBox "renseigner la date de fin"
Exit Sub
End If
dt1 = Me.tdebut
dt2 = Me.tfin
ch_salle = Me.tsalle
Set db = CurrentDb
Set rqDispo = db.OpenRecordset("tbDISPONIBILITE")
'If ListeDisponibilites(ch_salle, dt1, dt2) = True Then
Call ListeDisponibilites(ch_salle, dt1, dt2)
While rqDispo.EOF
Forms!frm_disponibilite!Form!Disponibilite![numdispo] = rqDispo!numdispo
Forms!frm_disponibilite!Form!Disponibilite![code_sal] = rqDispo!code_sal
Forms!frm_disponibilite!Form!Disponibilite![datedebut] = rqDispo!datedebut
Forms!frm_disponibilite!Form!Disponibilite![datefin] = rqDispo!datefin
'End If
Wend
Set rqDispo = Nothing
Set db = Nothing
End Sub
' ---
' LISTE DE DISPONIBILITES
' ---
'
Sub ListeDisponibilites( _
ByVal strSalle As String, _
ByVal dtDateDebut As Date, _
ByVal dtDateFin As Date)
' Quelques variables...
Dim strSQL As String
Dim rstResa As DAO.Recordset
Dim rstDispo As DAO.Recordset
Dim dtDebut As Date
Dim dtFin As Date
Dim salle As String
' Vidage de la table des disponibilités
CurrentDb.Execute "DELETE * FROM [tbDISPONIBILITE];"
' Instruction SQL pour extraire les réservations
' qui courent sur la période concernée
strSQL = StringFormat( _
"SELECT *" _
& " FROM [RESERVATION]" _
& " WHERE DatesIntersect({0}, {1}, [date_debut], [date_fin])" _
& " AND (Replace([code_sal], ""'"", ""''"") = '{2}')" _
& " ORDER BY [date_debut]", _
DateUS(dtDateDebut), _
DateUS(dtDateFin), _
Replace(strSalle, "'", "''"))
' Début de la première disponibilité possible
dtDebut = dtDateDebut
' Ouverture des Recordsets
Set rstResa = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
Set rstDispo = CurrentDb.OpenRecordset("tbDISPONIBILITE", dbOpenDynaset)
' Parcourir toutes les réservations
While Not rstResa.EOF
' Si la disponibilité est ok, sa période de fin est
' la date d'arrivée (de départ) de la réservation
If dtDebut < rstResa("date_debut") Then
dtFin = DateAdd("s", -1, rstResa("date_debut"))
' Stocker la disponibilité
StockerDisponibilite rstDispo, dtDebut, dtFin
End If
' La prochaine disponibilité commence potentiellement
' à la fin de la réservation
dtDebut = DateAdd("s", 1, rstResa("date_fin"))
rstResa.MoveNext
Wend
' Traiter la fin de période
' (ce qui peut rester après la dernière réservation)
If dtDebut < dtDateFin Then
StockerDisponibilite rstDispo, dtDebut, dtDateFin
End If
rstResa.Close
rstDispo.Close
Set rstResa = Nothing
Set rstDispo = Nothing
End Sub
' ---
' STOCKER UNE DISPONIBILITE DANS UNE TABLE
' ---
'
Sub StockerDisponibilite( _
rstDispo As DAO.Recordset, _
dtDebut As Date, _
dtFin As Date)
rstDispo.AddNew
rstDispo("datedebut") = dtDebut
rstDispo("datefin") = dtFin
' rstDispo("code_sal") = salle
rstDispo.Update
End Sub |
Partager