PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Une seule requête sql au lieu d'une boucle
Une seule requête sql au lieu d'une boucle
Started by simon, Sep., 25 2017 8:22 AM - 9 replies
Posted on September, 25 2017 - 8:22 AM
Bonjour

Je voudrais afficher le journal de caisse mensuel (12 mois) (total esp, total chq, total crdit)

TableSupprimeTout(TableJournalCaisse)

POUR K= 1 A 12
mois est une chaîne=ChaîneConstruit(" AND VENTES.Mois_Doc ='%1' ",K)
fnContenuRequete = [
select VENTES.Mois_Doc as Mois_Doc ,
sum(case when VENTES.ETATCOMMANDE in (%1) AND VENTES.ModeReglement ='ESPECE'
then VENTES.TOTALTTC else 0 end) as V_ESP,
sum(case when VENTES.ETATCOMMANDE in (%1) AND VENTES.ModeReglement ='EN COMPTE'
then FCommandes.TOTALTTC else 0 end) as V_CRD,
sum(case when VENTES.ETATCOMMANDE in (%1) AND VENTES.ModeReglement ='CHEQUE'
then VENTES.TOTALTTC else 0 end) as V_CHQ,
// Partie avoir
sum(case when VENTES.ETATCOMMANDE in (%2) AND VENTES.ModeReglement ='ESPECE'
then VENTES.TOTALTTC else 0 end) as A_ESP,
sum(case when FCommandes.ETATCOMMANDE in (%2) AND VENTES.ModeReglement ='EN COMPTE'
then VENTES.TOTALTTC else 0 end) as A_CRD,
sum(case when VENTES.ETATCOMMANDE in (%2) AND VENTES.ModeReglement ='CHEQUE'
then VENTES.TOTALTTC else 0 end) as A_CHQ

FROM VENTES

WHERE
VENTES.EtatTransfert <> '1'
%3
GROUP BY Mois_Doc
ORDER BY Mois_Doc ASC
]
nContenuRequete=ChaîneConstruit(fnContenuRequete,"'FA'","'AV'",mois )

SI PAS HExécuteRequêteSQL(fnsdSourceRequete,hRequêteDéfaut,fnContenuRequete)ALORS
Erreur(HErreurInfo())
RETOUR
FIN
SI HNbEnr(fnsdSourceRequete)<>0 ALORS
TableAjouteLigne(TableJournalCaisse,...
K,...
(fnsdSourceRequete.V_esp-fnsdSourceRequete.A_esp),...
fnsdSourceRequete.V_CHQ,...
fnsdSourceRequete.V_CRD)
FIN
FIN

HAnnuleDéclaration(fnsdSourceRequete)


Ma question:
Pour rendre mon code plus rapide je veux éviter la boucle POUR mais je n'arrive pas comment je lance une requête sql qui
me renvoie les 12 mois, avec une boucle sur le résultat.

Merci d'avance pour vos aides
Registered member
841 messages
Popularité : +19 (27 votes)
Posted on September, 25 2017 - 9:37 AM
Bonjour,

Retirer la clause pour le mois puis effectuer les requêtes mois sur la requête en mémoire. En interne les requêtes sont instantanées et il n'y aura qu'une requête en externe.

--
Cordialement,
Camus
Posted on September, 25 2017 - 11:31 AM
Merci camus

je vais enlevé la clause mois est une chaîne=ChaîneConstruit(" AND VENTES.Mois_Doc ='%1' ",K) et la boucle POUR et je vais tester
Registered member
841 messages
Popularité : +19 (27 votes)
Posted on September, 25 2017 - 12:46 PM
En fait je me suis rendu compte à posteriori que quelqu'un avait donné la même solution sur un post précédent

--
Cordialement,
Camus
Registered member
491 messages
Popularité : +24 (30 votes)
Posted on September, 25 2017 - 1:21 PM
je pense qu'il y a moyen de serieusement optimiser ta requete en sql, tu est en quelle version de windev?

--
José
Posted on September, 25 2017 - 3:03 PM
Bonjour José

WD 21
Registered member
491 messages
Popularité : +24 (30 votes)
Posted on September, 25 2017 - 3:18 PM
il y a une date de facture dans ton fichier?
quel appellation?

--
José
Registered member
491 messages
Popularité : +24 (30 votes)
Posted on September, 25 2017 - 3:20 PM
et a quoi correspond : FCommandes ?

--
José
Registered member
491 messages
Popularité : +24 (30 votes)
Posted on September, 25 2017 - 4:12 PM
dsl, bonjour aussi ^^

--
José
Registered member
491 messages
Popularité : +24 (30 votes)
Posted on September, 27 2017 - 12:15 PM
du coup, on dirait que t'es pas interessé?

--
José