Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Alternativa a los campos agregados en un TQuery (https://www.clubdelphi.com/foros/showthread.php?t=89632)

wilcg 31-12-2015 04:14:40

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;

ecfisa 31-12-2015 05:06:07

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 :)

fjcg02 31-12-2015 14:33:05

Has probado a deshabitar los controles asociados?

Algo así como

Query1.Dataset.DisableControls;

Calculas tus datos.

Query1.Dataset.EnableControls;

Un saludo

Osorio 31-12-2015 15:50:55

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;

AgustinOrtu 31-12-2015 15:54:20

Cita:

Empezado por Osorio (Mensaje 500923)
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

wilcg 31-12-2015 18:05:11

Gracias a todos por sus aportes un saludo y ¡¡¡feliz año nuevo!!!:)


La franja horaria es GMT +2. Ahora son las 12:10:14.

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