DBGRID : SOMME DE CHAMPS

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 14 mars 2004 à 17:20
djamila2009 Messages postés 1 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 21 septembre 2011 - 21 sept. 2011 à 12:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21216-dbgrid-somme-de-champs

djamila2009 Messages postés 1 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 21 septembre 2011
21 sept. 2011 à 12:07
moi je vous sommer des chiffre mais décimale dune bdd dans un dbgrid
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
15 mars 2004 à 22:21
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.
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
15 mars 2004 à 20:46
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 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
15 mars 2004 à 19:59
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
15 mars 2004 à 08:28
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 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
14 mars 2004 à 17:20
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.
Rejoignez-nous