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 Notevi 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 Notevi 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


La franja horaria es GMT +2. Ahora son las 19:27:28.

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