Dúvida

Firebird

29/08/2009

Olá do Pessoal sou novato no Fórum e em DB Firebird

estou tentando relacionar duas tabelas e não estou conseguindo...

O erro é esse:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column PRODUTO.ESTOQUE cannot be repeated in UPDATE statement.
At line 21, column 1

--diz que a tabela não está referenciada, mas está
--eu não entendo ele afirmar que o campo estoque da tabela produto
não poder ser repetido no modo de Update..


Esse é o código de relacionamento:

CREATE OR ALTER trigger d_venda_au0 for d_venda
active after update position 0
AS
begin
if (new.cod_produto <> old.cod_produto) then
begin
update produto
set ESTOQUE = (ESTOQUE + old.qtde)
where CODIGO = old.cod_produto;

update produto
set ESTOQUE = (ESTOQUE - new.qtde)
where CODIGO = new.cod_produto;
end

else
if (new.qtde <> old.qtde) then
begin
update produto
set ESTOQUE = (ESTOQUE + old.qtde),
ESTOQUE = (ESTOQUE - new.qtde)
where CODIGO = old.cod_produto;
end
end

Pessoal? se puderem me ajudar, eu agradeço muito...

Um abraço...

Geule, Porto Seguro - Arraial d´Ajuda...


Geule

Geule

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

29/08/2009

o que está sendo dito é que você não pode repetir a coluna ESTOQUE num UPDATE.
 update produto set
    ESTOQUE = (ESTOQUE + old.qtde),
    ESTOQUE = (ESTOQUE - new.qtde)
    where CODIGO = old.cod_produto;

na instrução acima você está fazendo UPDATE na coluna estoque DUAS VEZES. isso não é possível.

tente assim:
CREATE OR ALTER trigger d_venda_au0 for d_venda
active after update position 0
AS
begin
  if (new.cod_produto <> old.cod_produto) then
  begin
    update produto set
      ESTOQUE = (ESTOQUE + old.qtde)
    where CODIGO = old.cod_produto;

    update produto set
      ESTOQUE = (ESTOQUE - new.qtde)
    where CODIGO = new.cod_produto;
  end
  else
  if (new.qtde <> old.qtde) then
  begin
    update produto set
      set ESTOQUE = (ESTOQUE + (old.qtde - new.qtde))
    where CODIGO = old.cod_produto;
  end
end


veja se assim funciona:
CREATE OR ALTER trigger d_venda_au0 for d_venda
active after update position 0
AS
begin
  update produto set
    ESTOQUE = (ESTOQUE + old.qtde)
  where CODIGO = old.cod_produto;

  update produto set
    ESTOQUE = (ESTOQUE - new.qtde)
  where CODIGO = new.cod_produto;
end



GOSTEI 0
Geule

Geule

29/08/2009

Olá, obrigado pelas respostas, me serviram muito...
mas o que eu não entendi, e que com o mesmo código tinha
funcionado em outro DB, mas usando a versão 2.0 do Firebird....

Mais uma vez obriago, qualquer dúvida postarei aqui.... Valeu


GOSTEI 0
POSTAR