PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → A votre avis
A votre avis
Débuté par UserWin, 24 mar. 2017 11:55 - 9 réponses
Posté le 24 mars 2017 - 11:55
Bonjour,

J'ai une table dans laquelle j'ai affiché mes informations, cette table contient des colonnes à calculer par exemple calcul des soldes =credit-debit

A votre avis et vos expériences , quelle est la meilleure méthode à utiliser parmi ces 2 méthodes ci dessous pour avoir un bon vitesse d'affichage

Est ce qu'à chaque affichage d'une ligne dans la table : "événement : Affichage d'une ligne de TableSolde" je fais mes calcules et d'autre affichage tel que le nom du client et son ville comme ceci:

Hlitrecherche(CLIENTS,NumClient,TableSolde.IDCLient)
si htrouve(CLIENTS)=vrai alors TableSolde.Client=CLIENTS.NomClient
Hlitrecherche(VILLES,IDVilles,TableSolde.IDVille)
si htrouve(VILLES)=vrai alors TableSolde.Ville=VILLES.NomVille
// Calcule des soldes
TableSolde.soldes =TableSolde.credit-TableSolde.debit

OU BIEN

Je crée une procédure dans laquelle je mets ce code puis je l'appelle après la fin de remplissage de ma table
Exemple:
Pour toute ligne de TableSolde
Hlitrecherche(CLIENTS,NumClient,TableSolde.IDCLient)
si htrouve(CLIENTS)=vrai alors TableSolde.Client=CLIENTS.NomClient
Hlitrecherche(VILLES,IDVilles,TableSolde.IDVille)
si htrouve(VILLES)=vrai alors TableSolde.Ville=VILLES.NomVille
// Calcule des soldes
TableSolde.soldes =TableSolde.credit-TableSolde.debit

fin

Merci Par d'avance
Cordialement
Posté le 24 mars 2017 - 15:07
A priori, tu parles d'une table mémoire ?

D'après moi, pour la performance la bonne solution n'est aucune des 2 solutions que tu proposes.

J'imagine que ta table, tu la remplis par :
HLitPremier(fichier1 )
TANTQUE PAS HEnDehors()
TableAjouteLigne( table1, xxx xxx xxx )
HLitSuivant(fichier1)
FIN


Je te suggère de créer une requête, qui ressemblerait à
select xxx from fichier1
inner join villes on ville.id_ville = fichier1.idVille
etc etc etc

Et du coup, au lieu de parcourir fichier1, tu parcours le résultat de cette requête. Plus besoin de traitement additionnel pour le libellé de la ville ou pour le nom du client.

Sinon, si tu n'es pas à l'aise avec ça, et si tu veux rester entre les 2 propositions que tu as faite, je te suggère plutôt la boucle à la fin de la préparation de la table.

Enfin, un critère de choix peut être le nombre de lignes : si tu as une table de 5000 lignes ou plus, il est probable que l'utilisateur ne va pas afficher /consulter toutes les lignes. Et donc dans ce cas, il faudrait initialiser ces colonnes supplémentaires uniquement sur les lignes vues , et donc dans le code d'affichage !
Posté le 24 mars 2017 - 16:55
Bonjour Joe

Merci de votre réponse

Oui j'ai déjà utilisé le code sql et j'exploite également Join inner seulement j'ai un message de fonction d'agrégation
"Les fonctions non agrégats n'est pas autorisés sans utilisation de la clause GROUP BY,....

select Commandes.NumClient,
sum(case when Commandes.ETATCOMMANDE in (%1) then Commandes.TOTALTTC else
0 end) as sommeVente,
CLIENTS.codeClient AS CodeClient,
CLIENTS.Societe AS Societe,
FVille.Ville AS VILLE
FROM Commandes
INNER JOIN FCLIENTS ON CLIENTS.NumClient=Commandes.NumClient
INNER JOIN Ville ON Ville.IDFVille=Commandes.IdVille
WHERE
Commandes.dateDoc BETWEEN %3 and %4
AND Commandes.LIBModeReglement <>%5
AND Commandes.NumSite <>%6
GROUP BY Commandes.NumClient
ORDER BY NumClient ASC
]

Je crois que Inner join ne n'accepte pas la fonction GROUP BY

ESt ce que j'ai un problème dans mon code

Merci d'avance
Posté le 24 mars 2017 - 17:39
Bonjour,
C'est très simple: toutes les colonnes du SELECT qui ne font pas l'objet
d'une fonction d'agrégation (sum, count...) doivent figurer dans la clause
GROUP BY.
Ici tu ne fait le GROUP BY que sur le NumClient de Commandes, il en manque 3
autres.

Frédéric.

"UserWin" a écrit dans le message de groupe de discussion :
201773db5beb4815bfd4dac7744771fd8318@news.pcsoft.fr...

Bonjour Joe

Merci de votre réponse

Oui j'ai déjà utilisé le code sql et j'exploite également Join inner
seulement j'ai un message de fonction d'agrégation
"Les fonctions non agrégats n'est pas autorisés sans utilisation de la
clause GROUP BY,....

select Commandes.NumClient,
sum(case when Commandes.ETATCOMMANDE in (%1) then Commandes.TOTALTTC else
0 end) as sommeVente,
CLIENTS.codeClient AS CodeClient,
CLIENTS.Societe AS Societe,
FVille.Ville AS VILLE
FROM Commandes
INNER JOIN FCLIENTS ON CLIENTS.NumClient=Commandes.NumClient
INNER JOIN Ville ON Ville.IDFVille=Commandes.IdVille
WHERE
Commandes.dateDoc BETWEEN %3 and %4
AND Commandes.LIBModeReglement <>%5
AND Commandes.NumSite <>%6
GROUP BY Commandes.NumClient
ORDER BY NumClient ASC
]

Je crois que Inner join ne n'accepte pas la fonction GROUP BY

ESt ce que j'ai un problème dans mon code

Merci d'avance
Membre enregistré
1 message
Posté le 24 mars 2017 - 20:31
salut, j'utilises windev une version d'evaluation.mais jai un probleme .
j'ai créer une table utilisateurs avec comme contenu IDUtilisateur,username et password.
sur le bouton valider jai mis le code :

si sai_username="" et sai_password="" alors
ouvre(fen_menu)
sinon
info("connexion incorrect")
à chaque foi que je lance le teste, ca ne fonctionne pas.quesqui se passe en fait ? pasrce que dans ma table jai un utilisateur : bonachy et mot de pass : lauriel.
je ne comprend plus rien là !

--
Lewis Bonachy
Posté le 25 mars 2017 - 01:25
1er point : en fait, je voulais dire outer join, et non inner join, mais c'est presque secondaire.

2ème point : Dans ton premier message, tu ne parlais absolument pas de somme ou de comptage. Et maintenant, tu cherches à faire des sommes. Pourquoi ce changement ?
On peut parfaitement faire des requetes , avec des jointures ( inner join ou outer join) , que ce soit pour afficher des sous-totaux, ou pour afficher les données détaillées d'origine comme elles sont dans les bases de données.
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 25 mars 2017 - 07:03
select Commandes.NumClient,
sum(case when Commandes.ETATCOMMANDE in (%1) then Commandes.TOTALTTC else
0 end) as sommeVente,
CLIENTS.codeClient AS CodeClient,
CLIENTS.Societe AS Societe,
FVille.Ville AS VILLE
FROM Commandes
INNER JOIN FCLIENTS ON CLIENTS.NumClient=Commandes.NumClient
INNER JOIN Ville ON Ville.IDFVille=Commandes.IdVille
WHERE
Commandes.dateDoc BETWEEN %3 and %4
AND Commandes.LIBModeReglement <>%5
AND Commandes.NumSite <>%6
GROUP BY Commandes.NumClient,CodeClient,Societe,VILLE
ORDER BY NumClient ASC
Posté le 25 mars 2017 - 09:03
Bonjour

Merci pour vos réponse (Frédéric et Philippe )

Dans ce cas la le résultats ne sera pas les mêmes parce que la somme des totaux par (Numclient) est différent lors on ajoute les (Code,Société et ville) n'est ce pas ?

Sachant que je cherche uniquement la somme des totaux par Client .
Titre d'information, j'ajoute la clause Inner join juste pour afficher le nom du client et le nom de la ville car mon fichier Commandes ne contient que les IDClient et IdVille

Merci encore ne fois de m'aider un peu
Posté le 27 mars 2017 - 10:07
Bonjour,
Le résultat sera peut-être différent, mais il sera correct... ce qui n'est
pas le cas si tu pouvais ne faire la somme que sur le code client.

La seule solution pour s'en sortir ici est de faire une sous-requête qui
renvoie l'Id client et la somme des commandes, et de faire une jointure
ensuite avec les commandes sur l'Id client.
Un truc du genre:
select c2.NumClient,
c2.sommeVente,
CLIENTS.codeClient AS CodeClient,
CLIENTS.Societe AS Societe,
FVille.Ville AS VILLE
FROM Commandes
inner join
(
select Commandes.NumClient,
sum(case when Commandes.ETATCOMMANDE in (%1) then Commandes.TOTALTTC else
0 end) as sommeVente
FROM Commandes
WHERE
Commandes.dateDoc BETWEEN %3 and %4
AND Commandes.LIBModeReglement <>%5
AND Commandes.NumSite <>%6
GROUP BY Commandes.NumClient
) as c2 on c2.numclient = commandes.numclient
INNER JOIN FCLIENTS ON CLIENTS.NumClient=Commandes.NumClient
INNER JOIN Ville ON Ville.IDFVille=Commandes.IdVille
WHERE
Commandes.dateDoc BETWEEN %3 and %4
AND Commandes.LIBModeReglement <>%5
AND Commandes.NumSite <>%6
ORDER BY NumClient ASC


Frédéric
"UserWin" a écrit dans le message de groupe de discussion :
2017d009c945626d95ed79752b29d1f46e1e@news.pcsoft.fr...

Bonjour

Merci pour vos réponse (Frédéric et Philippe )

Dans ce cas la le résultats ne sera pas les mêmes parce que la somme des
totaux par (Numclient) est différent lors on ajoute les (Code,Société et
ville) n'est ce pas ?

Sachant que je cherche uniquement la somme des totaux par Client .
Titre d'information, j'ajoute la clause Inner join juste pour afficher le
nom du client et le nom de la ville car mon fichier Commandes ne contient
que les IDClient et IdVille

Merci encore ne fois de m'aider un peu
Posté le 27 mars 2017 - 12:41
Bonjour

Merci Frédéric pour votre retour, je vais tester votre code