Fórum Cursor com dois Updates #47086
29/09/2004
0
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
Curtir tópico
+ 0Posts
29/09/2004
Afarias
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
29/09/2004
Rafaelunp
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
29/09/2004
Afarias
T+
Gostei + 0
29/09/2004
Rafaelunp
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
29/09/2004
Vinicius2k
É isso?
T+
Gostei + 0
29/09/2004
Rafaelunp
Realmente estava errado, Obrigado...
Já alterei aqui, mas nao afetou na resolução deste problema...
Gostei + 0
29/09/2004
Vinicius2k
Esta é a principal, senão a única, causa da mensagem de erro que vc descreveu no primeiro post...
T+
Gostei + 0
29/09/2004
Rafaelunp
Blz, era isso mesmo... tinha outra trigger bangunçando o esquema...
valew galera
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)