Calcul de solde progressif en php mysql
ndalaba
Messages postés
3
Statut
Membre
-
Reivax962 Messages postés 3742 Statut Membre -
Reivax962 Messages postés 3742 Statut Membre -
Bonjour,
Je cherche a developper une application de gestion d'une caisse , mais je bloque sur le processus de calcul du solde progressif je demande de l'aide si kelkin a un script sa permettra de comprendre , merci d'avance
Je cherche a developper une application de gestion d'une caisse , mais je bloque sur le processus de calcul du solde progressif je demande de l'aide si kelkin a un script sa permettra de comprendre , merci d'avance
1 réponse
-
Bonjour,
Je vois deux genres de solutions :
1 - une sous requête ;
2 - une variable.
La première nécessite l'existence d'une colonne qui permette d'ordonner les données, mais tu as très certainement une date et une heure qui fera l'affaire.
Voici ce que ça pourrait donner :
1 -SELECT c1.dateHeure, c1.montant, (SELECT SUM( montant ) FROM caisse c2 WHERE c2.dateHeure <= c1.dateHeure) AS cumulMontant FROM caisse c1 ORDER BY c1.dateHeure
Ça a l'avantage de tenir en une seule instruction, mais l'inconvénient de recalculer la somme à chaque itération.
2 -SET @cumul:=0; SELECT c1.dateHeure, c1.montant, (@cumul:=@cumul+ (c1.montant)) AS cumulMontant FROM caisse c1
C'est a priori plus optimisé en termes de performances et n'utilise pas de sous-requête. Par contre, ça tient sur deux instructions, et surtout je ne suis pas complètement sûr du comportement de la somme s'il y a un ORDER BY qui s'y rajoute (la somme se fait-elle sur les ligne telles qu'elles remontent du table scan, qui vont être triées a posteriori, faussant les résultats, ou se fait-elle après le ORDER BY ?)
Je n'ai pas de MySQL sous la main pour trancher, mais en tous cas ça te donne déjà deux pistes de travail.
Xavier-
Mmmmh, en relisant la doc sur les variables (http://dev.mysql.com/doc/refman/5.0/fr/variables.html) je suis tombé sur ça :
[...] Note : dans une requête SELECT, chaque expression est n'évaluée que lors de l'envoi au client. Cela signifie que pour les clauses HAVING, GROUP BY, ou ORDER BY, vous ne pouvez vous référer à une expression qui implique des variables qui sont définies dans la partie SELECT. Par exemple, la requête suivante ne produira pas le résultat escompté : mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nom_de_table HAVING b=5; La raison est que @aa ne contiendra pas la valeur de la ligne courante, mais celle de id pour la dernière ligne acceptée. La règle générale est de ne jamais assigner et utiliser la même variable dans la même commande. [...]
Ce qui me semble être plutôt une bonne nouvelle pour le fonctionnement de ma deuxième solution, qui devient donc celle à privilégier.
Xavier -
Bonjour,
Je débute en mysql avec Version du serveur: 5.1.41-3ubuntu12.10 (phpmyadmin Version: 3.3.2deb1) et je vois que vos deux formules donnent satisfaction ... jusqu'au moment où les lignes 1 et 2 de la table contiennent le même nombre. Avec la formule 1 (pas de variable) dans ce cas, le cumul commence en ligne 1 avec pour résultat 2 fois le nombre! (je n'ai pas essayé avec la formule 2).
Savez-vous ce qui se passe?
Merci beaucoup. -
-