[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