PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → OPTIMISATION DE CODE POUR STATISTIQUE GRAPHE
OPTIMISATION DE CODE POUR STATISTIQUE GRAPHE
Iniciado por THINK, 10,nov. 2018 07:56 - 12 respuestas
Miembro registrado
13 mensajes
Publicado el 10,noviembre 2018 - 07:56
Je le trouve long et je souhaite exécuter le moins possible de requête pour la vitesse. j’exécute 12 fois la même requête, vu mon niveau de développement c'est tout ce que je puisse faire.
refixeAnnee est une chaîne = DateLogiciel..Année
MD1,MD2,MD3,MD4,MD5,MD6,MD7,MD8,MD9,MD10,MD11,MD12 sont des Dates
MF1,MF2,MF3,MF4,MF5,MF6,MF7,MF8,MF9,dMF10,MF11,MF12 sont des Dates
sMJANVIER,sMFEVRIER,sMMARS,sMAVRIL,sMMAI,sMJUIN,sMJUILLET,sMAOUT,sMSEPTEMBRE,sMOCTOBRE,sMNOVEMBRE,sMDECEMBRE sont des chaînes

MD1 = PrefixeAnnee+"0101"
MF1 = DernierJourDuMois(PrefixeAnnee+"0101")
MD2 = PrefixeAnnee+"0201"
MF2 = DernierJourDuMois(PrefixeAnnee+"0201")
MD3 = PrefixeAnnee+"0301"
MF3 = DernierJourDuMois(PrefixeAnnee+"0301")
MD4 = PrefixeAnnee+"0401"
MF4 = DernierJourDuMois(PrefixeAnnee+"0401")
MD5 = PrefixeAnnee+"0501"
MF5 = DernierJourDuMois(PrefixeAnnee+"0501")
MD6 = PrefixeAnnee+"0601"
MF6 = DernierJourDuMois(PrefixeAnnee+"0601")
MD7 = PrefixeAnnee+"0701"
MF7 = DernierJourDuMois(PrefixeAnnee+"0701")
MD8 = PrefixeAnnee+"0801"
MF8 = DernierJourDuMois(PrefixeAnnee+"0801")
MD9 = PrefixeAnnee+"0901"
MF9 = DernierJourDuMois(PrefixeAnnee+"0901")
MD10 = PrefixeAnnee+"1001"
dMF10 = DernierJourDuMois(PrefixeAnnee+"1001")
MD11 = PrefixeAnnee+"1101"
MF11 = DernierJourDuMois(PrefixeAnnee+"1101")
MD12 = PrefixeAnnee+"1201"
MF12 = DernierJourDuMois(PrefixeAnnee+"1201")

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD1,MF1)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD1,MF1)
sMJANVIER =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé
grEtiquetteCatégorie(GRF_GrapheCA,1,"Janvier")


HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD2,MF2)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD2,MF2)
sMFEVRIER =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD3,MF3)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD3,MF3)
sMMARS =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD4,MF4)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD4,MF4)
sMAVRIL =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD5,MF5)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD5,MF5)
sMMAI =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD6,MF6)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD6,MF6)
sMJUIN =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD7,MF7)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD7,MF7)
sMJUILLET =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD8,MF8)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD8,MF8)
sMAOUT =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD9,MF9)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD9,MF9)
sMSEPTEMBRE =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD10,dMF10)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD10,dMF10)
sMOCTOBRE =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD11,MF11)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD11,MF11)
sMNOVEMBRE =REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut,MD12,MF12)
HExécuteRequête(REQ_CA_CREDIT_JOURNEE,hRequêteDéfaut,MD12,MF12)
sMDECEMBRE=REQ_CA_COMPTANT_JOURNEE.la_somme_TotalEncaissé+REQ_CA_CREDIT_JOURNEE.la_somme_MontantEncaissé

grAjouteDonnée(GRF_GrapheCA,1,sMJANVIER)
grEtiquetteCatégorie(GRF_GrapheCA,1,"Janvier")
grAjouteDonnée(GRF_GrapheCA,1,sMFEVRIER)
grEtiquetteCatégorie(GRF_GrapheCA,2,"Fevier")
grAjouteDonnée(GRF_GrapheCA,1,sMMARS)
grEtiquetteCatégorie(GRF_GrapheCA,3,"Mars")
grAjouteDonnée(GRF_GrapheCA,1,sMAVRIL)
grEtiquetteCatégorie(GRF_GrapheCA,4,"Avril")
grAjouteDonnée(GRF_GrapheCA,1,sMMAI)
grEtiquetteCatégorie(GRF_GrapheCA,5,"Mai")
grAjouteDonnée(GRF_GrapheCA,1,sMJUIN)
grEtiquetteCatégorie(GRF_GrapheCA,6,"Juin")
grAjouteDonnée(GRF_GrapheCA,1,sMJUILLET)
grEtiquetteCatégorie(GRF_GrapheCA,7,"Juillet")
grAjouteDonnée(GRF_GrapheCA,1,sMAOUT)
grEtiquetteCatégorie(GRF_GrapheCA,8,"Aout")
grAjouteDonnée(GRF_GrapheCA,1,sMSEPTEMBRE)
grEtiquetteCatégorie(GRF_GrapheCA,9,"Septembre")
grAjouteDonnée(GRF_GrapheCA,1,sMOCTOBRE)
grEtiquetteCatégorie(GRF_GrapheCA,10,"Octobre")
grAjouteDonnée(GRF_GrapheCA,1,sMNOVEMBRE)
grEtiquetteCatégorie(GRF_GrapheCA,11,"Novembre")
grAjouteDonnée(GRF_GrapheCA,1,sMDECEMBRE)
grEtiquetteCatégorie(GRF_GrapheCA,12,"Decembre")
grDessine(GRF_GrapheCA)


MERCI

--
PS : I Love Windev
Mensaje modificado, 10,noviembre 2018 - 08:00
Miembro registrado
1.330 mensajes
Publicado el 11,noviembre 2018 - 11:53
Salut Think,

Tu dois d'abord modifier tes requêtes pour en avoir qu'une seule puisque ton filtre est toujours le même pour les deux données.
Dans le code ci-dessous je l'ai appellé REQ_CA_CALCUL_JOURNEE.

Ensuite voici le code qui remplace le tient

// Declaration des variables
PrefixeAnnee est une chaîne = DateLogiciel..Année
bReqOk est un booléen = Vrai
tabMD est un tableau de 12 Dates
tabMF est un tableau de 12 Dates
tabMois est un tableau de 12 Monétaires
tabMoisNom est un tableau de 12 chaînes = { "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" }

// Désactive l'affichage de l'écran
MaFenêtre..AffichageActif = Faux

// Mise en place des données pour les 12 mois
POUR i=1 _À_ 12
tabMD[i] = ChaîneConstruit("%1%2%3", PrefixeAnnee, NumériqueVersChaîne(i,"02d"), "01")
tabMF[i] = DernierJourDuMois(ChaîneConstruit("%1%2%3", PrefixeAnnee, NumériqueVersChaîne(i,"02d"), "01"))

SI HExécuteRequête(REQ_CA_CALCUL_JOURNEE, hRequêteDéfaut, tabMD[i], tabMF[i]) ALORS
HLitPremier(REQ_CA_CALCUL_JOURNEE)
SINON
bReqOk = Faux
SORTIR
FIN

tabMois[i] = REQ_CA_CALCUL_JOURNEE.la_somme_TotalEncaissé + REQ_CA_CALCUL_JOURNEE.la_somme_MontantEncaissé
grEtiquetteCatégorie(GRF_GrapheCA, i, tabMoisNom[i])
grAjouteDonnée(GRF_GrapheCA, i, tabMois[i])
grEtiquetteCatégorie(GRF_GrapheCA, i, tabMoisNom[i])
FIN

SI bReqOk ALORS
grDessine(GRF_GrapheCA)
SINON
ToastAffiche("Erreur de requête : " + HErreur(hErrEnCours), toastCourt, cvMilieu, chCentre)
FIN

// On réactive l'affichage de l'écran
MaFenêtre..AffichageActif = Vrai


A+
Daryl

--
http://www.concept4u2.com
Miembro registrado
2.682 mensajes
Publicado el 11,noviembre 2018 - 15:06
Bonjour,

Je te confirme qu'exécuter 12 fois la même requête est une perte de temps. Avant toute chose, il te faudrait poster ta requête pour qu'on travaille d'abord là dessus.

Le reste coulera de source.

@Daryl: Ton code n'est plus ni moins que celui de Think avec des tableaux. Aucun gain de performance à espérer. ;(

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
334 mensajes
Publicado el 11,noviembre 2018 - 18:06
A voir ton code, la seule solution, c’est de revoir tes requêtes, et si je comprend bien ton besoin, je pense qu’il te faut juste 2 requête avec le bon GROUP BY qui va bien pour alimenter ton GRAPHE…

Voir tout dans une requête avec une jointure.

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Mensaje modificado, 11,noviembre 2018 - 18:47
Miembro registrado
1.330 mensajes
Publicado el 14,noviembre 2018 - 00:14
Salut Philippe,

Tu as entièrement raison, je voulais juste simplifier son code.
Mais on est tous d'accord que c'est sa requête qui plombe tout 8)

A+
Daryl

--
http://www.concept4u2.com
Miembro registrado
2.682 mensajes
Publicado el 14,noviembre 2018 - 07:22
Etant donné qu'il n'a pas souhaité fournir sa requête ça va être compliqué de l'aider.

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
13 mensajes
Publicado el 14,noviembre 2018 - 07:48
non pas que je ne veuille pas, j’étais juste un peu absent c'est jour ci .
La voila !
SELECT
VENTECAISSE.TypeVente AS TypeVente,
VENTECAISSE.Date AS Date,
VENTECAISSE.ETAT AS ETAT,
VENTECAISSE.IDMODEDEPAIEMENT AS IDMODEDEPAIEMENT,
VENTECAISSE.REFERENCEMODEPAIEMENT AS REFERENCEMODEPAIEMENT,
VENTECAISSE.CreerPar AS CreerPar,
SUM(VENTECAISSE.TotalVente) AS la_somme_TotalVente,
SUM(VENTECAISSE.TotalCredit) AS la_somme_TotalCredit,
SUM(VENTECAISSE.TotalRemise) AS la_somme_TotalRemise,
SUM(VENTECAISSE.TotalNetAPayer) AS la_somme_TotalNetAPayer
FROM
VENTECAISSE
WHERE
VENTECAISSE.Date BETWEEN {pDate1} AND {pDate2}
AND VENTECAISSE.TypeVente = {TypeDeVente}
AND VENTECAISSE.ETAT = 1
AND VENTECAISSE.IDMODEDEPAIEMENT = {pModePaiment}
AND VENTECAISSE.CreerPar = {pVendeur}
GROUP BY
VENTECAISSE.TypeVente,
VENTECAISSE.Date,
VENTECAISSE.ETAT,
VENTECAISSE.IDMODEDEPAIEMENT,
VENTECAISSE.REFERENCEMODEPAIEMENT,
VENTECAISSE.CreerPar


Merci a tous

--
PS : I Love Windev
Miembro registrado
2.682 mensajes
Publicado el 14,noviembre 2018 - 08:19
Bonjour,

Ben la requête est presque bonne, il te suffit d'enlever les conditions sur Date et TypeVente, et ta requête terenverra toutes les infos. Ensuite tu peux les traiter ligne par ligne et ça ira beaucoup plus vite.

--
Cordialement,

Philippe SAINT-BERTIN
Publicado el 14,noviembre 2018 - 08:31
Mais comment il pourra traiter ça requête, on est plusieurs comme lui n’allant pas le niveau aboutit en programmation. J’ai aussi le même problème.

SVP plus de détail


Fabian Monty:merci:
Publicado el 14,noviembre 2018 - 09:53
Bonjour,

Il suffit d'enlever les dates dans la clause WHERE comme ceci :
SELECT
VENTECAISSE.TypeVente AS TypeVente,
VENTECAISSE.Date AS Date,
VENTECAISSE.ETAT AS ETAT,
VENTECAISSE.IDMODEDEPAIEMENT AS IDMODEDEPAIEMENT,
VENTECAISSE.REFERENCEMODEPAIEMENT AS REFERENCEMODEPAIEMENT,
VENTECAISSE.CreerPar AS CreerPar,
SUM(VENTECAISSE.TotalVente) AS la_somme_TotalVente,
SUM(VENTECAISSE.TotalCredit) AS la_somme_TotalCredit,
SUM(VENTECAISSE.TotalRemise) AS la_somme_TotalRemise,
SUM(VENTECAISSE.TotalNetAPayer) AS la_somme_TotalNetAPayer
FROM
VENTECAISSE
WHERE
AND VENTECAISSE.TypeVente = {TypeDeVente}
AND VENTECAISSE.ETAT = 1
AND VENTECAISSE.IDMODEDEPAIEMENT = {pModePaiment}
AND VENTECAISSE.CreerPar = {pVendeur}
GROUP BY
VENTECAISSE.TypeVente,
VENTECAISSE.Date,
VENTECAISSE.ETAT,
VENTECAISSE.IDMODEDEPAIEMENT,
VENTECAISSE.REFERENCEMODEPAIEMENT,
VENTECAISSE.CreerPar



Et de traiter ces conditions de dates dans le code :
HExécuteRequête(REQ_CA_COMPTANT_JOURNEE,hRequêteDéfaut)
POUR TOUT REQ_CA_COMPTANT_JOURNEE
SELON REQ_CA_COMPTANT_JOURNEE.Date
CAS MD1<*<DF1 :
//traitement du graphe
CAS MD2<*>DF2 :
//Traitement du graphe
//CAS ... Et ainsi de suite pour les 12 mois
FIN
FIN


A+
Publicado el 14,noviembre 2018 - 10:07
Mon 2ème cas est faux c'est
CAS MD2<*<DF2 :
Miembro registrado
13 mensajes
Publicado el 14,noviembre 2018 - 12:37
RogerCageot a écrit :
Mon 2ème cas est faux c'est
CAS MD2<*<DF2 :


:merci:

--
PS : I Love Windev
Miembro registrado
334 mensajes
Publicado el 14,noviembre 2018 - 19:28
Sans être devant un PC pour valider ma proposition, j’aurai testé un truc du genre :

SELECT
VENTECAISSE.TypeVente AS TypeVente,
VENTECAISSE.Date AS Date,
VENTECAISSE.ETAT AS ETAT,
VENTECAISSE.IDMODEDEPAIEMENT AS IDMODEDEPAIEMENT,
VENTECAISSE.REFERENCEMODEPAIEMENT AS REFERENCEMODEPAIEMENT,
VENTECAISSE.CreerPar AS CreerPar,
SUM(VENTECAISSE.TotalVente) AS la_somme_TotalVente,
SUM(VENTECAISSE.TotalCredit) AS la_somme_TotalCredit,
SUM(VENTECAISSE.TotalRemise) AS la_somme_TotalRemise,
SUM(VENTECAISSE.TotalNetAPayer) AS la_somme_TotalNetAPayer
FROM
VENTECAISSE
WHERE
(VENTECAISSE.Date BETWEEN {pDate1} AND {pDate2})
AND VENTECAISSE.TypeVente = {TypeDeVente}
AND VENTECAISSE.ETAT = 1
AND VENTECAISSE.IDMODEDEPAIEMENT = {pModePaiment}
AND VENTECAISSE.CreerPar = {pVendeur}
GROUP BY
VENTECAISSE.TypeVente,
YEAR(VENTECAISSE.Date),
MONTH(VENTECAISSE.Date),
VENTECAISSE.ETAT,
VENTECAISSE.IDMODEDEPAIEMENT,
VENTECAISSE.REFERENCEMODEPAIEMENT,
VENTECAISSE.CreerPar


Ou pDate1 serait égale au 1 janvier de l’année à traiter et pDate2 serait le 31 décembre de l’années à traiter.

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Mensaje modificado, 14,noviembre 2018 - 19:32