none
Trigger Insert com chave estrangeira RRS feed

  • Pergunta

  • Boa tarde.

    Preciso criar uma trigger de inserção, porem na tabela de destino existe uma chave estrangeira com a tabela de origem e não sei como tratar isso na instrução sql da trigger. Alguém pode me ajudar?

    Segue abaixo estrutura das tabelas e trigger (sem a instrução para chave estrangeira).

            

    [TABLE(VENDA) ]

    Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public int vendaID { get; set; }

            public int pessoaID { get; set; }
            [ForeignKey("pessoaID")]
            public Pessoa Pessoa { get; set; }

            public int tipopagrecID { get; set; }
            [ForeignKey("tipopagrecID")]
            public Tipopagrec Tipopagrec { get; set; }

            [Display(Name = "Data da Venda")]
            public DateTime datavenda { get; set; }

            [Display(Name = "Valor Total da Venda")]
            public decimal valortotalvenda { get; set; }

            public ICollection<Itemvenda> Itens { get; set; }

    [TABLE (RECECER)]

     [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public int contareceberID { get; set; }

            public int vendaID { get; set; }
            [ForeignKey("vendaID")]
            public Venda Venda { get; set; }

            [Display(Name = "Valor Receber")]
            public decimal valorreceber { get; set; }

            [Display(Name = "Valor Recebido")]
            public decimal valorrecebido { get; set; }

            [Display(Name = "Observações")]
            public string observacao { get; set; }

    --Criação da Trigger Receber

    --Dá erro referente a chave estrangeira VENDAID

    CREATE TRIGGER [dbo].[TrgReceber]
    ON [dbo].[Venda]
    FOR INSERT
    AS
    BEGIN
    DECLARE @VALORTOTALVENDA DECIMAL
    DECLARE @VENDAID INT
            SET @VALORTOTALVENDA = (SELECT VALORTOTALVENDA FROM Venda)
            INSERT INTO ContaReceber(valorreceber,valorrecebido,observacao) VALUES (@VALORTOTALVENDA,@VALORTOTALVENDA,NULL)        
    END

    Desde já, agradeço.


    Edilson A. Bispo

    sexta-feira, 11 de outubro de 2013 18:15

Respostas

  • vc está pegando o registro da tabela e não o que você está inserindo

     Experimente isso

    CREATE TRIGGER [dbo].[TrgReceber]
    ON [dbo].[Venda]
    FOR INSERT
    AS
    BEGIN
    
             INSERT INTO ContaReceber (vendaID,valorreceber,valorrecebido,observacao)  SELECT vendaID ,VALORTOTALVENDA, VALORTOTALVENDA, null FROM inserted         
    END

     

     


    Marquinhos Não esqueça de qualificar a resposta.


    terça-feira, 15 de outubro de 2013 21:37

Todas as Respostas

  • Alguém tem alguma sugestão?

    Edilson A. Bispo

    terça-feira, 15 de outubro de 2013 21:18
  • vc está pegando o registro da tabela e não o que você está inserindo

     Experimente isso

    CREATE TRIGGER [dbo].[TrgReceber]
    ON [dbo].[Venda]
    FOR INSERT
    AS
    BEGIN
    
             INSERT INTO ContaReceber (vendaID,valorreceber,valorrecebido,observacao)  SELECT vendaID ,VALORTOTALVENDA, VALORTOTALVENDA, null FROM inserted         
    END

     

     


    Marquinhos Não esqueça de qualificar a resposta.


    terça-feira, 15 de outubro de 2013 21:37
  • Boa noite Marquinhos / Durval.

    Criei a trigger conforme sugeriu, porem na hora de inserir algum registro na tabela venda, acontece o seguinte erro:

    Alguma sugestão?

    Desde já, agradeço.


    Edilson A. Bispo

    quinta-feira, 17 de outubro de 2013 01:02
  • Edilson, até imagino que seja.

    Sua tabela vendas o campo VendaID provavelmente é Identity, no caso da trigger coloque ela para executar 

    após o INSERT exemplo.

    CREATE TRIGGER [dbo].[TrgReceber]
    ON [dbo].[Venda]
      AFTER INSERT
    AS
    BEGIN
    
             INSERT INTO ContaReceber (vendaID,valorreceber,valorrecebido,observacao)  SELECT vendaID ,VALORTOTALVENDA, VALORTOTALVENDA, null FROM inserted         
    END

    Acredito que seja este o problema, se continuar com erro, manda ai a estrutura das duas tabelas, Venda e ContaReceber  e o código da trigger.


    Marquinhos Não esqueça de qualificar a resposta.

    quinta-feira, 17 de outubro de 2013 10:49
  • Boa tarde Marquinho...

    O código da trigger é o seguinte (conforme o Durval Ramos passou):

    CREATE TRIGGER [dbo].[TrgReceber]
    ON [dbo].[Venda]
    FOR INSERT
    AS
    BEGIN

             INSERT INTO ContaReceber (vendaID,valorreceber,valorrecebido,observacao)  SELECT vendaID ,VALORTOTALVENDA, VALORTOTALVENDA, null FROM inserted         
    END

    Alguma idéia?


    Edilson A. Bispo

    quinta-feira, 17 de outubro de 2013 15:26
  • Fala Edilson,

    vc tentou colocar com After Innsert

    igual eu coloquei acima?

    Parece que sua tabela de Vendas o campo VendaID é Identity


    Marquinhos Não esqueça de qualificar a resposta.


    quinta-feira, 17 de outubro de 2013 15:40
  • Boa tarde Marquinho!

    Realmente era só colocar o After no lugar do for e deu certo!

    Muito obrigado pela atenção prestada!


    Edilson A. Bispo

    domingo, 20 de outubro de 2013 14:36