IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Requête pour vérifier la présence d'un enregistrement dans une table. [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    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.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    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...).

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bonjour, je viens de comprendre ce que vous me dites. J'en tiendrais compte à l'avenir.

    Merci encore.

  6. #6
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Pas de quoi : c'est un des objectifs de ce forum.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/02/2010, 20h36
  2. Tester la présence d'un enregistrement dans une table ?
    Par Evocatii dans le forum Requêtes
    Réponses: 5
    Dernier message: 25/02/2008, 22h02
  3. Réponses: 1
    Dernier message: 28/02/2007, 00h08
  4. Position d'un enregistrement dans une table ou requête Query
    Par polinevol dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/01/2006, 04h53
  5. [VS.net] Vérifier le présence d'un caractère dans une chaine
    Par arnolem dans le forum Windows Forms
    Réponses: 15
    Dernier message: 10/09/2005, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo