none
Ajuda em uma trigger insert e update RRS feed

  • Pergunta

  • Bom dia 

    estou com um problema no banco SQL SERVER 2005 estou tentando criar uma trigger, mais não estou conseguindo quando tenho q alterar algo em outra tabela não encontro problemas, agora alterar dentro da mesma tabela ta me complicando.

    o problema é o seguinte tenho a tabela abastecimento

    PK- idabastecimento

    Fk - veiculo

    n_nota

    km_inicial

    km_final

    km_percorrido

    media

    estou tentando criar uma trigger q quando eu inserir o km_inicial ele faça um update no registro anterior e insira esse km_inicial como km_final.

    mais estou com problema de fazer esse where 

    Agradeço Atenção 

    Adriano 

     

     

     

     

    domingo, 6 de fevereiro de 2011 14:13

Respostas

  • Boa noite 
    mudei um pouco a trigger 
    fiz ela ja para calcular a media junto dentro do SQL ta rodando, agora vou voltar vb.net 
    obrigado pela atenção
    aqui ta a trigger q eu fiz baseado na sua 

    CREATE TRIGGER [dbo].[triggerUp]
    ON [dbo].[abastecimento]
    FOR update
    AS
    DECLARE @id_abastecimento int, @veiculo int, @km_inicial int,@codigo int,@quantidade int
    SET @id_abastecimento = (SELECT id_abastecimento FROM inserted)
    SET @veiculo = (SELECT ID_veiculo FROM inserted)
    set @km_inicial = (SELECT km_inicial FROM inserted)
    set @codigo = (SELECT TOP 1 
    id_abastecimento 
    FROM 
    abastecimento 
    WHERE 
    id_abastecimento <> @id_abastecimento 
    AND cdveiculo = @veiculo
    ORDER BY 
    id_abastecimento DESC)

    set @quantidade =(SELECT     dbo.item_produto.quantidade
    FROM         dbo.item_produto INNER JOIN
                         dbo.produto ON dbo.item_produto.produto = dbo.produto.cdproduto INNER JOIN
                           dbo.tipo_produto ON dbo.produto.tipo_produto = dbo.tipo_produto.cdtpproduto INNER JOIN
                         dbo.abastecimento ON dbo.item_produto.abastecimento =  dbo.abastecimento.id_abastecimento and  dbo.abastecimento.id_abastecimento=@codigo)

    UPDATE 
    abastecimento 
    SET 
    km_final = @km_inicial,
    km_hora = km_final - km_inicial,
      media=km_hora/@quantidade
    WHERE 
    id_abastecimento = @codigo
    • Marcado como Resposta kroyss terça-feira, 8 de fevereiro de 2011 00:09
    terça-feira, 8 de fevereiro de 2011 00:08

Todas as Respostas

  • Kroyssm boa tarde,

    eu faria diferente.

    na procedure de Insert desta tabela, ja faria o update na linha anterior, mais ou menos assim:

    --acha o id da ultima linha
    declare @id int
    set @id = (select max(idabastecimento) from Abastecimento)
    
    --Faz o update da ultima linha
    update Abastecimento
    set Km_Final = @Km_Inicial where idabastecimento=@id
    
    --Insere a nova lina
    Insert into Abastecimento(...)
    values(...)
    

     


    Caio Vitullo
    domingo, 6 de fevereiro de 2011 15:36
  • Obrigado Caio Vitullo

    esse software q to fazendo quis facilitar e usar as ferramentas prontas do vb.net, vou tentar fazer assim como vc falou, mais não sei se vou conseguir, não to usando uma procedure dentro do banco para fazer a insert,  to usando a ferramenta databinding do vb.net que ja me da pronto,  mais vou tentar entender como a ferramenta funciona para ver se consigo alterar dentro do vb.net mesmo.

     

    obrigado pela atenção

     

    Adriano Q. Dutra

    domingo, 6 de fevereiro de 2011 17:09
  • Kroyss, creio que você tenha que fazer mais ou menos isso.

    Obs. Você pode também já calcular a km percorrida.

    CREATE TRIGGER triggerUp
    ON abastecimento
    FOR UPDATE
    AS
    DECLARE @id_abastecimento int, @veiculo int, @km_inicial int
    SET @ID = (SELECT ID FROM inserted)
    SET @Name = (SELECT Name FROM inserted)
    set @km_inicial = (SELECT km_inicial FROM inserted)
    
    UPDATE 
    	abastecimento 
    SET 
    	km_final = @km_inicial
    	,km_percorrido = km_final - @km_inicial 
    WHERE 
    	id_abastecimento = (
    						SELECT TOP 1 
    							id_abastecimento 
    						FROM 
    							abastecimento 
    						WHERE 
    							id_abastecimento <> @id_abastecimento 
    							AND veiculo = @veiculo
    						ORDER BY 
    							id_abastecimento DESC
    						)
    
    GO
    

    Abraço

    Estevam


    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    domingo, 6 de fevereiro de 2011 17:41
  • obrigado Estevam 

    Vou testar assim q tiver o resultado se for positivo marco ela 

     

    Abraço 

    Adriano

    domingo, 6 de fevereiro de 2011 17:57
  • Boa noite 

    tive testando a trigger não deu certo :(

     

    vou ver se consigo descobrir o q ta acontecendo 

     

    obrigado pela atenção

     

    segunda-feira, 7 de fevereiro de 2011 00:39
  • Kroyss, mas o que não deu certo, deu erro na trigger ou simplesmente não atualizou conforme sua necessidade?

    Obs.: Para verificar o que a trigger executou, se você estiver utilizando o SQL Server, procure o "SQL Profiler" do próprio SQL para verificar o que foi executado.

    Abraço

    Estevam


    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    segunda-feira, 7 de fevereiro de 2011 00:59
  • a trigger criou só não atualizou 

     

    segunda-feira, 7 de fevereiro de 2011 01:01
  • Tente executar o update da trigger direto no SQL para verificar se atualiza conforme sua necessidade, troque as informações e veja o resultado.

    Abraço

    Estevam


    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    segunda-feira, 7 de fevereiro de 2011 01:04
  • Bom dentro do slq aparentemente ta funcionando, tava dando um erro no calculo troquei o @km_inicial pelo coluna km_inicial pq ele tava usando o valor da variavel  q tinha passado o valor para o km_fina para fazer o calculo.

     

    vou alterar algumas coisas no vb.net depois e testo por la, amanhã confirmo se deu certo.

     

    Obrigado pela Atenção

    Abraço Adriano

    segunda-feira, 7 de fevereiro de 2011 02:13
  • Boa noite 
    mudei um pouco a trigger 
    fiz ela ja para calcular a media junto dentro do SQL ta rodando, agora vou voltar vb.net 
    obrigado pela atenção
    aqui ta a trigger q eu fiz baseado na sua 

    CREATE TRIGGER [dbo].[triggerUp]
    ON [dbo].[abastecimento]
    FOR update
    AS
    DECLARE @id_abastecimento int, @veiculo int, @km_inicial int,@codigo int,@quantidade int
    SET @id_abastecimento = (SELECT id_abastecimento FROM inserted)
    SET @veiculo = (SELECT ID_veiculo FROM inserted)
    set @km_inicial = (SELECT km_inicial FROM inserted)
    set @codigo = (SELECT TOP 1 
    id_abastecimento 
    FROM 
    abastecimento 
    WHERE 
    id_abastecimento <> @id_abastecimento 
    AND cdveiculo = @veiculo
    ORDER BY 
    id_abastecimento DESC)

    set @quantidade =(SELECT     dbo.item_produto.quantidade
    FROM         dbo.item_produto INNER JOIN
                         dbo.produto ON dbo.item_produto.produto = dbo.produto.cdproduto INNER JOIN
                           dbo.tipo_produto ON dbo.produto.tipo_produto = dbo.tipo_produto.cdtpproduto INNER JOIN
                         dbo.abastecimento ON dbo.item_produto.abastecimento =  dbo.abastecimento.id_abastecimento and  dbo.abastecimento.id_abastecimento=@codigo)

    UPDATE 
    abastecimento 
    SET 
    km_final = @km_inicial,
    km_hora = km_final - km_inicial,
      media=km_hora/@quantidade
    WHERE 
    id_abastecimento = @codigo
    • Marcado como Resposta kroyss terça-feira, 8 de fevereiro de 2011 00:09
    terça-feira, 8 de fevereiro de 2011 00:08