Méthode pour une appli en ligne de réservation de salles

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Méthode pour une appli en ligne de réservation de salles

Re: Méthode pour une appli en ligne de réservation de salles

par nanina » 24 févr. 2011, 00:42

Bonjour Mazarini, Au fait c'est du Web donc côté serveur j'ai une deux query, test chevauchement qui fonctionne très bien et reservation qui fonctionne bien également quand je les utilise séparément or, pour être cohérent il faut faire d'abord le test si le test ne trouve pas alors je peux insérer dans la table.
Côté client je dois faire appel au service pour l'événement de mon bouton mais, ne vois pas comment faire. Je ne sais pas si t'as une idée.

Pour chercher les chevauchements j'ai utilisé between pour vérifier la période est inclus dans le test.

Merci d'avance

Re: Méthode pour une appli en ligne de réservation de salles

par Mazarini » 23 févr. 2011, 16:28

Bonjour,

Tu peux créer une procédure stockée pour faire le contrôle de chevauchement et enchainer sur l'insertion avec un code retour pour indiquer si tout est ok.

Autrement, il me semble que la condition pour détecter le chevauchement entre (debut1,fin1) et (debut2,fin2) est :
(debut1 <= fin2) et (fin1 >= debut2)

Ce qui est le contraire du non chevauchement (fin1 < debut2) ou (fin2 < debut1) soit en français se termine avant le début de l'autre ou commence après la fin de l'autre.

Re: Méthode pour une appli en ligne de réservation de salles

par nanina00 » 22 févr. 2011, 14:21

Salut Sadeq, j'ai une question à propos toujours de mon exercice de réservation après avoir vérifier le chevauchement j'ai un query qui insère dans ma table mais, je ne vois pas comment associer les deux query(celui de chevauchement et celui d'insertion) je pense appeler celui de chevauchement dans celui de qui insérer dans la table mais, je ne vois pas comment si quelqu'un a une idée. Merci d'avance

Re: Méthode pour une appli en ligne de réservation de salles

par sadeq » 25 janv. 2011, 21:25

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.

Re: Méthode pour une appli en ligne de réservation de salles

par AB » 25 janv. 2011, 18:40

Et vous faites pas des réductions pour les réservations de salles pour l'année 2000 ? Bon ok je sort :arrow:

Re: Méthode pour une appli en ligne de réservation de salles

par nanina00 » 25 janv. 2011, 18:13

Merci bcp Sadeq, j'y penserai pour le digits le mieux est de le mettre à 4 et non à 2 pour éviter le bug de 2000. C'vraiment sympa de ta part. A+

Re: Méthode pour une appli en ligne de réservation de salles

par nanina00 » 25 janv. 2011, 18:08

Salut Sadeq, je pense que l'erreur vient de moi lors des insertions dans la base le pattern était avec to_date(18/11/10,'dd/mm/yyyy') voilà pourquoi je n'ai pas de résultat avec to_date(18/11/10,'dd/mm/yy') c'est logique. S'il y a quelques remarques à me faire je reste ouvert. En tout merci beaucoup et à bientôt.

Re: Méthode pour une appli en ligne de réservation de salles

par sadeq » 25 janv. 2011, 17:51

Bonjour, pour éviter le problème de l'an 2000 il faut exprimer les dates fournies en paramètres de recherche avec l'année sur 4 sous le format yyyy comme le 15/12/1999.
Dans mon exemple, j'ai utilisé la date 1999 pour éviter la conversion relative de la fonction to_date() de la partie du siècle de l'année.

Donc, si j'avais exprimé ma date du 15/12/1999 dans la fonction to_date() avec l'année sur 2 comme : to_date('15/12/99', 'dd/mm/yyyy') cela donnerait en fait après conversion la date: 15/12/2099 et non 15/12/1999. Ce qui est trompeur.

Re: Méthode pour une appli en ligne de réservation de salles

par nanina00 » 25 janv. 2011, 17:05

Merci Sadeq, je viens de me rendre compte que l'erreur vient du pattern quand je modifie l'année à 4 digits tout va bien le résultat est correct, mais par contre quand je la modifie à 2 digits pas de résultat alors que les données concernant l'année dans ma base est à 2 digits du style: 18.10.10 et depuis mon programme java l'insertion dans la base est du style: 18/10/10. Je ne sais pas qu'est-ce que je n'ai pas compris jusqu'ici. OK avec to_date('19/11/10','dd.mm.yyyy') et non, avec to_date('19/11/10','dd.mm.yy').
Merci beaucoup à toute personne qui serait prête à m'éclairer sur ce sujet.

Re: Méthode pour une appli en ligne de réservation de salles

par nanina00 » 24 janv. 2011, 12:19

Bonjour sadeq, Tout d'abord je tiens à te remercier pour le temps que tu prends pour m'aider. Maintenant je veux faire le test mais, je ne sais pas si Oracle va accepter une instruction sans le point virgule mais je te donne aussitôt la suite. Merci et A+

Re: Méthode pour une appli en ligne de réservation de salles

par sadeq » 19 janv. 2011, 18:03

A priori, je pense que tu dois virer le dernier point-virgule de ta requête SQL concernant ORACLE.
Par ailleurs, j'ai refais le test pas mal de fois chez moi, et ta requête continue de fonctionner très bien. Voici, si ça peut t'aider, le programme de test que j'ai fait:
<pre>
<?php
### Requêtes utilisées pour le test 
$requêtes[] = "CREATE TABLE RESERVATION_TMP (id INT, debut DATE, fin DATE, salle VARCHAR2(100 CHAR) )";
$requêtes[] = "DELETE FROM RESERVATION_TMP";
### Jeu de données pour le test
$requêtes[] = "INSERT INTO RESERVATION_TMP VALUES (1, '13/12/1999','14/12/1999', 'salle1')";
$requêtes[] = "INSERT INTO RESERVATION_TMP VALUES (2, '13/12/1999','19/12/1999', 'salle2')";
$requêtes[] = "INSERT INTO RESERVATION_TMP VALUES (3, '15/12/1999','16/12/1999', 'salle1')";
$requêtes[] = "INSERT INTO RESERVATION_TMP VALUES (4, '17/12/1999','19/12/1999', 'salle1')";
$requêtes[] = "SELECT * FROM RESERVATION_TMP";
### La requête de recherche des réservations de la salle1 par date
$requêtes[] = "SELECT count(RESERVATION_TMP.id) AS compte FROM RESERVATION_TMP 
WHERE ( (to_date('15/12/1999','dd/mm/yy')  BETWEEN RESERVATION_TMP.debut  AND  RESERVATION_TMP.fin) 
OR  (to_date('17/12/1999','dd/mm/yy')  BETWEEN RESERVATION_TMP.debut  AND  RESERVATION_TMP.fin )) 
AND TRIM(RESERVATION_TMP.salle) ='salle1'";

### Connexion à la base Oracle dans mon cas : le service XE local d'oracle 10g
$conn = oci_connect('hr', 'hr', 'localhost/XE') or die("<p>Connexion impossible : " . oci_error()) . "</p>";
echo "<p>Connexion réussie</p>";

## Exécution du lot de requêtes prévues dans le tableau $requêtes
foreach($requêtes as $index=>$sql){
	$req = @oci_parse($conn, $sql); if (!$req) echo ("<p>Erreur préparation requête ($index)</p>");
	@oci_execute($req); if (!$req) echo ("<p>Erreur d'exécution requête ($index)</p>");

	## Afficheur du résultat des requêtes SELECT
	while($req && ($ligne = @oci_fetch_array($req, OCI_ASSOC+OCI_RETURN_NULLS)))
	{
		print_r($ligne);
	}
}
## Fin
oci_close($conn);
?>
</pre>
Le résultat de ce programme php est le suivant:
Connexion réussie
Array
(
[ID] => 3
[DEBUT] => 15/12/99
[FIN] => 16/12/99
[SALLE] => salle1
)
Array
(
[ID] => 4
[DEBUT] => 17/12/99
[FIN] => 19/12/99
[SALLE] => salle1
)
Array
(
[ID] => 1
[DEBUT] => 13/12/99
[FIN] => 14/12/99
[SALLE] => salle1
)
Array
(
[ID] => 2
[DEBUT] => 13/12/99
[FIN] => 19/12/99
[SALLE] => salle2
)
Array
(
[COMPTE] => 2
)
Le dernier Array ([COMPTE]=>2 ) est le résultat de la requête qui te tracasse :
SELECT count(RESERVATION_TMP.id) AS compte FROM RESERVATION_TMP 
WHERE ( (to_date('15/12/1999','dd/mm/yy')  BETWEEN RESERVATION_TMP.debut  AND  RESERVATION_TMP.fin) 
OR  (to_date('17/12/1999','dd/mm/yy')  BETWEEN RESERVATION_TMP.debut  AND  RESERVATION_TMP.fin )) 
AND TRIM(RESERVATION_TMP.salle) ='salle1'
Ce résultat est correct car dans mon jeu d'essai de données, il y a bien 2 réservations pour la salle1 pour le 15 et 17 décembre 1999.

A+

Re: Méthode pour une appli en ligne de réservation de salles

par nanina00 » 19 janv. 2011, 00:41

Bonjour sadeq,

J'ai suivi ta recommandation mais rien à faire j'ai même essayé d'effacer les espaces à gauche avec LTRIM spécialement Oracle toujours négatif. Mais il y a une chose que je ne comprend pas quand je teste avec une date comme 15/10/10 j'ai le bon résultat j'avoue que je n'arrive pas à comprendre.
SELECT count(RESERVATION.id) AS compte FROM RESERVATION WHERE ( (to_date('18/11/10','dd.mm.yy') BETWEEN RESERVATION.debut  AND  RESERVATION.fin) OR  (to_date('18/11/10','dd.mm.yy') BETWEEN RESERVATION.debut  AND  RESERVATION.fin )) AND LTRIM(RESERVATION.salle) ='salle3';
Merci beaucoup pour ton aide

Re: Méthode pour une appli en ligne de réservation de salles

par sadeq » 09 déc. 2010, 10:41

Bonjour Nanina, vérifie bien si tu n'as pas d'espaces inutiles dans le champ RESERVATION.salle car c'est un varchar2(100 char) sa taille est fixée à 100 caractères et des fois quand l'insertion des données est faite par une requête d'importation ou d'insertion le système Oracle remplie le reste de la taille de la chaine avec des espaces.
Le mieux et de purger les espaces inutiles dans une chaine comparée par la fonction TRIM() dans les requêtes SELECT.

Essaye donc cette variante de ta requête:
SELECT count(RESERVATION.id) AS compte FROM RESERVATION WHERE ( (to_date('18/11/10','dd.mm.yy') BETWEEN RESERVATION.debut  AND  RESERVATION.fin) OR  (to_date('18/11/10','dd.mm.yy') BETWEEN RESERVATION.debut  AND  RESERVATION.fin )) AND TRIM(RESERVATION.salle) ='salle3';

Re: Méthode pour une appli en ligne de réservation de salles

par nanina » 19 nov. 2010, 10:19

Bonjour à tous,

Je viens avec ma requête qui ne me donne pas le résultat escompté. Au fait, dans ma table reservation j'ai une salle qui est réservée pour la période du 18.11.10 au 18.11.10. Avec select * from reservation; // Ok j'arrive à trouver la salle n°3 mais malheureusement pas avec la requête qui suit:
select count(RESERVATION.id) as compte from RESERVATION where ( (to_date('18/11/10','dd.mm.yy') between RESERVATION.debut  and  RESERVATION.fin) or  (to_date('18/11/10','dd.mm.yy') between RESERVATION.debut  and  RESERVATION.fin )) and RESERVATION.salle ='salle3';
Voici la structure de ma table:
Create table RESERVATION
(
  id number(10) not null, 
  debut date not null, 
  fin date not null, 
  salle varchar2(100 char) not null,
  details varchar2(100 char) not null
);
Je dois faire la recherche avant d'insérer une nouvelle réservation. Je suis sous Oracle et java.
Je trouve que la requête postée par Sadeq correspond bien au moins mais je sais pourquoi?

Merci d'avance pour aide

par iclo » 05 juin 2006, 16:14

Ca, on ne peut que te féliciter de prendre le temps de faire une modélisation correcte avant de commencer à coder. :pouce:
Quand on voit le nombre de gens qui se retrouvent en cours de devellopement, à patauger avec une modélisation complétement bancale, et qui veulent des astuces pour ne pas retoucher ce qu'ils appelent une base de donée :wink: :wink:

Bonne chance pour la suitej et n'hésite pas à demander un coup de main si nécessaire.