Sumar campos

¿Cómo puedo recorrer un campo especifico y recorrer todas sus filas hacia abajo para obtener sus valores y sumarlos, usando el componente query y dejar el resultado en un memo?

1 respuesta

Respuesta
1
Hubiese sido bueno saber en que tipo de Base de Datos Trabajas, pero lo voy a hacer bien general (Voy a suponer que trabajas con Paradox o DBase).
La sentencia SQL para sumar un campo (Columna) es:
SELECT SUM(Valor) FROM "EJEMPLO.DB"
Esto te suma todos los valores del campo "Valores"
Si vos quieres mostrar los y también la suma de los mismos tienes que hacer por separado, o sea, usando dos TQuery así:
1° TQuery
SELECT Valor FROM "EJEMPLO.DB" para mistrar los valores y
2° TQuery (Al que actualizaras cada vez que actualices el 1° TQuery)
SELECT SUM(Valor) FROM "EJEMPLO.DB"
Un ejemplo para que veas
ACLARACIÓN
Este ejemplo supones que tienes una tabla llamada ejemplo. Db, la cual tiene solo un campo llamado valor en el mismo lugar donde se encuentre el .exe
//Esta es el archivo Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls, Mask, DBCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
QMuestraValores: TQuery;
QSumaValores: TQuery;
DSQMuestraValores: TDataSource;
DSQSumaValores: TDataSource;
DBGrid1: TDBGrid;
QMuestraValoresValor: TSmallintField;
DBEdit1: TDBEdit;
QSumaValoresTotal: TFloatField;
Memo1: TMemo;
procedure ActualizaTotal(DataSet: TDataSet);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ActualizaTotal(DataSet: TDataSet);
begin
//Controla siempre si esta cerrada para abrirla
if Not QSumaValores.Active Then
Begin
//Si esta Cerrada Abrila
QSumaValores.Open;
End
Else Begin
//Si esta Abierta Carrala y Abrila para actualizar;
QSumaValores.Close;
QSumaValores.Open;
End;
//Aca lo ponemos en un memo que es lo mismo que un campo memo
Memo1.Text := QSumaValoresTotal.AsString;
//Para un DBMemo es
//DBMemo.Value := QSumaValoresTotal.AsString;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
QMuestraValores.DatabaseName := ExtractFilePath(Application.ExeName);
QSumaValores.DatabaseName := ExtractFilePath(Application.ExeName);
//El TQuery que suma se abre con el evento onOpen de el TQuery siguiente
QMuestraValores.Open;
end;
end.
//Este es el archivo Unit1.dfm
object Form1: TForm1
Left = 312
Top = 136
Width = 162
Height = 330
Caption = 'Suma Campos'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnActivate = FormActivate
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 25
Top = 10
Width = 99
Height = 156
DataSource = DSQMuestraValores
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
Columns = <
item
Expanded = False
FieldName = 'Valor'
Visible = True
end>
end
object DBEdit1: TDBEdit
Left = 25
Top = 177
Width = 96
Height = 21
DataField = 'Total'
DataSource = DSQSumaValores
TabOrder = 1
end
object Memo1: TMemo
Left = 24
Top = 210
Width = 98
Height = 79
TabOrder = 2
end
object QMuestraValores: TQuery
AfterOpen = ActualizaTotal
AfterEdit = ActualizaTotal
AfterPost = ActualizaTotal
AfterDelete = ActualizaTotal
RequestLive = True
SQL.Strings = (
'SELECT Valor'
'FROM "Ejemplo.db"')
Left = 40
Top = 60
object QMuestraValoresValor: TSmallintField
FieldName = 'Valor'
end
end
object QSumaValores: TQuery
SQL.Strings = (
'SELECT SUM(Valor) as Total'
'FROM "Ejemplo.db"')
Left = 35
Top = 120
object QSumaValoresTotal: TFloatField
FieldName = 'Total'
end
end
object DSQMuestraValores: TDataSource
DataSet = QMuestraValores
Left = 85
Top = 60
end
object DSQSumaValores: TDataSource
DataSet = QSumaValores
Left = 85
Top = 120
end
end
Creo que te va a servir, Revisa los eventos que ahí esta todo el PRG
DX

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas