Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/10/2011, 18h23   #1
Invité de passage
 
Homme
Étudiant
Inscription : octobre 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2011
Messages : 2
Points : 0
Points : 0
Par défaut Requête pour gérer un planning de salle

Bonjour,

J'ai commencé une formation en système d'information cette année et je découvre les joies du SQL!
Malheureusement je bloque sur l'une d'elle !!!

Voici ce que je dois gérer :
Obtenir la liste des salles disponibles pour un groupe donné, à une date donnée, pour une heure donnée et une durée donnée. La réponse doit être donnée après la saisie de l'utilisateur du numéro de groupe, la date, l'heure de début et la durée.

Voici mes tables :
heures(heureID,intitule, nombreHeure,#heureDebut)
previsions(previsionID, jour, #heureDebut, #duree, #salle, #groupe)
salles(sallesID, capacite)
durees(dureeID, intitule, nombreHeure)
groupes(groupeID, nbetudiant)


J'avoue avoir essayé quelques pistes en utilisant JOIN et en faisant des appel de même tables, mais là je suis complètement perdu !!!
Merci de m'aider! Si vous avez besoin de précisions n'hésitez pas !!!
gusgus25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 08h11   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
heuredebut pointe vers quoi dans votre table heures?
dans previsions: jour est une date?

Je ne suis pas sûr de tout comprendre à quoi sert la table des heures?
Code :
1
2
3
4
5
6
SELECT DISTINCT s.sallesID
FROM previsions p
WHERE p.groupeID=@LEIDGROUPESAISI
   AND p.jour=@VOTREDATESAISIE
   AND p.heureDebut=@HEUREDEBUTSAISIE
   AND p.duree=@DUREESAISIE
Je ne suis pas certains que ce soit ce que vous attendez:
L'utilisateur saisi une date, une heure et une durée, vous voulez voir la dispo des salles ou les salles déjà prévues pour ce groupe (table prévisions)?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 09h52   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Je pense que cette requête devrait répondre au problème :
Code :
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
SELECT s.sallesID
FROM salles s
WHERE s.capacite >= 
	(
		SELECT nbetudiant 
		FROM groupes
		WHERE groupeID = :numero_groupe
	)
	AND NOT EXISTS
	(
		SELECT *
		FROM previsions p
		WHERE p.salle = s.sallesID
			AND p.jour = :date
			AND 
			(
				( -- Heure de début de la prévision dans la période disponible cherchée
					p.heureDebut BETWEEN :heure_debut AND (:heure_debut + INTERVAL :duree HOUR)
				)
				OR
				( -- Heure de fin de la prévision dans la période disponible cherchée
					(p.heureDebut + INTERVAL duree HOUR) BETWEEN :heure_debut AND (:heure_debut + INTERVAL :duree HOUR)
				)
				OR
				( -- Période disponible cherchée dans la période de la prévision
					heureDebut <= :heure_debut
					AND (p.heureDebut + INTERVAL duree HOUR) >= (:heure_debut + INTERVAL :duree HOUR)
				)
				OR
				( -- Prévision dans la période disponible
					heureDebut >= :heure_debut
					AND (p.heureDebut + INTERVAL duree HOUR) <= (:heure_debut + INTERVAL :duree HOUR)
				)
			)
	)
J'ai supposé ci-dessus que previsions.jour est une date et que les durées sont exprimées en heures.

Si cette requête est à mettre en oeuvre sur un SGBD, il faudra peut-être l'adapter aux fonctions de dates propres au à celui-ci, notamment pour les opérations d'addition d'heures qui permettent de trouver l'heure de fin à partir de l'heure de début et de la durée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 21h41   #4
Invité de passage
 
Homme
Étudiant
Inscription : octobre 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2011
Messages : 2
Points : 0
Points : 0
Par défaut précisions et questions

Tout d'abord merci de vos réponses !!!

Quelques précisions! Je veux qu'en rentrant le numéro du groupe, l'heure de début... que la requête me donne la liste des salles disponibles pour ce groupe!

iberserk : - heuredebut pointe vers heuresID dans la table heures
- il n'y a que jour dans la table prévisions

CinePhil, je comprend l'idée de ta requête, cependant je n'arrive pas à l'adapter à Access! Je n'arrive pas à faire les calculs pour additionner les heures !!!

Pour faire mon calcul d'heures, je dois plutôt utiliser les nombreHeure dans les tables heures et durees, NON?

Si vous voulez plus de précisions, on peut échanger par mails
gusgus25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 15h06   #5
Invité de passage
 
Homme
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 3
Points : 3
Bonjour,

J'ai la même requête à effectuer concernant une gestion de salles.
Je n'arrive pas à réutiliser le code de CinePhil.

Que veulent dire les ":" par exemple dans ":numero_groupe". Cela veut-il dire que c'est un paramètre saisi par l'utilisateur ?

Je souhaiterais également connaître la différence entre NOT IN et NOT EXISTS ?

Merci d'avance ,

Cordialement
jijoh95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 15h22   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par jijoh95 Voir le message
Je n'arrive pas à réutiliser le code de CinePhil.
Pas étonnant, Access a un SQL pourri !

Citation:
Que veulent dire les ":" par exemple dans ":numero_groupe". Cela veut-il dire que c'est un paramètre saisi par l'utilisateur ?
Oui.

Citation:
Je souhaiterais également connaître la différence entre NOT IN et NOT EXISTS ?
En principe, NOT IN prend pour paramètre une liste de valeurs séparées par des virgules.

Plus "sémantiquement",
Code :
WHERE colA NOT IN (liste, de, valeurs)
demande de conserver les lignes pour lesquelles la valeur de la colonne colA n'est pas dans la liste de valeurs.
Code :
1
2
3
4
5
WHERE NOT EXISTS(
  SELECT *
  FROM une_table
  WHERE condition corrélée à la requête principale
)
Cela signifie qu'on demande de garder les lignes pour lesquelles il n'existe aucune ligne répondant à une condition corrélée à la requête principale.

Dans le cas de cette discussion, il s'agit bel et bien de donner les salles pour lesquelles il n'existe pas de réservation au jour et à l'horaire indiqué.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2011, 19h06   #7
Invité de passage
 
Homme
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 3
Points : 3
Tout d'abord merci beaucoup pour toutes ces précisions !

J'ai tenté de modifier le code pour une utilisation sous ACCESS de telle sorte :

Code :
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
 
SELECT S.SALLEID
FROM S AS SALLES
WHERE S.CAPACITE >= 
	(
		SELECT NBETUDIANT 
		FROM GROUPES
		WHERE GROUPEID = [Saisir le numéro du groupe]
	)
	AND NOT EXISTS
	(
		SELECT *
		FROM P AS PREVISIONS
		WHERE P.SALLE = S.SALLEID
			AND P.JOUR = [Saisir la date]
			AND 
			(
									P.HEUREDEBUT BETWEEN heure_debut=[Saisir heure début] AND ( heure_debut + (duree=[Saisir la durée]))
				)
				OR
 
					(P.HEUREDEBUT + duree) BETWEEN heure_debut AND (heure_debut + duree)
				)
				OR
 
(					heureDebut <= heure_debut
					AND (P.HEUREDEBUT + duree) >= (heure_debut + duree)
				)
				OR
 
(					heureDebut >= heure_debut
					AND (P.HEUREDEBUT + duree) <= (heure_debut + duree)
				)
			)
	);
Le programme ne fonctionne pas. Ai-je commis une erreur sur les variables saisies ?

Merci pour toutes vos réponses et votre aide !
jijoh95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2011, 18h50   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Ca aurait été bien de poster l'erreur mais je suppose que c'est ca (je ne suis pas allé plus loin du coups...):
Code :
1
2
FROM P AS PREVISIONS
		WHERE P.SALLE
C'est surement non?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/11/2011, 08h10   #9
Invité de passage
 
Homme
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 3
Points : 3
Merci beaucoup !
ça me fait un problème de résolu !

Bon par contre il y en a encore quelques uns

Quand je lance la requête ça me demande bien le numéro du groupe que je renseigne, la date également mais en suite ça me demande de renseigner "heure_debut". Je pense que j'ai un erreur à la ligne 18 mais je comprend pas laquelle...

Merci pour votre aide ...



Code :
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
 
SELECT S.SALLEID
FROM SALLES AS S
WHERE S.CAPACITE >= 
(
SELECT NBETUDIANTS 
FROM GROUPES
WHERE GROUPEID = [Saisir le numéro du groupe]
)
AND NOT EXISTS
(
SELECT *
FROM PREVISIONS AS P
WHERE P.SALLE = S.SALLEID
AND P.JOUR = [Saisir la date]
AND 
(
P.HEUREDEBUT BETWEEN (heure_debut=[Saisir heure début]) AND (heure_debut + (duree=[Saisir la durée]))
)
OR
 
(P.HEUREDEBUT + duree) BETWEEN heure_debut AND (heure_debut + duree)
)
OR
 
(heureDebut <= heure_debut
AND (P.HEUREDEBUT + duree) >= (heure_debut + duree)
)
OR
 
(heureDebut >= heure_debut
AND (P.HEUREDEBUT + duree) <= (heure_debut + duree)
)
;
jijoh95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2011, 10h17   #10
Invité régulier
 
Femme Tiffany Pitel
Étudiant
Inscription : novembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Tiffany Pitel
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : novembre 2011
Messages : 13
Points : 7
Points : 7
Salut!

Bon tout d'abord, je précise que je suis débutante mais bon une remarque peut toujours servir.
J'ai récemment dû écrire une requête avec des dates où je devais ajouter un jour à chaque date. (J'ai d'ailleur ouvert une discussion qui a été résolue mais qui rest en debut de page si jamais tu veux jette un oeil)
Par ailleurs, moi je travaille sur access 2010 mais à l'université j'utilises access 2007 je crois et cela ne change pas grand chose a priori sur l'écriture de la requête elle même.

Donc je crois que lorsque tu veux ajouter quelque chose à une date il faut que tu utilises DATEADD.
Voici ta fonction:

Nous avons besoin d’une fonction particulière :
• DATEADD (type,nombre,champ), telle que,
type : "h" pour heures,
"n" pour minutes,
"s" pour secondes,
"m" pour mois,
"y" pour années,
"d" pour jours…

Donc, par exemple:
Si je veux ajouter deux jours à un champ nommé Date1 (qui est donc de type date #jj/mm/aaaa#)
Je fais:

DATEADD ("d", 2, Date1)

J'espère t'aider.
Tifany.Pitel est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h38.


 
 
 
 
Partenaires

Hébergement Web