[firebase-br] update com erro quando mais de 750 registros.
Fabiano Lima
frguitar em bol.com.br
Seg Jan 16 08:16:43 -03 2012
Bom dia pessoal.
É o seguinte, tenho 2 triggers que calculam o saldo para mim, as 2 funcionavam perfeitamente até que encontrei o seguinte erro.
Quando se faz um lançamento 751 registros acima (e a trigger precisa recalcular o saldo de mais de 751 registros) ela começa a me devolver o erro Too many concurrent executions of the same request.
Estranho que se seu fizer um lançamento 749 registros acima, o trigger recalcula o saldo sem maiores problemas.
Seguem as 2 triggers:
//// Trigger que faz o calculo de saldo ///////
CREATE OR ALTER trigger trg_saldo_up_before for lanc
active before insert or update 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 AND CCONTA = NEW.CCONTA)) THEN
SELECT FIRST 1 SALDO FROM LANC WHERE 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
/////////////////////////////// Trigger que simula alteração para que os proximos registros sejam recalculados ///////////////////
CREATE OR ALTER trigger trg_saldo_up_after for lanc
active after insert or update position 1
AS
DECLARE VARIABLE LANCAMENTO TIMESTAMP;
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
O problema aponta a linha que contem UPDATE LANC SET CREDITO = CREDITO WHERE DATA = :LANCAMENTO;
Minha pergunta é a seguinte, tem como eu dar um break a cada 700 registros para que a trigger "pegue folego" e continue atualizando os dados posteriores?
Agradeço desde ja.
Att
Fabiano Lima
Mais detalhes sobre a lista de discussão lista