DBGrid - Calcular Campo Saldo como Extrato Bancario

MySQL

13/11/2011

Avalie a situação, no Form PESQCAIXA possuo um DBGRID, ligado a uma ZQuery, q entre outros campos mostra o R$ LANÇ, R$ SALDO e TIPO (Despesa ou Receita), a ideia é q funcione como extrato de banco, onde a cada novo lançamento a coluna SALDO receba o valor do Saldo Anterior somando ou diminuindo o R$ LANÇ de acordo ao TIPO (Despesa ou Receita), qdo eu gero uma consulta GERAL com todos os lançamentos, tudo OK, o problema é qdo eu filtro por um periodo (data) ou tipo (despesa ou receita), nao estou conseguindo atualiza-la a cada lançamento, ou seja, é necessario pegar o saldo da linha anterior efetuar o calculo conforme tipo. A atraves de sql nao fui bem sucedido, após consultas em fóruns li sobre TRIGGERS ou STORED PROCEDURE, gostaria c possivel contar com tua ajuda, pois estou começando a desesperar (hehe), haja vista q nao consigo uma solução para esta situação, verifique as situações possiveis (SQL, TRIGGER ou STORED PROCEDURE) e veja como consegue me ajudar. Segue abaixo e em ANEXO algumas informações para facilitar o entendimento da extrutura...

Delphi 7 / Mysql / Zeos


Tabela CAIXA...

CREATE TABLE `caixa` (
`CX_cd` int(10) NOT NULL auto_increment,
`CX_dtAtual` date NOT NULL,
`CX_desc` varchar(50) NOT NULL,
`CX_valLan` float(8,2) NOT NULL,
`CX_saldo` float(8,2) NOT NULL,
`CX_tipo` varchar(10) NOT NULL,
`CX_obs` text,
`COR_cd` int(10) default NULL,
`USU_cd` int(10) default NULL,
`MOT_cd` int(10) default NULL,
PRIMARY KEY (`CX_cd`),
UNIQUE KEY `CX_cd` (`CX_cd`),
KEY `COR_cd` (`COR_cd`),
KEY `USU_cd` (`USU_cd`),
KEY `MOT_cd` (`MOT_cd`),
CONSTRAINT `caixa_fk` FOREIGN KEY (`COR_cd`) REFERENCES `corridas` (`COR_cd`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `caixa_fk1` FOREIGN KEY (`USU_cd`) REFERENCES `usuarios` (`USU_cd`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `caixa_fk2` FOREIGN KEY (`MOT_cd`) REFERENCES `motocicletas` (`MOT_cd`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=16384 COMMENT=’InnoDB free: 3072 kB; (`COR_cd`) REFER `me/corridas`(`COR_cd’;




SQL (query) Pesquisa Form PESQCAIXA...

procedure TFormPesqCaixa.EditCX_pesquisaChange(Sender: TObject);
begin
if (RG_PesqCaixa.ItemIndex = 1) then
begin
with dm.ZQ_caixa do
begin
Close;
with sql do
begin
Clear;
add ( select * from caixa);
add ( where CX_dtAtual >= :data1 and CX_dtAtual <= :data2;);
ParamByName(data1).AsDate := DateTimePickerCX_pesquisa1.Date;
ParamByName(data2).AsDate := DateTimePickerCX_pesquisa2.Date;
Open;
end;
end;
end

else if (RG_PesqCaixa.ItemIndex <> 1) and (EditCX_pesquisa.Text = ) then
begin
with dm.ZQ_caixa do
begin
Close;
with sql do
begin
Clear;
add ( select * from caixa);
add ( where CX_dtAtual >= :data1 and CX_dtAtual <= :data2;);
ParamByName(data1).AsDate := DateTimePickerCX_pesquisa1.Date;
ParamByName(data2).AsDate := DateTimePickerCX_pesquisa2.Date;
Open;
end;
end;
EditCX_pesquisa.SetFocus;
end

else
begin
with dm.ZQ_caixa do
begin
Close;
with sql do
begin
Clear;
add (select * from caixa);
if EditCX_pesquisa.Text <> then
begin
Add(where );
case RG_Pesqcaixa.ItemIndex of
0: add (CX_cd = :codigo and CX_dtAtual >= :data1 and CX_dtAtual <= :data2);
2: add (CX_tipo like :tipo and CX_dtAtual >= :data1 and CX_dtAtual <= :data2);
3: add (COR_cd = :corrida and CX_dtAtual >= :data1 and CX_dtAtual <= :data2);
4: add (CX_desc like :placa and CX_dtAtual >= :data1 and CX_dtAtual <= :data2);
end;
end;
end;
if EditCx_pesquisa.Text <> then
begin
case RG_Pesqcaixa.ItemIndex of
0: begin
ParamByName(codigo).AsInteger := StrToInt (EditCX_pesquisa.Text);
ParamByName(data1).AsDate := DateTimePickerCX_pesquisa1.Date;
ParamByName(data2).AsDate := DateTimePickerCX_pesquisa2.Date;
end;
2: begin
ParamByName(tipo).AsString := EditCX_pesquisa.Text+%;
ParamByName(data1).AsDate := DateTimePickerCX_pesquisa1.Date;
ParamByName(data2).AsDate := DateTimePickerCX_pesquisa2.Date;
end;
3: begin
ParamByName(corrida).AsInteger := StrToInt (EditCX_pesquisa.Text);
ParamByName(data1).AsDate := DateTimePickerCX_pesquisa1.Date;
ParamByName(data2).AsDate := DateTimePickerCX_pesquisa2.Date;
end;
4: begin
ParamByName(placa).AsString := EditCX_pesquisa.Text+%;
ParamByName(data1).AsDate := DateTimePickerCX_pesquisa1.Date;
ParamByName(data2).AsDate := DateTimePickerCX_pesquisa2.Date;
end;
end;
end;
Open;
end;
EditCX_pesquisa.SetFocus;
end;
end;


Telas Forms PESQCAIXA (Anexo)...

Exemplo1: Correto assim…
Cód Data Lanç. Descrição R$ Valor R$ Saldo Tipo
8 12/11/2011 DESPESA R$ 10,00 R$ 42,00 DESPESA
9 12/11/2011 DESPESA1 R$ 2,00 R$ 40,00 DESPESA
10 12/11/2011 RECEITA R$ 10,00 R$ 50,00 RECEITA
11 12/11/2011 RECEITA1 R$ 5,00 R$ 55,00 RECEITA
12 12/11/2011 DESPESA2 R$ 5,00 R$ 50,00 DESPESA
13 12/11/2011 RECEITA2 R$ 15,00 R$ 65,00 RECEITA


Exemplo 2: ERRADO assim…
Cód Data Lanç. Descrição R$ Valor R$ Saldo Tipo
8 12/11/2011 DESPESA R$ 10,00 R$ 42,00 DESPESA
9 12/11/2011 DESPESA1 R$ 2,00 R$ 40,00 DESPESA
12 12/11/2011 DESPESA2 R$ 5,00 R$ 50,00 DESPESA


Exemplo 2: Correto seria assim…
Cód Data Lanç. Descrição R$ Valor R$ Saldo Tipo
8 12/11/2011 DESPESA R$ 10,00 R$ 42,00 DESPESA
9 12/11/2011 DESPESA1 R$ 2,00 R$ 40,00 DESPESA
12 12/11/2011 DESPESA2 R$ 5,00 R$ 35,00 DESPESA

Atenciosamente;

 
Gilson de Souza Carvalho

DAgro Máqs. e Equips. Agrics.

Telefone/Fax: (77) 3689 1066
Celular/Skype: (62) 9669 2000
(77) 9943 6045
E-mail: gaucho.gilson@hotmail.com
gaucho.gilson@gmail.com
gaucho.gilson@vivo.blackberry.com

Msn:  gaucho.gilson@hotmail.com
Skype: gaucho.gilson

Antes de imprimir pense em sua responsabilidade com o MEIO AMBIENTE!
Gaucho.gilson

Gaucho.gilson

Curtidas 0
POSTAR