Calcul de solde progressif en php mysql

Fermé
ndalaba Messages postés 2 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 26 juin 2013 - 7 janv. 2011 à 16:00
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 16 nov. 2011 à 11:18
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


1 réponse

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
7 janv. 2011 à 16:23
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
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
7 janv. 2011 à 16:33
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
0
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.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 16/11/2011 à 11:19
Bonjour,

Oui c'est logique...
Il te faudrait un autre critère de tri, qui soit strict.

Par contre, la deuxième méthode donnée plus haut ne devrait pas rencontrer ce problème.

Xavier
0