Gambas France BETA


Pas de compte ? Incription

Requete SQL (compliquée ?)

Ce sujet est résolu.

12
AuteurMessages
manu#1 Posté le 13/6/2011 à 07:44:00
Avec Gambas ca roule !Bonjour,

C'est une question SQL

Je souhaite faire un tableau comme ceci :

[table] Produit Vente Stock Fin Marteau 10 5 Scie 5 Cutter 18 Tourne vis 4 8 [/table]

J'ai deux tables :

Table Vente : idProduit - NomProduit - QteVente
Table Stock : idProduit - NomProduit - QteStock

Avez vous une idée du type de jointure a faire et faut t'il rajouter une clause WHERE ?

Merci d'vance
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
manu#2 Posté le 13/6/2011 à 21:49:00
Avec Gambas ca roule !Je crois qu'il faut faire deux requetes, une sur chaque table et les concatener avec la clause UNION.

Mais je ne suis pas sure que cette clause soit implementé dans sqlite car ca ne semble pas fonctionner.!

Quelqu'un sais t'il ?



Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Prokopy#3 Posté le 13/6/2011 à 23:47:00
Kinder PinguiSalut manu,

Je pense qu'une requête comme ça devrait aller pour ça :

1
SELECT Vente.idProduit, Vente.NomProduit, Vente.QteVente, Stock.QteStockFROM VenteINNER JOIN Stock ON Vente.NomProduit = Stock.NomProduit


Mais par contre je me demandais, ça ne serait pas plus simple d'avoir une seule table "Produits" qui contienne les nombres de ventes et les quantités en stock ? Genre ça :

[table] idProduit NomProduit QteVente QteStock 1 Marteau 598 2 Tournevis 46 12[/table]

Tu ne penses pas ? À moins qu'il y ait d'autres choses dans tes tables. ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
manu#4 Posté le 14/6/2011 à 12:35:00
Avec Gambas ca roule !Bon à force de simplifier ma question, je ne pose pas la bonne ;)

J'explique mon problème.

Je fabrique du fromage que je vends à des revendeurs. Toutes les semaines je les appel pour savoir ce qui leur reste. En fonction de leur stock et de leur précédente livraison, je peux déterminer ce qu'ils ont vendus et ajuster ma livraison de la semaine.

Je veux donc une requête qui me donne pour un client donné, tous les produits livrés avec leur quantité ainsi que tous les produits en stock avec la quantité.


Je peux donc avoir des produits en stock pour lequel il n'y a pas de livraison, avoir des produits en stock pour lequel il y a livraison et pas de produits en stock pour lequel il y a une livraison.

Voici la structure de ma BDD Sqlite3 : ( bon c'est pas super nickel mais ca aide bien.... :) )

[/url][/img]



Voici ce que j'arrive à faire


[[/url][/img]

Mais je n'arrive pas à récupérer les données de la table StockClient sans avoir plein de doublons ....




Voila, j' espère avoir été clair.

Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
jeanyvon#5 Posté le 14/6/2011 à 15:27:00
Gambas? Ma! Et gustoSalut
Il y a une instruction avec select qui permet d'éliminer les doublons.... Et bien sur je ne la retrouve plus...
Mille excuses.
jy
Vieillir? On peut retarder mais pas y échapper!
Prokopy#6 Posté le 14/6/2011 à 17:25:00
Kinder PinguiC'est pas DISTINCT ?

1
SELECT Distinct champ1, Distinct champ2, ...


:)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
jeanyvon#7 Posté le 15/6/2011 à 06:57:00
Gambas? Ma! Et gustoMais bien sur!
avec ta réponse Manu devrait se débrouiller!
Il est entrain de se faire une GPAO super!
Jy
Vieillir? On peut retarder mais pas y échapper!
manu#8 Posté le 15/6/2011 à 09:27:00
Avec Gambas ca roule !Heu..... c'est quoi une GPAO ? :oops:

Bon j'essaye le SELECT DISTINCT mais je suis pas sure que ce soit ca le pb......

Je vous tiens au courant de toute facon

Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
jeanyvon#9 Posté le 15/6/2011 à 11:06:00
Gambas? Ma! Et gustoHeu Gestion de Production Assisté par Ordinateur mais ça serait plutôt une Gd'EAO
Regarde la syntaxe: il me semble que tu dois fournir le Nb de doublon mais je ne suis pas sur!
Vieillir? On peut retarder mais pas y échapper!
spheris#10 Posté le 15/6/2011 à 18:01:00
Ce n'est pas plutôt un GPFM ?

Gestion Pour les Fromages de Manu...
:geek: :geek:
;)
manu#11 Posté le 22/6/2011 à 20:59:00
Avec Gambas ca roule !Bon j'ai essayé SELECT DISTINCT et ca ne change rien, je ne suis pas surpris, ce ne sont pas vraiment des doublons en fait... :oops:

Je crois qu'il faut mofifier la liason ou rajouter une clause WHERE mais là honetement je sais pas trop quoi mettre ... :confused:

Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
jeanyvon#12 Posté le 23/6/2011 à 06:51:00
Gambas? Ma! Et gustoSalut,
là c'est trop calé pour moi. :drunken:
Tu devrais essayé sur un forum mysql
quand on arrive à ce niveau de requête il faut être un pro! Il y en a peut être sur ce forum
A+
JY
Vieillir? On peut retarder mais pas y échapper!
Prokopy#13 Posté le 23/6/2011 à 19:39:00
Kinder PinguiManu,

Si j'ai bien compris, je pense que ce qu'il faudrait faire c'est deux requêtes séparées, car leur sujet est différent.
La première tu as les quantités de la dernière livraison, la deuxième les quantités en stock :

Requête 1 (dernière llivraison) :

[table]FromageQuantitéComté12Edam14[/table]

Requête 2 (stocks) :

[table]FromageQuantitéComté32Edam28[/table]

Ceci étant pour un seul et même client.
J'ai bien résumé la situation ou je suis encore à côté ? ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
manu#14 Posté le 24/6/2011 à 05:50:00
Avec Gambas ca roule !Oui Prokocopy c'est exactement ca sauf que je ne produit ni de l''Edam, ni du Comté ;).

Ok pour faire deux requêtes séparées mais après comment je met ça dans un gridview ?

Ou peut être faire des sous requêtes pour avoir un seul résultat de requête a la fin ?
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Prokopy#15 Posté le 24/6/2011 à 20:24:00
Kinder Pingui
c'est exactement ca sauf que je ne produit ni de l''Edam, ni du Comté .


Rhoo mince ce sont mes préférés. :tongue:
Bon j'ai fait des tests de mon côté, et j'ai fini par trouver. J'ai juste enlevé les champs dont je ne me servirai pas dans la requête :

Table "clients" :


Table "fabrications" (supposées ;) ) :


Table "livraisons" :


Table "stockClient" :



Je te laisserai réadapter les noms au besoin. :)

L'idée est simple et c'est comme tu as dit : il suffit de faire deux sous-requêtes puis de les assembler.
Je vais ici prendre le cas du client numéro 1 (Toto).
Voici la première (les stocks) :

1
SELECT idFabrication, quantite AS qteStock, dateReleve, Max(dateReleve) FROM stockClient Where idClient = 1 Group By idFabrication ORDER BY idFabrication


C'est simple : on veut uniquement le dernier relevé (= le relevé le plus récent) des stocks de Toto. On utilise donc la fonction d'agrégat Max(). Seulement, on ne veut pas le tout dernier relevé, mais le dernier relevé de chaque type de fabrication. On va donc utiliser la commande Group By pour avoir ça. Ensuite, on filtre les stocks de Toto avec la clause Where.
Tu noteras que je renomme le champ quantite pour éviter les conflits avec l'autre requête. ;)

Voici le résultat de cette requête :



Ensuite, on passe à la deuxième, qui est quasiment identique :

1
SELECT idFabrication, quantite AS qteLivraison, datelivraison, Max(livraisons.datelivraison) FROM livraisons Where idClient = 1 Group By idFabrication ORDER BY idFabrication


... et dont voici le résultat :



Maintenant, on mélange les deux pour donner une requête SQL qui envoie du pâté comme dirait l'autre. :geek:

1
SELECT qteLivraison, qteStock, clients.nom AS nomClient, fabrications.nom AS nomFabrication, datelivraison, dateReleve FROM (Select idFabrication, quantite AS qteLivraison, datelivraison, Max(livraisons.datelivraison) FROM livraisons Where idClient = 1 Group By idFabrication ORDER BY idFabrication ) derniereslivraisonsLeft Join (Select idFabrication, quantite AS qteStock, dateReleve, Max(dateReleve) FROM stockClient Where idClient = 1 Group By idFabrication ORDER BY idFabrication) stocks ON derniereslivraisons.idFabrication = stocks.idFabricationInner Join clients ON clients.id = 1Inner Join fabrications ON fabrications.id = Ifnull(derniereslivraisons.idFabrication, stocks.idFabrication)


D'abord on prend uniquement ce qui nous intéresse avec Select. Ensuite on fait une jointure externe (depuis la table de gauche, ici derniereslivraisons) avec Left Join, de façon à avoir dans les résultats les livraisons qui n'ont pas de stock associé. Si au contraire tu veux avoir les stocks qui n'ont pas de livraisons associées, remplace par Right Join. :)
Ensuite on fait quelques jointures pour avoir les informations complémentaires comme les noms du client et des produits.
Petit tour de passe-passe avec la jointure sur la table fabrications. Techniquement les deux idFabrication (des tables livraison et stock) sont identiques, mais comme on a fait une jointure externe, dans le cas où l'on a une livraison mais pas de stock associé (ou vice-versa), l'un des deux peut valoir NULL (mais pas les deux !). Si l'un des deux vaut null, la fonction IfNull() prendra l'autre, et le problème est réglé. :)

Voici le résultat de cette magnifique requête :



Voilàvoilà. Juste un dernier truc :

Oui Prokocopy

Tu mets quoi dans tes fromages ? :D
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
12