Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Suma de campos de un dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=75139)

lisc_dla 01-08-2011 04:45:55

Suma de campos de un dbgrid
 
estoy trabajando con un mysql para realizar la conexion utilizo ADOConnection-->ADOTable-->DataSource-->DBgrid.

por ejemplo realizo una búsqueda y esta se visualiza en el dbgrid, pero necesito hacer la suma del campo total. es decir tengo el campo total pero solo quiero realizar la suma de los que se muestran en el dbgrid. es decir poner el resultado en un text.

oscarac 01-08-2011 06:14:06

mmmmm
se me ocurre 2 cosas
1.- que podrias recorrer todo el dbgrid y mostrar la suma
2.- crear un query que te haga la suma
si es como dices que en el grid muestras los resultados del query

newtron 01-08-2011 08:37:45

Cita:

Empezado por oscarac (Mensaje 408070)
mmmmm
se me ocurre 2 cosas
1.- que podrias recorrer todo el dbgrid y mostrar la suma
2.- crear un query que te haga la suma
si es como dices que en el grid muestras los resultados del query

Cierto, aunque también podría recorrer el ADOTable que ya tiene los registros que se visualizan y sacar la suma desde ahí.

Saludos

ecfisa 01-08-2011 11:31:36

Hola lisc_dla.

Creo que es más eficiénte hacerlo con una consulta SQL, pero si te decidis por hacerlo desde el DBGrid podrías hacer algo así :
Código Delphi [-]
function SumarTotales(Grid: TDBGrid; const AFieldName: string): Currency;
var
  BM: TBookMarkStr;
begin
  Result:= 0;
  with Grid.DataSource.DataSet do
  begin
    BM:= Bookmark;
    DisableControls;
    while not Eof do
    begin
      Result:= Result + FieldByName(AFieldName).AsCurrency;
      Next;
    end;
    BookMark:= BM;
    EnableControls;
  end;
end;

Ejemplo de llamada:
Código Delphi [-]
   Edit.Text:= FloatToStr(SumarTotales(DBGrid1,'Total'));

Saludos.

lisc_dla 01-08-2011 22:35:01

Solo un detalle la aplicación que estoy creando es sobre venta de artículos, hago la consulta de las ventas del día y estas se muestran en el dbgrid, pero necesito que en el text solo me muestre la suma de las ventas del día. Estuvo probando el ejemplo pero no se donde colocar la función y me muestra un error

Caral 01-08-2011 23:09:54

Hola
Si se realiza una busqueda con un adotable me imagino que lo que se hara sera un filtro ?.
Si se hace un filtro se puede usar algo como esto.
Código Delphi [-]
var
Total: Integer;
begin
// siempre que no este abierta la tabla
AdoTable1.Open;
Total := 0;
adotable1.disablecontrols;
try
// este filtro se supone que ya se hizo
adotable1.filter := 'TuCampo = '+ edit1.text;
adotable1.filtered := true;
adotable1.first;
while not adotable1.EOF do
 begin
 Total := Total + adotable1['Total'];
 adotable1.next;
 end;
adotable1.filter := '';
adotable1.filtered := false;
edit1.text := Inttostr(Total);
finally
adotable1.enablecontrols;
end;
Saludos

oscarac 01-08-2011 23:16:14

mmmmm
si ya tienes una consulta para mostrar las ventas del dia, te recomentaria mejor crear una consulta similar la cual te sume las ventas del dia

imaginemos que tu consulta es asi

Código Delphi [-]
 
Select TipoDOC, Documento, Fecha, Cliente, Total From TablaVentas where
Fecha = :Fecha
podrias crear esta consulta que te sume las ventas del dia
Código Delphi [-]
Select Sum (Total) As Total From TablaVentas where
Fecha = :Fecha

asocias un datasource al nuevo query y muestras esa informacion en un tdblabel

lisc_dla 01-08-2011 23:24:19

oscarac

mi consulta para visualizar las ventas del día es:
Código Delphi [-]
if frm_cortedecaja.Adotable1.Locate('fecha',lbl_fecha.Caption,[]) = false then
begin
//en caso de no encontrar nada solo visualiza el dbgrid pero sin datos
    frm_cortedecaja.AdoTable1.Filtered := False;
    frm_cortedecaja.AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    frm_cortedecaja.AdoTable1.Filter := Filtro;
    frm_cortedecaja.AdoTable1.Filtered := True;
    frm_cortedecaja.AdoTable1.Open;
    frm_cortedecaja.ShowModal;
end else
begin
//en caso de encontrar datos los visuliza en el dbgrid
    frm_cortedecaja.AdoTable1.Filtered := False;
    frm_cortedecaja.AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    frm_cortedecaja.AdoTable1.Filter := Filtro;
    frm_cortedecaja.AdoTable1.Filtered := True;
    frm_cortedecaja.AdoTable1.Open;
    frm_cortedecaja.ShowModal;
entonces como seria la suma

lisc_dla 01-08-2011 23:27:53

1 Archivos Adjunto(s)
[caral]
me tira el siguiente error


Archivo Adjunto 2056

ecfisa 01-08-2011 23:29:23

Cita:

Empezado por lisc_dla (Mensaje 408122)
Estuvo probando el ejemplo pero no se donde colocar la función y me muestra un error

Podés colocarla inmediatamente despues de la declaración
Código Delphi [-]
interface

function SumarTotales(Grid: TDBGrid; const AFieldName: string): Currency;
....
y podes utilizarla en esa unidad sin problemas. También en otra unidad y agregarla en la declaración uses de la unit en que desees usarla. No mencionaste el error que te genera pero supongo que será por el alcance de la función.

Una ventaja que tiene la función que te puse, es que podés utilizarla para cualquier TDBGrid y para cualquier campo de la tabla asociada al mismo (de tipo numérico lógicamente).

Saludos.

lisc_dla 01-08-2011 23:33:53

por ejemplo puedo colocar la función dentro del procedure

Caral 01-08-2011 23:38:16

Hola
Esto si que esta para romperse la cabeza:
ecfisa, directamente al DBgrid.
oscarac, por sql.
Caral, Por adotable.
Si después de todo esto lisc_dla no se hace un lio o no necesita un loquero habremos hecho un buen trabajo....:D:D:D
Saludos

ecfisa 01-08-2011 23:40:11

Cita:

Empezado por lisc_dla (Mensaje 408137)
por ejemplo puedo colocar la función dentro del procedure

Si, es posible también. Delphi permite anidar procedimientos y funciones (aunque habría que hacer algunos cambios).
Pero si la declarás en una unit donde guardes tus rutinas es reutilizable para cualquier TDBGrid de esa o cualquier otra aplicación que realices.



Saludos.

ecfisa 01-08-2011 23:47:51

Cita:

Empezado por Caral (Mensaje 408138)
Si después de todo esto lisc_dla no se hace un lio o no necesita un loquero habremos hecho un buen trabajo....:D:D:D

Por las dudas preparémonos !!!

:D:D:D

lisc_dla 01-08-2011 23:53:10

:D:D:D:D:D implementado el código

Casimiro Noteví 02-08-2011 00:10:33

Voto por sum(total) where lo quesea evidentemente :)

lisc_dla 02-08-2011 00:10:52

como mencione mi consulta es:

Código Delphi [-]
if Adotable1.Locate('fecha',lbl_fecha.Caption,[]) = false then
begin
    AdoTable1.Filtered := False;
    AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    AdoTable1.Filter := Filtro;
    AdoTable1.Filtered := True;
    AdoTable1.Open;
end
else
begin
    AdoTable1.Filtered := False;
    AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    AdoTable1.Filter := Filtro;
    AdoTable1.Filtered := True;
    AdoTable1.Open;
end;

pero donde coloco el codigo de la suma:

Código Delphi [-]
function SumarTotales(Grid: TDBGrid; const AFieldName: string): Currency;
var
  BM: TBookMarkStr;
begin
  Result:= 0;
  with Grid.DataSource.DataSet do
  begin
    BM:= Bookmark;
    DisableControls;
    while not Eof do
    begin
      Result:= Result + FieldByName(AFieldName).AsCurrency;
      Next;
    end;
    BookMark:= BM;
    EnableControls;
  end;
end;

y donde colo este otro codigo

Código Delphi [-]
Edit.Text:= FloatToStr(SumarTotales(DBGrid1,'Total'));

ya estuve intentando y me marca error

Casimiro Noteví 02-08-2011 00:44:11

Recuerda poner el código entre etiquetas.



.

ecfisa 02-08-2011 01:15:10

Primero gracias por las etiquetas Casimiro ... ;)

Cita:

pero donde coloco el codigo de la suma:
lisc_dla, como te dije en el mensaje #10 podés ubicarlo inmediatamente despues de la declaracion implementation de la unidad que lo uses. Es claro que tu consulta debe haber sido realizada antes.

Cita:

y donde colo este otro codigo
Bueno eso depende de como y cuando quieras mostrarlo. Yo te pongo un ejemplo tán válido como cualquier otro:
Código Delphi [-]
...
implementation

function SumarTotales(Grid: TDBGrid; const AFieldName: string): Currency;
var
  BM: TBookMarkStr;
begin
  Result:= 0;
  with Grid.DataSource.DataSet do
  begin
    BM:= Bookmark;
    DisableControls;
    while not Eof do
    begin
      Result:= Result + FieldByName(AFieldName).AsCurrency;
      Next;
    end;
    BookMark:= BM;
    EnableControls;
  end;
end;
...
(* Este es el ejemplo de llamada *)
procedure TForm.Button1Click(Sender: TObject);
begin
  if Adotable1.Locate('fecha',lbl_fecha.Caption,[]) = false then
  begin
    AdoTable1.Filtered := False;
    AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    AdoTable1.Filter := Filtro;
    AdoTable1.Filtered := True;
    AdoTable1.Open;
  end
  else
  begin
    AdoTable1.Filtered := False;
    AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    AdoTable1.Filter := Filtro;
    AdoTable1.Filtered := True;
    AdoTable1.Open;
  end;
  Edit.Text:= FloatToStr(SumarTotales(DBGrid1,'Total'));
end;
Para el ejemplo supongo que el nombre del campo donde están los valores a sumar se llama Total.

Saludos.

Caral 02-08-2011 01:34:40

Hola
No se, no se, no se.
Si, no se, por eso digo, alguien me dice si este codigo tiene sentido?
Código Delphi [-]
if Adotable1.Locate('fecha',lbl_fecha.Caption,[]) = false then
begin
    AdoTable1.Filtered := False;
    AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    AdoTable1.Filter := Filtro;
    AdoTable1.Filtered := True;
    AdoTable1.Open;
end
else
begin
    AdoTable1.Filtered := False;
    AdoTable1.Filtered := False;
    Filtro := 'fecha = '+lbl_fecha.Caption;
    AdoTable1.Filter := Filtro;
    AdoTable1.Filtered := True;
    AdoTable1.Open;
end;
Saludos

oscarac 02-08-2011 01:37:19

no quiero ser waterparty (aguafiestas) jejejeje ni nada
pero prefiero el uso de una consulta para la suma

cuando la base de datos esta vacia o no contiene muchos datos, el filtro lo ejecuta rapidamente.... pero hazle un filtro a una tabla con 50,000 registros o mas, ahi veras que el rendimiento se ve afectado

otra cosita....no encuentro diferencias entre los bloques de codigo que estan en el If then..

Caral 02-08-2011 01:41:16

Hola
Es que para empezar esta usando un AdoTable, osea, ya abrio toda la tabla, ya por ahi perdio tiempo.
Todo se deberia de hacer con sql, eso es definitivo.
Saludos.
PD: Exacto, el codigo es exacto, osea hello......

oscarac 02-08-2011 01:45:18

variar eso (la apertura de la tabla cambiarla por un query) no es nada del otro mundo (yo dije eso?, pensar que antes cosas como esa me daban dolor de cabeza)

ecfisa 02-08-2011 02:11:23

Cita:

Caral: Es que para empezar esta usando un AdoTable, osea, ya abrio toda la tabla, ya por ahi perdio tiempo
Cita:

oscarac: (la apertura de la tabla cambiarla por un query) no es nada del otro mundo
Estoy de acuerdo en un cien por ciento con ustedes amigos, también sugerí lo mismo en el post #4:
Cita:

Creo que es más eficiénte hacerlo con una consulta SQL, pero si te decidis por hacerlo desde el DBGrid...

Saludos.

Caral 02-08-2011 02:16:13

Hola
Aqui pongo un ejemplo con las cosas como se necesitan.
Se usa sql para ciertas cosas que me parecen son necesarias.
Ademas aprovecho a responder al hilo de qreport que anda por ahi.:D
En el ejemplo veras que hay un espacio en donde se puede ver en este caso el ID, escribe un numero menor del que este en ese momento y veras la informacion, ademas hara la suma del ID (que es lo mismo que sumar lo que sea) y se puede imprimir.
Revisa el codigo, es muy basico y facil de entender.
Saludos
PD: El archivo adjunto se audestruira en cualquier momento, asi que .......:p:)

lisc_dla 02-08-2011 03:08:04

[caral]
el código funciona, pero en realidad no es necesario algunas lineas

Caral 02-08-2011 03:15:53

Hola
De que funciona, funciona, dos veces.:)
Saludos

lisc_dla 02-08-2011 03:16:23

gracias gracias gracias [caral] :D:D:D

Caral 02-08-2011 03:19:16

Hola
Gracias de que, si en poco he ayudado.
Con gusto en lo poco que pueda ayudar ahi estare.
Me alegro que te sirva de algo mi poca experiencia, pronto te pedire consejos.
Saludos

mramos65 13-03-2015 18:18:28

Sumar campos de un dbgrid
 
Sos unos genios autoctonos, GRACIAS por resolverme esta duda, tenia dias buscando una solucion a este problema y aqui esta mas claro que el agua.

Por lo de la duda del amigo lisc_dla, quedaria resuelta con la solucion de la fuction y la llamada que dieron


SALUDOS

newtron 13-03-2015 18:35:55

Cita:

Empezado por mramos65 (Mensaje 489992)
Sos unos genios autoctonos, GRACIAS por resolverme esta duda, tenia dias buscando una solucion a este problema y aqui esta mas claro que el agua.

Pues si hace tres años y pico eramos genios imagínate ahora... :D:D... uis... no... que no era por mi....


La franja horaria es GMT +2. Ahora son las 09:25:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi