Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-12-2015
wilcg wilcg is offline
Miembro
 
Registrado: abr 2014
Posts: 107
Poder: 11
wilcg Va por buen camino
Alternativa a los campos agregados en un TQuery

hola amigos del foro, mi consulta es la siguiente.
Que alternativa usar a los campos agregados (aggregate) si uso un TQuery, tengo entendido que tales campos son exclusivos de un TClientDataset.
Necesito multiplicar 2 campos y sumar el resultado de todos los registros de una tabla, he creado esta función para realizar el trabajo. Y se ejecuta desde los eventos AfterOpen, AfterRefresh del TQuery, Y funciona muy bien.
Pero hay algo que no me agrada, y es el movimiento del indicador que se genera en el DBGrid al ejecutarse la funcion en el momento que se realiza una consulta de busqueda. Es por eso que quiero otra alternativa.

Código Delphi [-]
function TfProductos.SumarDBGrid :Currency;
Var
  Suma: Double;
  Cantidad, Costo: TField;
  Marca : TBookmark;
begin
  Suma := 0;
  with Query1 do begin
    Marca := Bookmark;
    Cantidad := FieldByName('cantidad');
    Costo := FieldByName('costo');
    First;
    while Not EoF do begin
      Suma := Suma + (Costo.AsFloat*Cantidad.AsFloat);
      Next;
    end;
    Bookmark := Marca;
    Result := Suma;
  end;
end;

Código Delphi [-]
txtTotalCosto.Value := SumarDBGrid;
Responder Con Cita
  #2  
Antiguo 31-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola wilcg.

Tu función sería mas eficiente así:
Código Delphi [-]
function SumarDBGrid: Currency;
var
  qy: TQuery;
begin
  qy:= TQuery.Create(nil);
  try
    qy.Close;
    qy.DatabaseName := 'TU_DB_NAME'; // (El nombre de tu base de datos)
    qy.SQL.Text := 'SELECT SUM(CANTIDAD*COSTO) AS RESULTADO FROM TU_TABLA'; // (El nombre de tu tabla)
    qy.Open;
    Result := qy.FieldByName('RESULTADO').AsCurrency;
    qy.Close;
  finally
    qy.Free;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 31-12-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.412
Poder: 22
fjcg02 Va camino a la fama
Has probado a deshabitar los controles asociados?

Algo así como

Query1.Dataset.DisableControls;

Calculas tus datos.

Query1.Dataset.EnableControls;

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 31-12-2015
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 251
Poder: 22
Osorio Va por buen camino
Te quedaria algo asi como esto:

Código Delphi [-]
function TfProductos.SumarDBGrid :Currency;
Var
  Suma: Double;
  Cantidad, Costo: TField;
  Marca : TBookmark;
begin
  Suma := 0;
  with Query1 do begin
    Marca := Bookmark;
    DisableControls; {linea nueva}
    Cantidad := FieldByName('cantidad');
    Costo := FieldByName('costo');
    First;
    while Not EoF do begin
      Suma := Suma + (Costo.AsFloat*Cantidad.AsFloat);
      Next;
    end;
    enableControls;  {linea nueva}
    Bookmark := Marca;

    Result := Suma;
  end;
end;
Responder Con Cita
  #5  
Antiguo 31-12-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 16
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por Osorio Ver Mensaje
Te quedaria algo asi como esto:

Código Delphi [-]
function TfProductos.SumarDBGrid :Currency;
Var
  Suma: Double;
  Cantidad, Costo: TField;
  Marca : TBookmark;
begin
  Suma := 0;
  with Query1 do begin
    Marca := Bookmark;
    DisableControls; {linea nueva}
    Cantidad := FieldByName('cantidad');
    Costo := FieldByName('costo');
    First;
    while Not EoF do begin
      Suma := Suma + (Costo.AsFloat*Cantidad.AsFloat);
      Next;
    end;
    enableControls;  {linea nueva}
    Bookmark := Marca;

    Result := Suma;
  end;
end;

Yo tenia una funcion casi identica a esta y me resultaba lenta, y tuve que optar por hacer el SUM dentro del query; pase de "un ratito" a "instantaneo" basicamente; asi que esta solucion hay que probarla con muchos registros o si se sabe que son pocos entonces no hay problema
Responder Con Cita
  #6  
Antiguo 31-12-2015
wilcg wilcg is offline
Miembro
 
Registrado: abr 2014
Posts: 107
Poder: 11
wilcg Va por buen camino
Gracias a todos por sus aportes un saludo y ¡¡¡feliz año nuevo!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Campos agregados en ClientDataSet sleep25000 Conexión con bases de datos 0 22-05-2013 00:02:07
Consulta por campos tquery zuzito76 C++ Builder 3 03-04-2011 04:20:32
Filtrar Tquery con campos calculados nelem Internet 0 19-05-2008 10:15:46
Problema con campos agregados alopete Conexión con bases de datos 9 14-01-2008 09:03:43
Nombre de campos Tquery? Coco_jac Varios 1 31-01-2006 22:16:30


La franja horaria es GMT +2. Ahora son las 01:34:18.


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
Copyright 1996-2007 Club Delphi