[firebase-br] saldo calculado pela data

Fabiano Lima frguitar em bol.com.br
Ter Nov 8 15:29:30 -03 2011



Opa, boa tarde pessoal.

Lá atras em setembro consegui a solução par um problema de um recalculo de saldo.

Como visto no link 
http://mail.firebase.com.br/pipermail/lista_firebase.com.br/2011-September/075616.html

Fiz algumas adaptações ao longo do tempo e me deparei com 2 problemas.
Primeiro,  por falta de atenção de minha parte eu não notei que os calculos tem  que serem feitos na ordem de data e não do lancamento.
adaptando o trigger ele não soma quando existem 2 datas iguais.
Outro problema é que quando um registro la no meio é deletado os triggers não recalculam.
Segue as triggers atuais.



CREATE OR ALTER trigger trg_saldo_up_before for lanc
active before insert or update or delete position 2
AS
DECLARE VARIABLE SALDOANTERIOR NUMERIC (11,2);

BEGIN

 /* Primeiro passo, obter o saldo anterior, se existirem lançamentos
anteriores então obtenho o saldo do último lançamento caso contrário
obtenho o saldo inicial do banco */

 IF (EXISTS(SELECT 0 FROM LANC WHERE DATA < NEW.DATA or DATA = NEW.DATA  AND CCONTA = NEW.CCONTA)) THEN
 SELECT FIRST 1 SALDO FROM LANC WHERE DATA < NEW.DATA or DATA = NEW.DATA  AND CCONTA = NEW.CCONTA
ORDER BY DATA DESC INTO :SALDOANTERIOR;
 ELSE
 SELECT SALDO_INI FROM CADBANCO WHERE CCONTA = NEW.CCONTA INTO
:SALDOANTERIOR;

 /* Calcula o saldo atual */

 NEW.SALDO = SALDOANTERIOR + NEW.CREDITO - NEW.DEBITO;

END





CREATE OR ALTER trigger trg_saldo_up_after for lanc
active after insert or update or delete position 0
AS
DECLARE VARIABLE LANCAMENTO DATE;

BEGIN

 /* Localiza o próximo lançamento */

 SELECT FIRST 1 DATA FROM LANC WHERE DATA > NEW.DATA ORDER
BY DATA INTO :LANCAMENTO;

 /* Simula a alteração do próximo lançamento para que o FIREBIRD
gere uma nova chamada a TRIGGER de atualização do SALDO */

 UPDATE LANC SET CREDITO = CREDITO WHERE DATA = :LANCAMENTO;

END





Agradeço qualquer ajuda.
Fabiano




Mais detalhes sobre a lista de discussão lista