[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