Cursor com dois Updates
Pessoal,
O negocio é o seguinte:
Ao dar entradas de produtos no estoque, a tabela ItemMovimentacao, recebe os itens e suas quantidades... Após efetuar a entrada de todos os item tenho q atualizar a quantidade dos produtos na tabela produtos.
Fiz um cursor que que faz a atualização do campo quantidade na tabela produto. Para isso, fiz o select na tabela ItemMovimentacao, e estou atualizando na tabela produto. até ai tudo ok! Sendo que eu preciso atualizar também o campo QTDATUALIZACAO na propria tabela ItemMovimentacao (tabela do proprio select). Se eu comentar a linha do UPDate da tabela ItemMovimentacao, o cursor funciona... caso contrario, dá o seguinte erro:
Provavelmente nao estou podendo atualizar a propria tabela do select, mas existe alguma saida?
O negocio é o seguinte:
Ao dar entradas de produtos no estoque, a tabela ItemMovimentacao, recebe os itens e suas quantidades... Após efetuar a entrada de todos os item tenho q atualizar a quantidade dos produtos na tabela produtos.
Fiz um cursor que que faz a atualização do campo quantidade na tabela produto. Para isso, fiz o select na tabela ItemMovimentacao, e estou atualizando na tabela produto. até ai tudo ok! Sendo que eu preciso atualizar também o campo QTDATUALIZACAO na propria tabela ItemMovimentacao (tabela do proprio select). Se eu comentar a linha do UPDate da tabela ItemMovimentacao, o cursor funciona... caso contrario, dá o seguinte erro:
Arithmetic OverFlow or Division By Zero has occurred. Arithmetic Exception, Numeric OverFlow or String Truncation.
FOR SELECT IDPRODUTO, IDITEMMOVIMENTACAO, QTDMOVIMENTACAO, QTDATUALIZACAO FROM ITEMMOVIMENTACAO WHERE IDMOVIMENTACAO = NEW.IDMOVIMENTACAO INTO :IDPRODUTO, :IDITEMMOVIMENTACAO, :QTDMOVIMENTACAO, :QTDATUALIZACAO DO BEGIN /*ALTERA A O ESTOQUE DO PRODUTO E DEPOIS INCLUI A QTD DE ATUALIZACAO*/ UPDATE PRODUTO SET PRODUTO.ESTOQUEATUAL = PRODUTO.ESTOQUEATUAL + :QTDMOVIMENTACAO WHERE IDPRODUTO = :IDPRODUTO; UPDATE ITEMMOVIMENTACAO SET QTDATUALIZACAO = :QTDMOVIMENTACAO WHERE IDITEMMOVIMENTACAO = :IDITEMMOVIMENTACAO; END /*FOR SELECT*/
Provavelmente nao estou podendo atualizar a propria tabela do select, mas existe alguma saida?
Rafaelunp
Curtidas 0
Respostas
Afarias
29/09/2004
Me explica uma coisa, qual o sentido disso?? 1=1 ??
pq vc vai pegar o valor q está no campo (tabela ITEMMOVIMENTACAO) e atualizar novamente com o mesmo valor?? Além do mais, o erro não me parece ser ai, mas em alguma outro lugar... outra trigger possivelmente.
T+
pq vc vai pegar o valor q está no campo (tabela ITEMMOVIMENTACAO) e atualizar novamente com o mesmo valor?? Além do mais, o erro não me parece ser ai, mas em alguma outro lugar... outra trigger possivelmente.
T+
GOSTEI 0
Rafaelunp
29/09/2004
Me explica uma coisa, qual o sentido disso?? 1=1 ??
pq vc vai pegar o valor q está no campo (tabela ITEMMOVIMENTACAO) e atualizar novamente com o mesmo valor?? Além do mais, o erro não me parece ser ai, mas em alguma outro lugar... outra trigger possivelmente.
T+
AFarias,
O negocio é o seguinte:
Na tabela ItemMovimentacao, possui dois campos:
QtdMovimentacao, QtdAtualizada, pois essa tabela tambem é usada pra dar saida de produtos...
entao o usuario pode solicitar 5 refrigerantes e ter apenas 3 no estoque, para este caso, eu atualizaria a qtdAtualizacao para 3... Sendo que nao estou tratando isto neste momento (nem comecei a tratar ainda).... gostaria de fazer isso funcionar primeiro...
|Além do mais, o erro não me parece ser ai, mas em alguma outro |lugar... outra trigger possivelmente.
Andei analisando minhas triggers... na trigger de update da tabela ItemMovimentacao, ocorre o mesmo erro se eu for atualizar algum produto...
A trigger é esta:
DECLARE VARIABLE NUMROWS INTEGER; DECLARE VARIABLE ZTIPOMOVIMENTACAO CHAR(1); DECLARE VARIABLE ZSITUACAO CHAR(1); BEGIN /*NAO PERMITIR ALTERAR SE SITUACAO FOR AT*/ SELECT SITUACAO FROM MOVIMENTACAO WHERE IDMOVIMENTACAO = NEW.IDMOVIMENTACAO INTO :ZSITUACAO; IF (ZSITUACAO = ´AT´) THEN BEGIN EXCEPTION "OperacaoAtualizada"; END SELECT COUNT(*) FROM PRODUTO WHERE NEW.IDPRODUTO = PRODUTO.IDPRODUTO INTO :NUMROWS; IF (NUMROWS = 0) THEN BEGIN EXCEPTION E_FILHO_ATUALIZAR_RESTRICT; END SELECT COUNT(*) FROM MOVIMENTACAO WHERE NEW.IDMOVIMENTACAO = MOVIMENTACAO.IDMOVIMENTACAO INTO :NUMROWS; IF ( NUMROWS = 0) THEN BEGIN EXCEPTION E_FILHO_ATUALIZAR_RESTRICT; END /*NAO PERMITIR ALTERAR PRODUTO */ IF (NEW.IDPRODUTO <> OLD.IDPRODUTO) THEN BEGIN EXCEPTION "AlterarProduto"; END END
do tipo AFTER POST....
GOSTEI 0
Afarias
29/09/2004
mais alguma trigger?!
T+
T+
GOSTEI 0
Rafaelunp
29/09/2004
mais alguma trigger?!
T+
AFarias,
Eu tenho as triggers abaixo que fazem parte da transação (UPDATE)...
Fora estas meu banco está cheio de triggers...
E com relação às tabelas relacionadas (MOVIMENTACAO e ITEMMOVIMENTACAO), eu tenho trigges de INSERT e de DELETE... que imagino nao fazer parte do problema proposto...
TU_ITEMMOVIMENTACAO - AFTER AS DECLARE VARIABLE NUMROWS INTEGER; DECLARE VARIABLE ZTIPOMOVIMENTACAO CHAR(1); DECLARE VARIABLE ZSITUACAO CHAR(1); BEGIN /*NAO PERMITIR ALTERAR SE SITUACAO FOR AT*/ SELECT SITUACAO FROM MOVIMENTACAO WHERE IDMOVIMENTACAO = NEW.IDMOVIMENTACAO INTO :ZSITUACAO; IF (ZSITUACAO = ´AT´) THEN BEGIN EXCEPTION "OperacaoAtualizada"; END SELECT COUNT(*) FROM PRODUTO WHERE NEW.IDPRODUTO = PRODUTO.IDPRODUTO INTO :NUMROWS; IF ( NUMROWS = 0) THEN BEGIN EXCEPTION E_FILHO_ATUALIZAR_RESTRICT; END SELECT COUNT(*) FROM MOVIMENTACAO WHERE NEW.IDMOVIMENTACAO = MOVIMENTACAO.IDMOVIMENTACAO INTO :NUMROWS; IF ( NUMROWS = 0) THEN BEGIN EXCEPTION E_FILHO_ATUALIZAR_RESTRICT; END /*NAO PERMITIR ALTERAR PRODUTO */ IF (NEW.IDPRODUTO <> OLD.IDPRODUTO) THEN BEGIN EXCEPTION "AlterarProduto"; END END ------ TU_MOVIMENTACAO - AFTER AS DECLARE VARIABLE NUMROWS INTEGER; DECLARE VARIABLE IDPRODUTO INTEGER; DECLARE VARIABLE IDITEMMOVIMENTACAO INTEGER; DECLARE VARIABLE QTDMOVIMENTACAO FLOAT; DECLARE VARIABLE QTDATUALIZACAO FLOAT; BEGIN IF (OLD.SITUACAO = ´AT´) THEN BEGIN EXCEPTION "AlterarEntrada"; END /*SE ALTERAR O IDMOVIMENTACAO*/ IF (OLD.IDMOVIMENTACAO <> NEW.IDMOVIMENTACAO) THEN BEGIN SELECT COUNT(*) FROM ITEMMOVIMENTACAO WHERE ITEMMOVIMENTACAO.IDMOVIMENTACAO = OLD.IDMOVIMENTACAO INTO :NUMROWS; IF (NUMROWS > 0) THEN BEGIN EXCEPTION e_pai_atualizar_restrict; END END SELECT COUNT(*) FROM FUNCIONARIO WHERE NEW.IDFUNCIONARIOSOLICITA = FUNCIONARIO.IDFUNCIONARIO INTO :NUMROWS; IF (NUMROWS = 0) THEN BEGIN EXCEPTION e_pai_atualizar_restrict; END IF ((OLD.SITUACAO = ´AB´) AND (NEW.SITUACAO = ´AT´)) THEN BEGIN FOR SELECT IDPRODUTO, IDITEMMOVIMENTACAO, QTDMOVIMENTACAO, QTDATUALIZACAO FROM ITEMMOVIMENTACAO WHERE IDMOVIMENTACAO = NEW.IDMOVIMENTACAO INTO :IDPRODUTO, :IDITEMMOVIMENTACAO, :QTDMOVIMENTACAO, :QTDATUALIZACAO DO BEGIN /*SE FOR ENTRADA */ if (NEW.tipomovimentacao = ´E´) then BEGIN /*ALTERA A O ESTOQUE DO PRODUTO E DEPOIS INCLUI A QTD DE ATUALIZACAO*/ UPDATE PRODUTO SET PRODUTO.ESTOQUEATUAL = PRODUTO.ESTOQUEATUAL + :QTDMOVIMENTACAO WHERE IDPRODUTO = :IDPRODUTO; /* UPDATE ITEMMOVIMENTACAO SET QTDATUALIZACAO = :QTDMOVIMENTACAO WHERE IDITEMMOVIMENTACAO = :IDITEMMOVIMENTACAO;*/ END /* SE FOR SAÍDA */ if (NEW.tipomovimentacao = ´S´) then BEGIN /*ALTERA A O ESTOQUE DO PRODUTO E DEPOIS INCLUI A QTD DE ATUALIZACAO*/ UPDATE PRODUTO SET PRODUTO.ESTOQUEATUAL = PRODUTO.ESTOQUEATUAL - :QTDMOVIMENTACAO WHERE IDPRODUTO = :IDPRODUTO; /* UPDATE ITEMMOVIMENTACAO SET QTDATUALIZACAO = :QTDMOVIMENTACAO WHERE IDITEMMOVIMENTACAO = :IDITEMMOVIMENTACAO;*/ END /* SE FOR INVENTARIO */ if (NEW.tipomovimentacao = ´I´) then BEGIN /*ALTERA A O ESTOQUE DO PRODUTO E DEPOIS INCLUI A QTD DE ATUALIZACAO*/ UPDATE PRODUTO SET PRODUTO.ESTOQUEATUAL = :QTDMOVIMENTACAO WHERE IDPRODUTO = :IDPRODUTO; /* UPDATE ITEMMOVIMENTACAO SET QTDATUALIZACAO = :QTDMOVIMENTACAO WHERE IDITEMMOVIMENTACAO = :IDITEMMOVIMENTACAO;*/ END END /*FOR SELECT*/ END /*FIM SE*/ END ------- TUB_MOVIMENTACAO - BEFORE AS BEGIN /*SE SITUACAO = AB, DATAATUALIZACAO = NULL*/ if (NEW.situacao = ´AB´) then BEGIN NEW.dataatualizacao = NULL; END END
GOSTEI 0
Vinicius2k
29/09/2004
Nesta primeira trigger, a variável ZSITUACAO definida como CHAR(1), aparentemente, está recebendo um valor de comprimento maior do que ela suporta, visto que abaixo vc a está comparando com ´AT´...
É isso?
T+
É isso?
T+
GOSTEI 0
Rafaelunp
29/09/2004
Nesta primeira trigger, a variável ZSITUACAO definida como CHAR(1), aparentemente, está recebendo um valor de comprimento maior do que ela suporta, visto que abaixo vc a está comparando com ´AT´...
É isso?
T+
Realmente estava errado, Obrigado...
Já alterei aqui, mas nao afetou na resolução deste problema...
GOSTEI 0
Vinicius2k
29/09/2004
O problema, creio eu, ser o mesmo... vc só precisa revisar seu código e encontrar o(s) local(is) onde variáveis ou colunas estão recebendo valores de comprimento maior que o suportado por elas...
Esta é a principal, senão a única, causa da mensagem de erro que vc descreveu no primeiro post...
T+
Esta é a principal, senão a única, causa da mensagem de erro que vc descreveu no primeiro post...
T+
GOSTEI 0
Rafaelunp
29/09/2004
O problema, creio eu, ser o mesmo... vc só precisa revisar seu código e encontrar o(s) local(is) onde variáveis ou colunas estão recebendo valores de comprimento maior que o suportado por elas...
Esta é a principal, senão a única, causa da mensagem de erro que vc descreveu no primeiro post...
T+
Blz, era isso mesmo... tinha outra trigger bangunçando o esquema...
valew galera
GOSTEI 0