PDA

Ver la Versión Completa : hacer un SUM de una consulta ya hecha


egarc
23-05-2008, 00:13:52
Buenas amigos, les platearé mi problema: Tengo una consulta en un MSQuery que me devuelve 5,000 registros mas o menos, dentro de esa consulta hay un campo que se llama MONTO, lo que quiero es mostrar en un edit la suma de todos estos campos.
Lo se hacer en QuickReport con el QRExpresion, y en la propiedad expresion le pongo SUM(msquery1.monto).

Pero en este caso quiero mostrar la suma en un edit de un formaulario.

Gracias anticipadas!!

Casimiro Notevi
23-05-2008, 05:50:59
Si lo he entendido, quieres algo así como esto:

Select campo1, campo2, monto, sum(monto) as Total from .....


Luego asocias el campo Total al dbedit que quieras.

enecumene
23-05-2008, 13:05:19
A ver, intenta lo siguiente:

Var
Suma: Double;
Campo: TField;
Begin
Suma:=0;
Try
With query1 Do Begin
DisableControls;
ElCampo := fieldbyname('Field');
First;
While Not EoF Do Begin
Suma := Suma + Campo.AsFloat;
Next;
End;
End;
Finally
query1.EnableControls;
End;
Edit1.Text := Floattostr(Suma);
End;

Saludos.

egarc
26-05-2008, 13:55:09
Gracias por sus respuestas.
De la manera que tengo el codigo ahora es haciendo un ciclo desde el principio del Query hasta el final y acumulando en una variable el valor del campo monto. Necesito saber si hay alguna forma que no sea tan lenta, ya que un ciclo que va desde 1 hasta 50,000 es un poco lento.

Gracias...:(

Casimiro Notevi
26-05-2008, 19:21:17
¿Y no te sirve ninguna de las respuestas?

Aclara un poco más lo que haces, adjunta tu código, etc.

egarc
26-05-2008, 22:24:38
Ok, Trabajo con SQL 2005 y Delphi 2007

Hago la siguiente consulta

Select CodigoCliente, Numero, Fecha, Monto
from FACTURAS

where fecha between :Fecha1 and :Fecha2



Luego paso los parámetros, etc.etc.

La consulta me devuelve mas o menos 5,000 registros, y ejecuto el siguiente codigo para sacar el total de la suma del campo MONTO


Var Total:real;
Begin total:=0;
Try With query1 Do
Begin
First;
While Not EoF Do Begin
Total := Total+ Query1.fielbyName('Monto').AsFloat;
Next;
End;
End; Finally
End;
Edit1.Text := Floattostr(Total);
End;


Entonces, en el calculo que deseo poner en el edit1 me tarda mucho tiempo, ya que mientras mas registros tenga la consulta, mas tiempo tardará en dar el resultado.

Gracias anticipadas

Casimiro Notevi
26-05-2008, 23:15:47
¿Pero por qué no haces la suma en el select?

Select CodigoCliente, Numero, Fecha, Monto, sum(Monto) as Total
from FACTURAS
where fecha between :Fecha1 and :Fecha2

egostar
26-05-2008, 23:25:23
¿Pero por qué no haces la suma en el select?

Select CodigoCliente, Numero, Fecha, Monto, sum(Monto) as Total
from FACTURAS
where fecha between :Fecha1 and :Fecha2

Pero eso te va a dar un error amigo Casimiro, requieres el Group by, yo creo que lo mas facil es hacer un campo calculado y mostrarlo cuando y donde lo requieras.

Salud OS

Edito

Suponiendo que el campo Calculado sea Total

En el evento OnCalcFields se hace esto


Query1TOTAL.Value := Query1TOTAL.Value + Query1Monto.Value;

Casimiro Notevi
27-05-2008, 08:39:16
je, je... ¿en qué estaría pensando yo?, por supuesto que lo que he puesto no sirve :o

Casimiro Notevi
27-05-2008, 09:10:43
También puedes lanzar la consulta de suma por separado con los mismos parámetros de fecha, será muy rápido.