[firebase-br] update com erro quando mais de 750 registros.

Carlos H. Cantu listas em warmboot.com.br
Seg Jan 16 09:12:25 -03 2012


Esse é o limite do Firebird para procedures e triggers recursivos,
para evitar loops infinitos. Vc tem uma falha de lógica no seu código,
visto que o trigger atualiza sua própria tabela, fazendo com que seja
disparado novamente, e assim por diante.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br

FL> Bom dia pessoal.

FL> É o seguinte, tenho 2 triggers que calculam o saldo para mim, as
FL> 2 funcionavam perfeitamente até que encontrei o seguinte erro.
FL> Quando se faz um lançamento 751 registros acima (e a trigger
FL> precisa recalcular o saldo de mais de 751 registros) ela começa a
FL> me devolver o erro Too many concurrent executions of the same request.
FL> Estranho que se seu fizer um lançamento 749 registros acima, o
FL> trigger recalcula o saldo sem maiores problemas.

FL> Seguem as 2 triggers:

FL> //// Trigger que faz o calculo de saldo ///////

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

FL> BEGIN

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

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

FL>  ELSE
FL>  SELECT SALDO_INI FROM CADBANCO WHERE CCONTA = NEW.CCONTA INTO
FL> :SALDOANTERIOR;

FL>  /* Calcula o saldo atual */

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

FL> END


FL> /////////////////////////////// Trigger que simula alteração para
FL> que os proximos registros sejam recalculados ///////////////////


FL> CREATE OR ALTER trigger trg_saldo_up_after for lanc
FL> active after insert or update position 1
FL> AS
FL> DECLARE VARIABLE LANCAMENTO TIMESTAMP;

FL> BEGIN

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

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

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

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

FL> END


FL> O problema aponta a linha que contem    UPDATE LANC SET CREDITO =
FL> CREDITO WHERE DATA = :LANCAMENTO;
FL> Minha pergunta é a seguinte, tem como eu dar um break a cada 700
FL> registros para que a trigger "pegue folego" e continue atualizando os dados posteriores?

FL> Agradeço desde ja.
FL> Att
FL> Fabiano Lima


FL> ______________________________________________
FL> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
FL> Para saber como gerenciar/excluir seu cadastro na lista, use:
FL> http://www.firebase.com.br/fb/artigo.php?id=1107
FL> Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista