[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