|
Started by UserWin, Mar., 24 2017 11:55 AM - 9 replies |
| |
| | | |
|
| |
Posted on March, 24 2017 - 11:55 AM |
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 |
| |
| |
| | | |
|
| | |
| |
Posted on March, 24 2017 - 3:07 PM |
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 ! |
| |
| |
| | | |
|
| | |
| |
Posted on March, 24 2017 - 4:55 PM |
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 |
| |
| |
| | | |
|
| | |
| |
Posted on March, 24 2017 - 5:39 PM |
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 |
| |
| |
| | | |
|
| | |
| |
Registered member 1 message |
|
Posted on March, 24 2017 - 8:31 PM |
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 |
| |
| |
| | | |
|
| | |
| |
Posted on March, 25 2017 - 1:25 AM |
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. |
| |
| |
| | | |
|
| | |
| |
Registered member 2,574 messages Popularité : +222 (260 votes) |
|
Posted on March, 25 2017 - 7:03 AM |
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 |
| |
| |
| | | |
|
| | |
| |
Posted on March, 25 2017 - 9:03 AM |
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 |
| |
| |
| | | |
|
| | |
| |
Posted on March, 27 2017 - 10:07 AM |
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 |
| |
| |
| | | |
|
| | |
| |
Posted on March, 27 2017 - 12:41 PM |
Bonjour
Merci Frédéric pour votre retour, je vais tester votre code |
| |
| |
| | | |
|
| | | | |
| | |
|