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

VB.NET Discussion :

Instruction SQL afin de faire correspondre plusieurs tables


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 89
    Par défaut Instruction SQL afin de faire correspondre plusieurs tables
    Bonjour,
    Je vous explique un peu le problème que je rencontre actuellement sur mon projet VB de gestion de stock.
    J'ai 4 tables :
    - Entrée produit
    - Stock
    - Produit
    - Commande Client
    De mes 4 tables j'ai créé un Dataset "gestion_stockDataset" avec mes 4 table adapter de cette façon :
    Nom : 2016-05-02_18h03_36.png
Affichages : 1731
Taille : 28,6 Ko
    Voici ma requête SQL qui va chercher les caractéristiques d'un produit :
    SELECT Code_produit, Catégorie, Fournisseur
    FROM produit
    WHERE (Code_produit = ?)
    c'est à dire que quand je rentre un produit quelconque ses caractéristiques s'affichent dans des Textbox (Résolu dans un précédent Forum)

    Mon problème vient du fait que je n'arrive pas à faire correspondre la quantité ajouté (table entrée produit) avec la quantité entrée (table stock).
    De la même manière avec la quantité commandee (table commande client) avec la quantité sortie (table stock)
    J'ai eu l'idée de faire une jointure de ces trois tables (stock, entrée produit et commande client) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT stock.Code_produit, stock.Categorie, stock.Fournisseur, stock.Quantite_entree, stock.Quantite_sortie, stock.Quantite_en_stock
    FROM stock
    JOIN entree_produit
    	ON entree_produit.Code_produit = stock.Code_produit AND entree_produit.Quantite_ajoutee = stock.Quantite_entree 
    JOIN commande_client 
    	ON commande_client.Code_produit = stock.Code_produit AND commande_client.Quantite_commandee = stock.Quantite_sortie
    WHERE stock.Quantite_entree = stock.Quantite_entree + entree_produit.Quantite_ajoutee 
    AND stock.Quantite_sortie = stock.Quantite_sortie + commande_client.Quantite_commandee 
    AND entree_produit.ID =(SELECT MAX(ID) FROM entree_produit entree_produit_1 WHERE (Code_produit = ?))
    a la fin de ma requête je veut que seul les dernier enregistrement (MAX(ID)) s'ajoute dans la table stock.
    D'après le générateur de requête, cette requête n'a pas de faute mais ne fonctionne donc pas.
    Cette requête s'appelle FillBy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Relation_stockTableAdapter.FillBy(Me.Gestion_stockDataSet.relation_stock, ComboBox1.Text)
    J'ajoute donc cette instruction dans l'évènement click d'un bouton CONSULTER.
    Nom : 2016-05-02_18h14_43.png
Affichages : 1160
Taille : 10,9 Ko
    Lorsque j'enregistre une commande, le chiffre entrée dans la case quantité commandee doit donc s'ajouter à la quantité sortie de ma table stock.
    Voilà donc mon problème.
    Si vous avez des questions n'hésitez surtout pas à me les poser.
    Je sais pas si j'ai été assez clair.
    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Pour être franc, je ne comprends pas le sens de la requête. A quoi sert-elle ?
    De plus, j'y vois plusieurs problèmes dans les jointures et la clause where :

    La jointure entre Stock et Commande_Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande_client.Code_produit = stock.Code_produit AND commande_client.Quantite_commandee = stock.Quantite_sortie
    Pour un produit, ce n'est pas la quantité commandée par un client qui doit correspondre à la Quantite_sortie mais la somme des quantités commandés !
    La clause Where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stock.Quantite_entree = stock.Quantite_entree + entree_produit.Quantite_ajoutee
    Pour un produit, Quantite_entree sera toujours égale à Quantite_entree, pas à la la somme de lui-même avec autre chose.

    a la fin de ma requête je veut que seul les dernier enregistrement (MAX(ID)) s'ajoute dans la table stock.
    Je ne comprend pas, il ne s'agit pas ici d'ajouter dans une table mais de sélectionner des enregistrements de la table Stock.

    Bref, quel est le but exact de cette requête ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 89
    Par défaut
    Tout d'abord merci pour votre réponse.
    Ma requête n'est qu'une ébauche et révèle que je n'est pas encore assimiler correctement la bonne méthode.
    Vous avez raison quand vous dites que la quantité sortie c'est la somme des quantités commandés et de même pour les entrées.
    J'ai utilisé le MAX(ID) pour ne prendre en compte que les derniers ajouts. C'est à dire que lorsqu'il y a une entrée par exemple d'un produit = ""het24"
    la requête prenne la dernière entrée où le produit "het24" a été entré.

    En gros ce que je voudrais faire, mais ma requête est fausse, je voudrais que lorsqu'une commande ou une entrée son faites, la requête prend en compte les entrés et sortie du dernier mois.
    Car si j'ajoute à chaque fois des quantité dans la base de données dans 1an je vais me retrouver avec 12 500 entré et 11 000 sorties.
    J'espère que vous voyez ce que je veux dire.

    Le but étant de faire correspondre la quantité ajoutée (table entrée produit) avec la quantité entrée (table stock) et la quantité commandée(table commande client) avec la quantité sortie (table stock). Pour ensuite faire Q_entrée - Q_sortie = Q_en_stock.
    Nom : entrée.png
Affichages : 1090
Taille : 11,8 Ko
    Voici donc mon interface entrée produit. Lorsque je remplit mes cases et que je clique sur "Enregistrer" les informations se stocke dans ma base de données à la dernière ligne (info : ID autoIncrément):
    Nom : consultation.png
Affichages : 1043
Taille : 35,1 Ko
    La quantité ajoutée doit donc s'ajouter à la quantité entrée de ma table stock. De même pour les commandes.
    Je pense que ce serait plus sage de faire une grosse requête pour lier les 3 tables.
    Mais là je ne vois pas.
    Vous pouvez m'aider ?

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    je voudrais que lorsqu'une commande ou une entrée son faites, la requête prend en compte les entrés et sortie du dernier mois.
    Car si j'ajoute à chaque fois des quantité dans la base de données dans 1an je vais me retrouver avec 12 500 entré et 11 000 sorties.
    J'espère que vous voyez ce que je veux dire.
    Pas tout à fait. Vous voulez stocker toutes vos entrées et sorties ou cumuler ? (12500 entrées dans une table c'est pas grand chose entre nous)

    Je n'ai jamais écrit de gestion de stock mais théoriquement, lorsque vous faites une entrée, vous ajoutez un enregistrement dans votre table "d'entrées" (correspondant à la table des mouvements) et vous incrémentez la quantité dans la table de stock (le tout dans une même transaction). Donc il y a un insert et un update mais nul besoin de lier les deux tables.

    Maintenant pour faire un lien entre les différentes tables, il faut faire un select avec des sommes dans des sous-requêtes. Avec une table stock, une table mvt_in et une table mvt_out, ça donnerait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select stock.cd_product, stock.quantity, sum_quantity_in, sum_quantity_out from
    stock 
    join (select cd_product, sum(quantity) sum_quantity_in from mvt_in group by cd_product) sum_mvt_in
    on stock.cd_product = sum_mvt_in.cd_product
    join (select cd_product, sum(quantity) sum_quantity_out from mvt_out group by cd_product) sum_mvt_out
    on stock.cd_product = sum_mvt_out.cd_product
    Je n'ai pas testé la syntaxe mais ça peut te donner l'esprit.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 89
    Par défaut
    En gros, le chiffre 12 500 et 11 000 ne sont pas significatifs. C'est toutes les quantité ajoutées depuis le début. Ce serait intéressant d'avoir le cumul des entrées sorties du dernier mois comme je l'ai mentionné (après je ne sais pas si ceci est faisable) par exemple quand je consulte le stock le 31 du mois je peux voir combien de produit sont parti ce mois-ci et pareil pour l'entrée. Il faudrait peut être prendre un stock initial et y ajouter le dernier enregistrement je ne sais pas.
    En tout cas merci pour la requête je vais tester ça.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Ce serait intéressant d'avoir le cumul des entrées sorties du dernier mois comme je l'ai mentionné (après je ne sais pas si ceci est faisable) par exemple quand je consulte le stock le 31 du mois je peux voir combien de produit sont parti ce mois-ci et pareil pour l'entrée
    Il y a beaucoup de solutions pour arriver à tes fins. D'après moi, il faut que tu stockes toutes tes entrées et sorties. Maintenant si tu as peur de la volumétrie (tu utilises quoi comme SGBD ?), rien n'empêche de prévoir des purges de tables. Ensuite, cela te permettra de faire des requêtes de cumuls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(Quantity) from mvt_in where date_in between ... and ... and product_cd = ...

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

Discussions similaires

  1. [XL-2007] Tableau excel > macro pour faire correspondre plusieurs feuilles.
    Par DAVIDSAVOIE dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/02/2012, 15h12
  2. [SQL SERVER 2008] Requête sur plusieur Tables
    Par Phoquounet dans le forum Développement
    Réponses: 9
    Dernier message: 03/10/2011, 10h10
  3. Réponses: 3
    Dernier message: 19/01/2010, 16h56
  4. Réponses: 13
    Dernier message: 07/02/2008, 11h57
  5. [MS SQL] Remplacer des valeurs dans plusieurs tables
    Par salmoliv dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/10/2006, 17h31

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