Requête de réservation.

cs_calixte35 Messages postés 1 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 9 mai 2011 - 9 mai 2011 à 21:00
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 - 11 mai 2011 à 17:37
Je crée actuellement un projet codé en VB NET. Ce projet consiste en la gestion d'un hôtel.

Je souhaite afficher toutes les chambres disponibles dans une période choisie par l'utilisateur.

voici le début pour que vous compreniez mon problème :

SELECT id_chambre, nom_chambre FROM Chambres
INNER JOIN Reservations ON Chambres.id_chambre=Reservations.id_chambre
WHERE ...



C'est le WHERE qui me pose problème !
Quels sont les test à effectuer pour que les chambres réservées pendant cette période, ne soit pas prises en compte...

Voici la structure de mes 2 tables concernées :

CHAMBRES[
id_cham
num_cham
nom_cham
super_cham
descr_cham
...
]

RESERVATIONS[
id_reserv
id_chambre
id_client
date_deb_reserv
date_fin_reserv
...
]

et ensuite dans l'interface deux dates sont choisis : (champs calendrier en VB NET)
-calendDu.value
-calendAu.value

Voila...donc ma question concerne "l'organisation" de tout cela pour que ça fonctionne correctement.

On comprend bien si le client recherche du 13/05 au 21/05, mais qu'une réservation cours dans une chambre du 10/05 au 15/05, et bien on n'affichera pas cette chambre...

Faut -il utiliser des opérateurs de compraisons ?
Vraiment merci de m'aider !


Calixte 35

3 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
9 mai 2011 à 22:48
Bonjour,

J'aurais fait "un peu" plus bourrin :
SELECT id_chambre, nom_chambre FROM Chambres WHERE (
    NOT id_cham  IN (
            SELECT id_chambre FROM RESERVATIONS WHERE (
            date_deb_reserv BETWEEN " + calendDu.value + " AND " + calendAu.value  + "
    ) OR (
            date_fin_reserv  BETWEEN " + calendDu.value + " AND " + calendAu.value  + "
        )
    )
)


Ici on a une requête imbriquée qui retourne la liste des chambres occupées puis on ne garde que les chambres qui ne font pas parties de la liste.

Bien sûr, il faudra formater calendAu.value et calendDu.value en fonction de ton SGBD.

Mon site
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 mai 2011 à 22:56
Pas bonjour non plus.

Complexe.
Une chambre libre est une chambre sans réservation - Lapalisse (1470-1525)
Il convient donc de rechercher quelles chambres n'apparaissent pas dans les fiches de réservations entre ces deux dates.
Genre (incomplet) :
Where Chambres.id_chambre Not In 
   (Select Reservations.id_chambre
      From Reservations 
     Where Reservations.date_deb_reserv Between #" & -calendDu.value & "# "
                                            And #" & -calendAu.value & "#"
Nota 1 : Cette syntaxe n'est peut-être pas compatible avec Access mais l'est surement sous SQL Server - non précisé.
Nota 2 : Je suppose que -calendDu et -calendAu sont des objets de ton programme.

La grosse difficulté, c'est que ta table mémorise les dates de début et de fin, et que la recherche peut-être fausse si tu tapes une date à l'intérieur de la période de réservation d'une autre chambre.

Une possibilité :
Gérer des requêtes incrémentales, c'est à dire faire autant de requêtes que de jours à rechercher.
Si tu dois chercher des chambres entre le 2 et le 4 juin, il faudra faire une recherche pour le 2 juin, avec pour bornes les dates de la table, exemple
Where #" & LaDateTestee & "# Between Reservations.date_deb_reserv 
                                 And Reservations.date_fin_reserv
puis, à l'identique pour le 3 et le 4 juin.
Si la chambre testée apparait dans une seule des 3 requêtes, cela voudra dire que la chambre est occupée au moins sur une date.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
11 mai 2011 à 17:37
Salut,
Une autre façon de faire serait :

-Requete1:Selectionner les chambres resérvées pendant cet interval.

Select Reservations.id_chambre
From Reservations
Where Reservations.date_deb_reserv Between #" & -calendDu.value & "# "
And #" & -calendAu

-Requte2:Une requete de non correspondance.Autrement dit les chambres
qui n'ont pas de correspondance dans requete1.

SELECT id_chambre, nom_chambre FROM Chambres
INNER JOIN Requete1 ON Chambres.id_chambre=Requete1.id_chambre
WHERE Chambres.id_chambre Is Null;



[] Ce qui va sans dire. va mieux en le disant.
0
Rejoignez-nous