PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Regrouper 2 requêtes
Regrouper 2 requêtes
Débuté par Wind, 23 mar. 2017 19:27 - 4 réponses
Posté le 23 mars 2017 - 19:27
Bonjour tout le monde

Je voulais afficher dans une table mémoire et depuis un seul fichier "COMANDES" tous les clients et leurs mouvements (Client,TotalVente , TotalAvoir, Solde),donc j'ai crée le code sql suivant :

sDateMin est une chaîne= SAI_Du
sDateMax est une chaîne= SAI_Au

sEtatVente est une chaîne="FA,BL" //Ventes
sEtatAvoir est une chaîne="AV,RB" / Avoir/Retour

sContenuReq_Facture est une chaîne="SELECT COMANDES.NumClient AS NumClient, "...
+"SUM(COMANDES.TOTALTTC) AS la_somme_vente FROM COMANDES WHERE "...
+"COMANDES.dateDoc BETWEEN ' "+sDateMin+" ' AND '"+sDateMax+"' "...

+"AND COMANDES.ETATCOMMANDE IN {sEtatVente} "... // VENTES .................

+"GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE"

Jusqu'à ici l'affichage s'est bien fait (les clients et leurs sommes des ventes)

Alors comment je concaténé le code sql ci dessus ,qui me permet de calculer le total des avoirs, avec le code ci dessous
pour avoir une seul code sql

"SELECT COMANDES.NumClient AS NumClient, "...
+"SUM(COMANDES.TOTALTTC) AS la_somme_vente FROM COMANDES WHERE "...
+"COMANDES.dateDoc BETWEEN ' "+sDateMin+" ' AND '"+sDateMax+"' "...

+"AND COMANDES.ETATCOMMANDE IN {sEtatAvoirs} "... // AVOIR ........

+"GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE"

Je suis bloqué donnez moi une piste

Merci d'avance
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 23 mars 2017 - 23:35
Bonsoir,

En utilisant le mot "UNION" cela devrait donner un truc du genre (je vous conseille d'utiliser la notation [] et ChaineConstruit() pour fabriquer votre requête, plutôt que la concaténation avec "+" qui devient vite illisible)
RequeteGenerale est une chaîne = [
SELECT COMANDES.NumClient AS NumClient, SUM(COMANDES.TOTALTTC) AS la_somme_vente FROM COMANDES
WHERE COMANDES.dateDoc BETWEEN '%1' AND '%2'
AND COMANDES.ETATCOMMANDE IN {%3}
GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE
UNION
SELECT COMANDES.NumClient AS NumClient, SUM(COMANDES.TOTALTTC) AS la_somme_vente FROM COMANDES
WHERE COMANDES.dateDoc BETWEEN '%1' AND '%2'
AND COMANDES.ETATCOMMANDE IN {%4}
GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE
]
RequeteGenerale = ChaîneConstruit(RequeteGenerale, sDateMin, sDateMax, sEtatVente, sEtatAvoir)
Posté le 24 mars 2017 - 08:17
Philippe Pasquali vient de nous annoncer :
Bonsoir,

En utilisant le mot "UNION" cela devrait donner un truc du genre (je vous
conseille d'utiliser la notation [] et ChaineConstruit() pour fabriquer votre
requête, plutôt que la concaténation avec "+" qui devient vite illisible)
RequeteGenerale est une chaîne = [
SELECT COMANDES.NumClient AS NumClient, SUM(COMANDES.TOTALTTC) AS
la_somme_vente FROM COMANDES WHERE COMANDES.dateDoc BETWEEN '%1' AND '%2'
AND COMANDES.ETATCOMMANDE IN {%3}
GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE
UNION
SELECT COMANDES.NumClient AS NumClient, SUM(COMANDES.TOTALTTC) AS
la_somme_vente FROM COMANDES WHERE COMANDES.dateDoc BETWEEN '%1' AND '%2'
AND COMANDES.ETATCOMMANDE IN {%4}
GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE
]
RequeteGenerale = ChaîneConstruit(RequeteGenerale, sDateMin, sDateMax,
sEtatVente, sEtatAvoir)


faire comme ceci (à corriger si nécessaire)

Req est chaine = [
select COMANDES.NumClient,
sum(case when COMANDES.ETATCOMMANDE in (%1) then COMANDES.TOTALTTC else
0 end) as la_somme_vente,
sum(case when COMANDES.ETATCOMMANDE in (%2) then COMANDES.TOTALTTC else
0 end) as la_somme_avoir
from COMANDES
COMANDES.dateDoc BETWEEN %2 and %3
GROUP BY COMANDES.NumClient
]

sEtatVente = "'V','X'"
sEtatAvoir = "'A','Y'"

Req = ChaîneConstruit(Req,sEtatVente, sEtatAvoir,sDateMin, sDateMax)
etc....

--
Cordialement JeAn-PhI
Posté le 24 mars 2017 - 08:45
Bonjour Pasquali et merci de votre réponse

Oui ça marche, mais par programmation j'arrive pas à différencier entre les ventes et les avoirs tant que ayant le même nom (la_somme_vente) parce que je veux calculer et afficher la différence entre les ventes et les avoirs
ResultatFinal =la_somme_vente -la_somme_vente(Avoir)


RequeteGenerale est une chaîne = [
SELECT COMANDES.NumClient AS NumClient, SUM(COMANDES.TOTALTTC) AS la_somme_vente FROM COMANDES
WHERE COMANDES.dateDoc BETWEEN '%1' AND '%2'
AND COMANDES.ETATCOMMANDE IN {%3}
GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE
UNION
SELECT COMANDES.NumClient AS NumClient, SUM(COMANDES.TOTALTTC) AS la_somme_vente FROM COMANDES
WHERE COMANDES.dateDoc BETWEEN '%1' AND '%2'
AND COMANDES.ETATCOMMANDE IN {%4}
GROUP BY COMANDES.NumClient,COMANDES.ETATCOMMANDE
]
RequeteGenerale = ChaîneConstruit(RequeteGenerale, sDateMin, sDateMax, sEtatVente, sEtatAvoir)
SI PAS HExécuteRequêteSQL(sdSourceRequete,hRequêteDéfaut,ContenuRequete)ALORS
Erreur(HErreurInfo())
RETOUR
FIN
POUR TOUT sdSourceRequete
Trace(sdSourceRequete.NumClient, "Vente = "+sdSourceRequete.la_somme_vente, "Avoir = "+sdSourceRequete.la_somme_vente)


FIN
Voila le résultat dans le trace

1 Vente = 3804 Avoir = 3804
5 Vente = 3907.2 Avoir = 3907.2
6 Vente = 9834 Avoir = 9834
7 Vente = 3323.6 Avoir = 3323.6
8 Vente = 15320.8 Avoir = 15320.8
9 Vente = 16969.8 Avoir = 16969.8
11 Vente = 15341.35 Avoir = 15341.35
12 Vente = 1654.4 Avoir = 1654.4
13 Vente = 595.2 Avoir = 595.2

1 Vente = 155 Avoir = 155
4 Vente = 1202 Avoir = 1202
5 Vente = 120 Avoir = 120
7 Vente = 0 Avoir = 0
9 Vente = 223.2 Avoir = 223.2
11 Vente = 96 Avoir = 96

Merci de votre aide
Posté le 24 mars 2017 - 10:09
Bonjour JeAn-PhI

Merci pour ton aide ca marche, seulement tu es oublier WHERE et remplacer 2% avec %

Merci