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 21/09/2011, 18h03   #1
Membre du Club
 
Inscription : juillet 2009
Messages : 210
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 210
Points : 47
Points : 47
Par défaut Requête pour vérifier la présence d'un enregistrement dans une table.

Bonjour, voici deux tables et leurs champs :
-tProduits
-N°Produit (clé primaire)
-StockMini
-tStocks
-N°Stock (clé primaire)
-N°Produit
-QteStock
Je cherche à faire une requête qui sélectionne TOUS les produits de la table tProduits avec un StockMini >0 et les produits (regroupés par N°Produit) de la table tStocks avec la somme de leur QteStock.

Si un N°Produit de la table tProduits n'existe pas dans la table tStocks, une ligne doit quand même apparaitre dans le résultat de la requête avec ce N°Produit et son StockMini et faire comme s'il existait dans la table tStocks avec une QteStock = 0.

Le but est donc de voir les produits en stock qui ne respectent pas le stock minimum imposé et aussi de voir quels produits ne sont actuellement pas en stocks.

Voici ma requête faite avec l'assistant requête d'access qui n'affiche que les produits présents en stocks et pas ce qui n'y sont pas :

Code :
1
2
3
4
SELECT tProduits.N°Produit, tProduits.StockMini, Sum(tStock.QteStock) AS SommeDeQteStock
FROM tProduits INNER JOIN tStock ON tProduits.N°Produit = tStock.N°Produit
GROUP BY tProduits.N°Produit, tProduits.StockMini
HAVING (((tProduits.StockMini)>0) AND ((Sum(tStock.QteStock))<[tProduits].[StockMini]))
J'espère être assez clair. Si vous avez besoin de précisions n'hésitez pas à me demander.

Si quelqu'un a une piste je suis preneur. Merci d'avance.
Mat08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 18h31   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Bonjour Mat08,

Je n'ai pas vérifié la pertinence de ta requête mais, s'il te manque uniquement les produits présents dans tProduits et absents dans tStocks, alors il faut que tu ajoutes une flèche à droite (LEFT JOIN) : via l'assistant, double-click sur le trait de liaison puis étudies les explications, elles sont très claires (cela devrait être l'option 2).

D'autre part, crées une clause WHERE pour tProduits.StockMini)>0 (via l'assistant, "Où"). En effet, le HAVING teste après groupage, le WHERE teste avant groupage, c'est donc plus efficace.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 00h40   #3
Membre du Club
 
Inscription : juillet 2009
Messages : 210
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 210
Points : 47
Points : 47
Bonjour Richard_35,

J'ai utilisé vos recommandations et j'obtiens ce que je voulais. Je pensais que ça serai plus compliqué.

Comme vous l'avez dit il fallait sélectionner l'option 2 après avoir double-cliqué sur le lien entre les deux tables pour faire apparaitre tous les enregistrements de la première table et seulement ceux de la deuxième table qui sont égaux à la première table (pour le champ N°Produit).

J'ai aussi dû rajouter un critère (Est Null) pour le champ QteStock en plus de celui que j'avais déjà (Sum(tStock.QteStock)<[tProduits].[StockMini]) pour ne pas perdre les enregistrements dont la QteStock n'est pas renseignée.

D'autre part, le fait d'utiliser des critères dans l'assistant et de convertir la requête en SQL pur m'oblige à utiliser la clause HAVING. Je peux bien-sûr la remplacer par WHERE ensuite.

Voilà ma requête qui fonctionne convertie avec l'assistant :

Code :
1
2
3
4
SELECT tProduits.N°Produit, tProduits.StockMini, Sum(tStock.QteStock) AS SommeDeQteStock,
FROM tProduits LEFT JOIN tStock ON tProduits.N°Produit = tStock.N°Produit
GROUP BY tProduits.N°Produit, tProduits.StockMini,
HAVING (((tProduits.StockMini)>0) AND ((Sum(tStock.QteStock))<[tProduits].[StockMini])) OR ((Sum(tStock.QteStock)) Is Null))
Merci pour votre aide.
Mat08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h31   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Bonjour Mat08,

Citation:
Envoyé par Mat08
D'autre part, le fait d'utiliser des critères dans l'assistant et de convertir la requête en SQL pur m'oblige à utiliser la clause HAVING.
==> non, non. Via l'assistant, le WHERE d'une requête groupée est disponible via "Opération" = "Où" (au lieu de "Regroupement"). C'est plus propre et plus logique d'éliminer des enregistrements avant groupage qu'après groupage. Pour des critères non liés au groupage, bien entendu (Sum(), Min(), etc...).
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 17h53   #5
Membre du Club
 
Inscription : juillet 2009
Messages : 210
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 210
Points : 47
Points : 47
Bonjour, je viens de comprendre ce que vous me dites. J'en tiendrais compte à l'avenir.

Merci encore.
Mat08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 18h06   #6
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Pas de quoi : c'est un des objectifs de ce forum.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h28.


 
 
 
 
Partenaires

Hébergement Web