Dbgrid : somme de champs

Soyez le premier à donner votre avis sur cette source.

Vue 20 509 fois - Téléchargée 13 084 fois

Description

Cet exemple permet de se passer du SQL pour effectuer une somme sur un DBGrid (utile dans certains cas)

Conclusion :


Maintenant si qq'un sait comment faire une somme avec les cellules d'un DBGrid, je suis preneur..

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
Il n'y a pas de possibilité de faire la somme des cellules d'un TDbGrid.
Et cela n'aurait d'ailleurs aucune utilité puisque les données affichées sont celles de l'ensemble de données auquel est connecté le composant grille.
Simple question de bon sens...
Une petite suggestion destinée à alléger le code; au lieu de :
TOTAREA:=0;
TOTPOPULATION:=0;
with DBGrid1.Datasource.DataSet do
begin
First;
While not eof do
begin
TOTAREA:=TOTAREA+(TablePaysArea.AsInteger);
TOTPOPULATION:=TOTPOPULATION+(TablePaysPopulation.AsInteger);
DBGrid1.DataSource.DataSet.Next;
end;

Il est plus lisible d'écrire :
TOTAREA:=0;
TOTPOPULATION:=0;
with TablePays do
begin
First;
While not eof do
begin
inc(TOTAREA, TablePaysArea.AsInteger);
inc(TOTPOPULATION, TablePaysPopulation.AsInteger);
Next;
end;
end;

Comme le calcul est intimement lié à la fiche Form1, il n'est pas utile de rechercher une abstraction en faisant appel à DBGrid1.Datasource.DataSet. Une référence directe à TablePays suffit amplement.

Et puis, la mode est au "light", non ? ;o)

Attention : en utilisant le calcul direct, si un enregistrement est en cours d'édition, le fait de se positionner sur le premier enregistrement (First) aura pour conséquence de de déclencher un Post implicite de cet enregistrement, ce qui n'est pas forcément souhaité par l'utilisateur.
ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009
-
Je ne suis pas tout à fait d'accord avec DelphiProg...

En effet, je suis en train de développer une DBGRID permettant de faire les totaux dans la grille elle même. C'est trés utile lorsque vous faite par exemple un devis devant contenir des sous-totaux, ils sont directement consultable à l'écran. Utile également en comptabilité quant on consulte les écritures, classées par compte, on peut connaître d'un coup d'oeil le solde du compte, etc...

Ce genre de grille (avec d'autre fonctionnalités avancées) sont disponible chez tmssoftware entre autre...

Quand ma grille sera terminée je la posterais sur le site...
Cahier des charges (de ma grille) :
- Compatible Delphi ou Kylix
- Se connect à la DB
- Gère les insertions, suppressions, etc...
- Gère les tris
- Permet l'affichage sous forme d'arborescence des données (issues de plusieurs table (maitre / détail))
- Permet les sous-totaux
- Permet le copier / coller d'une ou plusieurs lignes complètes
- Affiche les graphiques (Images, ProgressBar, Icones)
- Gère les filtres de saisie
- Gère les Inplace Editor, pour des richtext, des images par exemple ...
- Gère les liens actif : tel que http, https, mailto, etc...

Pour l'instant je n'en suis qu'au spécifications. Mais dés la fin du mois, on va commencer à développer (on est 2). Fin prévue pour fin mai (début juin)...

Si cous êtes interressé écrivez moi : fabien.fert à wanadoo.fr

Merci
Si certains sont
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
ffert a écrit : "Je ne suis pas tout à fait d'accord avec DelphiProg...
".
C'est bien, encore faudrait-il argumenter.

Et j'en profite au passage pour prolonger mon argumentation en faveur de l'utilisation d'une requête puisque, pour bien faire :
1-> il conviendrait d'utiliser un bookmark sur la table à totaliser pour restituer la position qui était celle avant le lancer le calcul

2-> de désactiver les contrôles liés à la table par l'utilisation des couples DisableControls/EnableControls pour ne pas voir défiler tous les enregistrements de la table du premier au dernier. Ce qui pourrait provoquer le tournis chez certains à partir de 100 enregistrements et surement ralentir le traitement puisque le composant TDbGrid doit réactualiser son affichage à chaque fois que l'enregistrement courant change !

Je maintiens donc que l'utilisation d'une requête en parallèle pour effectuer ce type de traitement ne possède pas tous inconvénients.

J'attends qu'on me démontre le contraire...
ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009
-
Loin de vouloir offenser qui que ce soit pour te répondre " Il n'y a pas de possibilité de faire la somme des cellules d'un TDbGrid.
Et cela n'aurait d'ailleurs aucune utilité puisque les données affichées sont celles de l'ensemble de données auquel est connecté le composant grille."

Voilà avec quoi je ne suis pas tout à fait d'accord.
Pour se qui est des calculs (sous-totaux par exemple). Personnellement je fait tout en SQL. J'ai donc une requête pour visualiser mes données et une autre requête (en parrallèle) pour faire tous les autres calculs... Car on peut faire des trucs hyper puissant en SQL....

Du type : calcul d'une somme avec les quantités (dans un devis) :
SELECT Sum(PrixUnit*Qtite*(1 + TauxdeTVA/100)),Numerosoustotal WHERE NoDevis=DevisActif GROUP BY Numerosoustotal

Ceci donne le montant TTC de chacun des sous-totaux (il faut qu'il soient numérotés bien sûr... 1 champ en plus). On obtient donc une liste de tous les sous-totaux.

On peut même en SQL faire des expression conditionnelles du type
SELECT Sum(IF(macondition=1,PrixUnit*Qtite*(1 + TauxdeTVA/100),0)),Numerosoustotal WHERE NoDevis=DevisActif GROUP BY Numerosoustotal

Ne fait le total que des lignes marquée par macondition=1....

Et en plus c'est hyper rapide (en fonction du nombre de ligne bien sur)... Mais jusqu'a 5000 lignes, sur une base de donnée en réseau c'est presque instantané (avec Mysql) !!!

Donc je pense que c'est faisable et trés pratique pour les utilisateurs qui peuvent avoir l'information instantanément....

Il est clair que parcourir le datasource qui affiche les données pour en extraire un quelconque calcul n'est pas la solution....

à bientôt...
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
Peut-être m'étais-je mal exprimé puisque je crois comprendre que nous sommes tout à fait d'accord, en définitive. Et je n'étais nullement offensé. ;o)

Cette question revient (trop) souvent : "comment faire des calculs sur des cellules d'un TDbGrid", nous pourrons donner cette contribution comme référence.

Merci à ffert pour sa réponse clairement développée.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.