PDA

Ver la Versión Completa : Problema dbGrid y Query


Gangster
12-01-2007, 05:09:04
Hola es mi segundo problema que me enfrento en este delphi 7 y ademas mi sgeundo post se me hace aqui que me han ayudado muy bien, lo que tengo es una forma con un dbgrid apuntando su datasource a una tabla tipo detail, etonces en el dbgrid tengo columnas de precio unitario y cantidad de articulos y lo mando a la columna total que es una columna del dbgrid , el dbgrid lo pongo en modo edit porque a manera que le usuario de una cantidad de articulos de un producto, esta se multiplica por el precio del producto y se pone como registro de la columna total la multiplicacion de estos lo que quiero es como hago que estos registros de la columna total y quiero sumarlos todos y le hago un total de la sumatoria, ya hice un query que es este

select sum(FacTotal) from FacDetail.db

donde "factotal" es el nombre de la columna de la tabla de la base de datos "FacDetail" pero al ponerlo en el evento que hago la multiplicacion de la cantidad por el precio del producto que es el evento "ColMOve" del dbgrid, se dispara ese evento la cosa es que el sum del query que esta dentro de este evento, no me da ningun valor entonces como funciona un query en una tabla detail y ademas que es con cache update la tabla, entonces el query lo quiero hacer en el momento de que ellos estan haciendo ahi su factura para que se vaya visualizando la suma total de los registros de la columna importe osea que me lo de el showmessage ya sabre yo donde lo echo si a un edit o en un dialog pero primero empezar que me vaya dando bien la suma.

Gracias y ojala y se me entienda es dificil explicar siempre sin codigo pero la verdad ahi poco codigo en mi forma hecha y lo mas importante es esta parte ya la suma total de su factura de algun cliente.

Lepe
12-01-2007, 12:48:28
Creo que deberías usar el evento OnCalcFields del propio dataset para hacer las sumas; El ttable tiene otra propiedad relacionada con CalcFields de tipo Boolean.

Antes de hacer los cálculos, pregunta por los valores de los campos implicados en la suma, ya que uno de ellos puede estar en blanco y la suma no se lleve a cabo. Recuerda que cualquier operación con un campo que tenga el valor NULL, el resultado será NULL (mira la ayuda, hay alguna excepción).

Otra opción es lanzar tu consulta de suma, en el evento BeforePost de la tabla detail. Si, suena un poco raro pero no es así. Al grabar una linea, se dispara la suma, se actualiza el campo total de la tabla maestra, se guarda la tabla maestra, y por último se continúa grabando la tabla detalle.

Saludos

TrUnkS
12-01-2007, 17:02:14
Yo lo hice de la siguiente manera: Supongamos que tienes en el DBGrid los siguientes campos de tu tabla detalles: CANTIDAD, DETALLE, PRECIO UNITARIO, TOTAL en este mismo orden, y quieres que la suma de todos los totales pasen a un label. En el evento OnKeyPress del DBGrid pones


if Key = #13 then // Si se pulsa la tecla ENTER en el Grid
begin
if DBGrid1.Fields[0].Value = Null then
DBGrid1.Fields[0].AsFloat := 1; // CANTIDAD
if DBGrid1.Fields[2].Value = Null then
DBGrid1.Fields[2].AsFloat := 0; // PRECIO UNITARIO
DBGrid1.Fields[3].AsFloat := DBGrid1.Fields[0].AsFloat * DBGrid1.Fields[2].AsFloat; // TOTAL
LabelSumaTotal.Caption:='0'; //
TDetalles.First; // primer registro tabla Detalles
While TDetalles.Eof=False do
begin
DBGrid1.Fields[3].AsFloat := DBGrid1.Fields[0].AsFloat * DBGrid1.Fields[2].AsFloat;
LabelSumaTotal.Caption:=FloatToStr(DBGrid1.Fields[3].AsFloat + StrToFloat(LabelSumaTotal.Caption));
LabelImpuesto.Caption:=FloatToStr(StrToFloat(LabelSumaTotal.Caption) * 0.19); // 0.19 es el impuesto
LabelTotal:=FloatToStr(StrToFloat(Label1SumaTotal.Caption) + StrToFloat(LabelImpuesto.Caption));
TDetalles.Next; // siguiente registro tabla Detalles
end;
DBGrid1.Fields[1].FocusControl; // El cursor se posiciona en columna Detalles de la tabla Detalles
end;


Con esto cuando el usuario vaya ingresando datos sabras a cada instante los totales. Saludos