[SQL] Requête SQL en vba

Fermé
sab - 17 avril 2003 à 11:17
Cqqn Messages postés 964 Date d'inscription vendredi 22 novembre 2002 Statut Membre Dernière intervention 1 avril 2010 - 2 mai 2003 à 11:57
j'ai un petit problème avec une requête sur access je ne n'arrive pas à faire une requete qui me permettra d'arriver à calculer la somme
alors je dois calculer la somme de deux quantités puis en faire la différence c-à-d que j'ai la quantité commandée et expédiée donc j'en fait la somme puis la difference mais cela dois se faire pour chaque produits
merci j'espère que vous avez compris c'est assez important que je finisse
A voir également:

17 réponses

letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
17 avril 2003 à 11:41
ce serait bien que tu donnes à quoi ressemble ta table et ce que tu veux obtenir...
0
en fait il y a 2 tables: contient(cip, code_com, quantite_com)
possède(cip code_com, num_lta, quantite_exp)
et donc je voufri faire une requete qui me cumule toutes les quantite_com et exp de chaque produit puis je pourai alors faie ensuite la differencepour voir ce qui reste à livrer de chaque produit
merci
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
18 avril 2003 à 09:06
j'essairais quelque chose dans ce gout là.. mais je ne suis pas une pro de SQL...

select C.code_com,
(sum(C.quantite_com) - sum(P.quantite_exp)) as diff

from contient C,
possede P

group by C.code_com






Letissya
0
Oui mais je n'arrive pas à regrouper le produit qui aurra été commandé plusieurs fois en faisant cette requete le produit qui est commandé plus d'une fois apparaitra le nombre de fois qu'il a été commandé c'est comme si c'etait un produit different
merci de ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai vraiment besoin d'aide, vous êtes tous partis en vacances ou bien c'est que vous omprenez pas ce que je raconte.
Aidez moi !!!!!!!!!!
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
25 avril 2003 à 09:20
Bon je vais essayer de t'aider ...

donne moi un exemple du contenu de tes tables et ce que tu veux obtenir comme résultat après la requête...
il me semble comprendre ce que tu veux mais je préfère être sure pour ne pas chercher pour rien...

Letissya
0
alors c'est une table qui gére des produits
plusieurs produits peuvent avoir plusieurs commandes
je veux gérer les expéditions et ça consiste à:
faire les cumel des quantité commandées et expédiées par exemple j'ai un preoduit F qui est ommandées plusierus fois, s première commande aura le numéro 1 sera faite le 12/02/02 et il aura comme quantité commandées 20 puis il est recommandées donc numéro 2 le 12/02/02 et là la quantité sera de 30
donc moi je veux qu'à ce moment il m'affiche 50 et non qu'il prennent par defaut 20
et c'est pareil pour les expéditions puis ensuite j'en fait les difference et je vérifie le reste à expédier.
VOILA
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
25 avril 2003 à 10:01
bon si je comprends bien tu as une table du genre :
cip code_com quantite_com
1 F 20
2 F 30



et tu voudrais en sortie

F 50

et

select Code_com, sum(quantite_com)
group by code_com



ça ne fonctionne pas ???


Letissya
0
oui
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
25 avril 2003 à 10:37
oui quoi ???


oui c'est ça que tu veux en sortie ...
oui la requête ne fonctionne pas..
oui la requête fonctionne..

si tu n'es pas plus explicite je vais pas pouvoir t'aider !!!

Letissya
0
oui tu as très bien cmpris la requete et le problème
oui repond à la question "ça ne fonctionne pas ???"
oui la requete ne fonctionne pas
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
25 avril 2003 à 11:31
voilà un exemple que j'ai testé en ligne...
voici la table qu'on a disposition
si tu regardes tu remarques que l'item "tent" si trouve plusieurs fois avec un prix différent


customerid order_date item quantity price

10330 30-Jun-1999 Pogo stick 1 28.00
10101 30-Jun-1999 Raft 1 58.00
10298 01-Jul-1999 Skateboard 1 33.00
10101 01-Jul-1999 Life Vest 4 125.00
10299 06-Jul-1999 Parachute 1 1250.00
10339 27-Jul-1999 Umbrella 1 4.50
10449 13-Aug-1999 Unicycle 1 180.79
10439 14-Aug-1999 Ski Poles 2 25.50
10101 18-Aug-1999 Rain Coat 1 18.30
10449 01-Sep-1999 Snow Shoes 1 45.00
10439 18-Sep-1999 Tent 1 88.00
10298 19-Sep-1999 Lantern 2 29.00
10410 28-Oct-1999 Sleeping Bag 1 89.22
10438 01-Nov-1999 Umbrella 1 6.75
10438 02-Nov-1999 Pillow 1 8.50
10298 01-Dec-1999 Helmet 1 22.00
10449 15-Dec-1999 Bicycle 1 380.50
10449 22-Dec-1999 Canoe 1 280.00
10101 30-Dec-1999 Hoola Hoop 3 14.75
10330 01-Jan-2000 Flashlight 4 28.00
10101 02-Jan-2000 Lantern 1 16.00
10299 18-Jan-2000 Inflatable Mattress 1 38.00
10438 18-Jan-2000 Tent 1 79.99
10413 19-Jan-2000 Lawnchair 4 32.00
10410 30-Jan-2000 Unicycle 1 192.50
10315 2-Feb-2000 Compass 1 8.00
10449 29-Feb-2000 Flashlight 1 4.50
10101 08-Mar-2000 Sleeping Bag 2 88.70
10298 18-Mar-2000 Pocket Knife 1 22.38
10449 19-Mar-2000 Canoe paddle 2 40.00
10298 01-Apr-2000 Ear Muffs 1 12.50
10330 19-Apr-2000 Shovel 1 16.75


en faisant la requête suivante
select item, sum(price)
FROM LA_TABLE
GROUP BY item ;

j'obtiens le résultat suivant ...



Bicycle 380.50
Canoe 280.00
Canoe paddle 40.00
Compass 8.00
Ear Muffs 12.50
Flashlight 32.50
Helmet 22.00
Hoola Hoop 14.75
Inflatable Mattress 38.00
Lantern 45.00
Lawnchair 32.00
Life Vest 125.00
Parachute 1250.00
Pillow 8.50
Pocket Knife 22.38
Pogo stick 28.00
Raft 58.00
Rain Coat 18.30
Shovel 16.75
Skateboard 33.00
Ski Poles 25.50
Sleeping Bag 177.92
Snow Shoes 45.00
Tent 167.99
Umbrella 11.25
Unicycle 373.29


et tu constates que pour l'item "tent" la somme a bien été faite et il n'y a pas de doublons ...


je ne vois pas pourquoi ça ne fonctionne pas sur ta table...


Letissya
0
Oh fait là oùça bloque c'est quand je met les trois tables ensemble
contient(cip, code_com, qté_com)
possède(cip, num_lta, code_com, qté_exp)
commande(code_com, date_com)
donc je veux faire afficher le cip, les dates de commandes, la quantité commandées, la quantité expédiées et la difference entre les deux quantitées.
Mais le problèmec'est que si j'ai pas commancé à livrer une commande elle apparaitre pas dans la requete car elle n'est pas enregistrée dans la table possède.
Quand je fait la requete avec seulement la table contient et possède ça marche mais dès que je met en plus la commande ça ne marche pas mais j'en ai malheureusement besoin pour connaitre la date de la commande des produits
bien entendu quand j'utilise les trois tables je ne fait pas la difference des quantitées
0
peut être que ça bloque car j'ai deux quantité de deux tables differentes
quantité commandées de contient et quantité expédiées de possède
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
28 avril 2003 à 09:11
montre moi ta requête peut-etre que tu fais juste une petite erreur....

Letissya
0
alors ça c'est la requete où j'ai l'apparition des données (avec date com ...)
SELECT Commande.date_com, Contient.quantite_com, possède.quantite_Exp, Sum(contient.quantite_com)-Sum(possède.quantite_Exp) AS Expr1
FROM (Commande INNER JOIN Contient ON Commande.code_com = Contient.code_com) INNER JOIN possède ON Commande.code_com = possède.code_com
WHERE (((possède.CIP)=[Formulaires]![NouvelleExpédition]![Expédition]![ListeCIP]))
GROUP BY Commande.date_com, Contient.quantite_com, possède.quantite_Exp;
c'est ce dont je t'avais parlé avec le problème des tables

puis j'ai une autre requete que je met dans le code et qui me calcule cette fois la totalité des quantité com - exp de chaque produit
Set req1 = db.OpenRecordset("SELECT possède.CIP, sum(Contient.quantite_com), sum(possède.quantite_Exp) FROM Contient INNER JOIN possède ON Contient.CIP = possède.CIP where contient.CIP='" & Me![ListeCIP] & "' group by possède.CIP;")
nb = req1(1) - req1(2)
Me![reste] = nb
voila j'espère que t'as compris ce que je t'ai écris et que tu m'aidera
merci
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
29 avril 2003 à 09:31
Bon je connais pas la syntaxe vba...
mais bon je vais essayer quand meme... apparement c'est dans ta première requete que tu as un pb ?

tu veux pouvoir afficher le cip (ce serait bien que tu me dises vite fait ce que c'est), la date de ta commande, qté com, qté exp, et la différence pour chaque produit... ?

ben je ferais la meme requete que toi !!!!

select
contient.cip,
commande.date_com,
contient.quantite_com,
possede.quantite_exp,
sum(quantite.com)-sum(quantite.exp) as diff



from contient,
possede,
commande

where contient.code_com=possede.code_com and
contient.code_com=commande.code_com

group by

contient.cip,
commande.date_com,
contient.quantite_com,
possede.quantite_exp,


Il y a juste ta comparaison avec le cip que je comprends pas...(dans ton WHERE)

est ce que tu as testé sans le 'WHERE' ... ?

je sais pas trop ce qui ne vas pas ... tu devrais peut-etre laissé un message sur developper.com... il y a des pros là bas...


Letissya
0
sab > letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005
29 avril 2003 à 10:00
alors le cip c'est un numéro de produit, la reference donc c'est la clé primaire de ma table produit
la comparaison dans mon where c'est par rapport à mon controle en fait j'ai une liste deroulante ou je choisi le produit ouis oar ce choix j'ai dans le reste du formuliare les renseignements par rapport au produit choisi
j'ai reessayé la requete et c'est la meme chose
je voudrai que ça m'affiche toute les quantité (com et exp) avec la date com du produit mais si je n'ai pas commencé à expédier une comande et bien il ne l'affiche pas
par exemple j'ai le produit f qui est commandé le 19/01/2002 et le 23/04/2002 il a 2 code_com different puisque c'est pas la meme commande et à des quantité differente
la difference c'est que le deuxième n'est pas dans la table possède car il n'a pas encore été expédié
donc quand je fais la requete c'est comme si ça n'existe pas
voila
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5 > sab
29 avril 2003 à 10:13
je comprends le problème !

et si tu mets comme condition le cip plutot que le code_com, ça marcherait peut-etre..

select
contient.cip,
commande.date_com,
contient.quantite_com,
possede.quantite_exp,
sum(quantite.com)-sum(quantite.exp) as diff



from contient,
possede,
commande

where contient.cip=possede.cip and
contient.code_com=commande.code_com

group by

contient.cip,
commande.date_com,
contient.quantite_com,
possede.quantite_exp,






Letissya
0
sab > letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005
29 avril 2003 à 10:46
oui ça l'affiche mais y a 1 petit problème c'est qu'il y a une quantité par defaut dans la quantité exp , dans l'exemple que je t'ai donné ou donc pour le meme produit j'ai deux commande et bien il affiche les deux mais il affecte par defaut dans la quantité exp où il devrai rien y avoir la quantité de la première commande du produit
pour la produit f je devrai avoir ça
date_com 19/01/2002 la quatité com 3 quantité exp 1
23/04/2002 2
alors que la requete m'affiche en plus le 1 pour la deuxième commande
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5 > sab
29 avril 2003 à 11:08
peut-etre que de mettre la condition

contient.date_com = commande.date_com

il faut le faire sur la table possede :

possede.date_com=commande.date_com
voir peut-etre les deux conditions en meme temps...

parce qu'apparemen tu peux commander à une certaine date et expédier à une autre... et avec la requete qu'on a faite jusqu'a maintenant on ne tiens pas compte de la date de possede, mais juste de celle de contient...
c'est pas tres clair.. mais j'ai l'impression que ça vient de là..
enfin essais (si tu ne l'as pas déjà fait)
mais j'ai un peu du mal... sans voir le contenu des tables c'est pas évident.. tu n'aurais pas ton code en ligne ou un fichier à m'envoyer...
pour que je vois un peu mieux tes tables et surtout le résultat des requête pour comprendre ou ça ne va pas..

Letissya
0
Salut,

Je fais une application sous Access 2000: un formulaire de 2 champs où on saisie des données ( un numero et une date) et je veux les stocker dans une table déjà créée avec un id généré et unique (clef primaire).

Pour le stockage, quand on clique sur le bouton 'OK' du formulaire, faut il créer une requête sql 'insert' avec les valeurs ou utiliser des fonctions VB déjà existantes?? je suis bloqué... (et ça doit pas etre compliqué)

Un petit bout de code svp... ou un conseil

Merci d'avance
0
Utilisateur anonyme
29 avril 2003 à 12:02
crée un nouveau msg stp, ne poste pas à la suite d'un problème de qqun d'autre

kinder.surprise,
le maton du matou
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
29 avril 2003 à 18:19
bon j'ai trouver une syntage du genre CASE WHEN condition THEN expression... mais je ne connais pas trop..


select
contient.cip,
commande.date_com,
contient.quantite_com,
case when (possede.cip=contient.cip and
contient.code_com=commande.code_com and
possede.code_com!=commande.code_com)then
0 as qte_exp
else possede.quantite_exp as qte_exp,

sum(contient.quantite_com)-sum(qte_exp) as diff



from contient,
possede,
commande

where contient.cip=possede.cip and
contient.code_com=commande.code_com and
possede.code_com=commande.code_com

group by

contient.cip,
commande.date_com,
contient.quantite_com,
possede.quantite_exp,


je sais pas si ça marche mais en gros j'essais de dire que si la commande n'est pas expédiée (dans le case) alors la qté_exp =0
sinon c'est égale à la quantité qu'on trouve dans possede au numréo de commande correspondant..

je sais pas trop si c'est clair.. mais j'ai pas trouve trop d'exemple pour le case...

en plus c'est pour la norme SQL2 je suis pas sure que ce sera compatible...

Letissya
0
sab > letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005
30 avril 2003 à 23:23
oui mais j'ai pas trop compris ce que tu fais
et on m'a di queje pouvais utiliser les right et left qui me permettrai de récupérer tous les produits meme ceux qui ne sont pas dans la table possède
il faut que je fasse des recherches dessus car je ne sais pas trop comment les utiliser
mais si t'as une idée ça serai super
merci
0
Voila, je ne sais pas si ces fonctions existent dans vba mais elles sont bien connues sous ORACLE...., sinon tu peux chercher s'il ont leurs equivalents ...
la fonction "NVL(x,y)" means: if "x" null, use "y"
// "(+)" le plus entre parentheses --> pour que toutes les lignes soient prises en compte ex: Table1.x = Table2.x (+) --> indique qu'à l'execution de la requette il faut se baser sur Table1 càd que s'il n y a pas correspondance dans la Table2 ne pas soter la ligne dans la Table1

autre chose, du moment que ds une cde un produit n'est cité qu'une seule fois alors n'utilise pas "Sum" et n'utilise pas aussi le "group by" : voici la requette et bonne chance

select
contient.cip, date_com, quantite_com, quantite_exp,
quantite_com - NVL(quantite_exp,0) as diff

from contient, possede, commande

where contient.code_com=commande.code_com
and contient.code_com=possede.code_com (+)
and contient.cip=possede.cip (+);
0
Cqqn Messages postés 964 Date d'inscription vendredi 22 novembre 2002 Statut Membre Dernière intervention 1 avril 2010 21
2 mai 2003 à 11:57
Bonjour toutes et tous,
le problème, j'ai regardé vite fait, c'est que dans une table certaines références manquent par rapport à une autre table.
Ce genre de difficulté se résoud avec les jointures:

FROM (Commande INNER JOIN Contient ON Commande.code_com = Contient.code_com) INNER JOIN possède ON Commande.code_com = possède.code_com

deviendrait:
FROM (Commande INNER JOIN Contient ON Commande.code_com = Contient.code_com) LEFT JOIN possède ON Commande.code_com = possède.code_com

Ainsi tu devrais avoir tous les enregistrements de la table Commande.
Si tu utilises l'interface ACCESS, ça a l'air d'être le cas, tu fais un click droit sur le lien entre chaque table, et là tu choisis propriétés de la jointure.
Au bout de quelques essais tu devrais avoir pigé le truc.
Par contre ce type de jointure (left join, right join) impose certaines conditions, par exemple le résultat sera "NULL"(pas zéro) pour les lignes où l'une des deux références manquent, mais il y a toujours moyen de bidouyer en conditionnant le champ d'affichage, si NULL alors aficher contient.quantite_com.
Enfin voilà j'espère que ça t'aura aidé.


Le respect, y'a que ça de vrai!
Entre autres.
0