Cursor com dois Updates

Firebird

29/09/2004

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:

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

Rafaelunp

Curtidas 0

Respostas

Afarias

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+


GOSTEI 0
Rafaelunp

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

Afarias

29/09/2004

mais alguma trigger?!



T+


GOSTEI 0
Rafaelunp

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

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+


GOSTEI 0
Rafaelunp

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

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+


GOSTEI 0
Rafaelunp

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
POSTAR