Consulta com somatório parcial a cada registro

Delphi

16/05/2005

Srs ,

alguem têm uma querie do tipo : existe uma coluna que é sempre o somatório de uma outra coluna somando todas as linhas anteriores e mais a última mostrada .

Ex.

data descrição valor
09/09/2004 teste1 100,00
10/09/2004 teste 2 50,00
11/10/2004 teste 3 70,00

resultado da querie
09/09/2004 teste1 100,00 100,00
10/09/2004 teste 2 50,00 150,00
11/10/2004 teste 3 70,00 220,00


Obrigado

Demóstenes


Demostenesjr

Demostenesjr

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

16/05/2005

Dê uma olhada nesse exemplo [url]http://forum.clubedelphi.net/viewtopic.php?t=52056[/url]


GOSTEI 0
Demostenesjr

Demostenesjr

16/05/2005

E se o BANco fosse uma paradox . E com SP como faria se fosse um GRID que mostrasse os movimentos e o saldo .

Obrigado


GOSTEI 0
Gandalf.nho

Gandalf.nho

16/05/2005

Acho que com Paradox não dá para fazer isso diretamente via SQL, já que não suporta SP. Acho que só fazendo campo calculado no dataset e fazendo o somatório via código diretamente na aplicação


GOSTEI 0
Joaoshi

Joaoshi

16/05/2005

Colega, talves não seja a solução mais bonita

Você pode colocar a instrução SQL dentro do TQuery (BDE), tipo select data,produto,valor, 0.00 as Total from SuaTabela.
Ligar o TQuery a DataSetProvider a ClientDataSet.

Após carregar o ClientDataSet leia do inicio ao fim e atualize o campo Total.

Espero ter ajudado.


GOSTEI 0
Demostenesjr

Demostenesjr

16/05/2005

Meu amigo , me desculpe , mas nunca usei estes componentes , como usá-los .

Obrigado


GOSTEI 0
Carlosrm

Carlosrm

16/05/2005

demostenesjr,

numa query+Sql, não sei como fazer. Usando Stored Procedures, conforme outros colegas indicaram, exige SGBD (Interbase, Firebird, MS-SQL...).
Com Paradox, inicialmente eu fiz com auxílio do Quick Report. Mas como vc quer exibir numa DBGrid, montei este exemplo, que, infelizmente, tem sua parte braçal. É preciso colocar uma Table no Form e depois preenchê-la varrendo a Query inteira.

Neste exemplo, o Form receberá: 1 Query, 1 Table, 1 Datasource, 1 DBGrid e 2 Botões. E também criar a tabela Acumulado.db (que é igual a sua tabela, porém com um campo a mais, Acumulado).
Rodou legal em D6+W98 e em D7+XPeta.
Veja abaixo o código fonte completo.
Se tiver dúvidas, post os detalhes.

(Só para citar: usando o Quick Report, não precisa desta Table. Em vez de aparecer na DBGrid, seria exibida no Preview do QR ou impressora. O acumulado dos grupos seria feito no BeforePrint da banda detalhe do QR).


carlosrm


unit Unit1; //Sub_Acumulado

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Query1: TQuery;
DataSource1: TDataSource;
butTodos: TButton;
butGroupBy: TButton;
Table1: TTable;
Query1DataDoFato: TDateField;
Query1Descricao: TStringField;
Query1Valor: TCurrencyField;
Table1DataDoFato: TDateField;
Table1Descricao: TStringField;
Table1Valor: TCurrencyField;
Table1Acumulado: TCurrencyField;
procedure butTodosClick(Sender: TObject);
procedure butGroupByClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.butTodosClick(Sender: TObject);
begin // Não usa Group By
DataSource1.DataSet := Query1;
with query1 do begin
close;
sql.clear;
sql.add(´Select DataDoFato, Descricao, Valor ´);
sql.add(´From Funcionarios Order By DataDoFato´);
open;
end;
end;

procedure TForm1.butGroupByClick(Sender: TObject);
var
SomaGrupo : Double;
begin // Usa Group By
with Query1 do begin
close;
sql.Clear;
sql.add(´Select DataDoFato, Descricao, Sum(Valor) as Valor ´);
sql.add(´From Funcionarios ´);
sql.add(´Group By DataDoFato, Descricao´);
open;
end;

SomaGrupo := 0.0;
table1.close;
table1.exclusive := true;
table1.emptytable; // Esvazia a tabela Acumulado.db, antes table1.exclusive := false; // de exibir na DBGrid
table1.open;
while NOT Query1.eof do begin
Somagrupo := SomaGrupo + Query1.Fields[2].AsFloat;
table1.append;
table1.Fields[0].AsDateTime := Query1DataDoFato.AsDateTime;
table1.Fields[1].AsString := Query1Descricao.AsString;
table1.Fields[2].AsFloat := Query1Valor.AsFloat;
table1.Fields[3].AsFloat := SomaGrupo;
Query1.Next;
end;
table1.First;
Datasource1.DataSet := table1;
end;

end.

************************************
Talelas Paradox

Funcionarios.db (Essa representa a sua tabela).

DataDoFato Descricao Valor
09/09/2004 teste___1 R$ 100,00
10/09/2004 teste___2 R$ 050,00
10/09/2004 teste___2 R$ 014,00
10/09/2004 teste___2 R$ 039,00
11/09/2004 teste___3 R$ 070,00


Acumulados.db (valores dos campos depois de execução button2)

DataDoFato Descricao Valor____ Acumulado
09/09/2004 teste___1 R$ 100,00 R$ 100,00
10/09/2004 teste___2 R$ 103,00 R$ 203,00
11/09/2004 teste___3 R$ 070,00 R$ 273,00
Obs: o campo Acumulado NÃO é calculado!
[img][/img][img][/img]


GOSTEI 0
POSTAR