none
Dúvidas sobre procedure. RRS feed

  • Pergunta

  •  Boa tarde! Pessoal, eu estou com esquema de banco básico com 3 tabelas, segue print do esquema:

    Pois bem, a procedure para inserir o User é simples, mas para criar a PROCEDURE de cadastro de GASTO, eu preciso popular também a Tab_HistoricoGasto. Ok, eu tentei usar o comando ' Select @@IDENTITY as identidade' para retornar o ID_Gasto e teria que receber o parâmetro do ID_Usuario (Que vou passar na aplicação) e popular a Tabela de Histórico com as chaves estrangeiras recém geradas e Popular a tabela de Gasto.

    Obrigado pela ajuda!

    quinta-feira, 4 de setembro de 2014 17:06

Respostas

  • Ares,

    Desconsidere minha resposta... agora que entendi o que você esta fazendo...

    Esta chamando uma SP... e depois inserindo...

    Então faça assim...

    -- Inicio da SP
    CREATE PROCEDURE uspInserirHistoricoGastoEGasto
       
       @NomeUsuario NVARCHAR(50),
       @NomeGasto NVARCHAR(50),
       @TipoGasto VARCHAR(10),
       @ValorGasto DECIMAL(18,2),
       @ValorIdGasto int output
       
       AS
       BEGIN
       
       INSERT INTO tab_Gasto
       (
         NomeGasto,
         TipoGasto,
         ValorGasto
       )
       VALUES
       (
         @NomeGasto,
         @TipoGasto,
         @ValorGasto
       )
       
       set @ValorIdGasto = @@IDENTITY
       return (@ValorIdGasto)
       END
    -- Fim da SP


    -- Chamando a SP
    declare @ret int
    exec uspInserirHistoricoGastoEGasto ... todoso os paramentro ... + ,@ret output

      
       INSERT INTO Tab_HistoricoGasto
       (
         Id_Gasto,
         Id_Usuario
       )
       VALUES
       (
         @ret,
         @NomeUsuario
       )
       
       


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quinta-feira, 4 de setembro de 2014 18:34
  • Ares,

    Não tem o END do meio....

    Da uma lida na internet para saber mais sobre begin tran e commit...

    Segue o código

                  

        CREATE PROCEDURE uspTransicaoGastoHistorico
          @Id_Usuario INT,
          @NomeGasto NVARCHAR(30),
          @TipoGasto VARCHAR(10),
          @ValorGasto DECIMAL(18,2)

         AS
         BEGIN TRAN
           INSERT INTO tab_Gasto
           (
              NomeGasto,
              TipoGasto,
              ValorGasto
            )
            VALUES
            (
              @NomeGasto,
              @TipoGasto,
              @ValorGasto
            )


            INSERT INTO Tab_HistoricoGasto
            (
              Id_Gasto,
     Id_Usuario
            )
            VALUES
            (
             @@IDENTITY,
             @Id_Usuario
            )

    COMMIT


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    sexta-feira, 5 de setembro de 2014 11:14

Todas as Respostas

  • Ares,

    O @@identity é para funcionar...

    Veja um exemplo:

    create table #gasto (id int identity(1,1) not null, descricao varchar(100))
    create table #historico (id int identity(1,1) not null, id_gasto int, descricao varchar(100))


    begin tran
    insert #gasto (descricao) values ('a');
    insert #historico (id_gasto,descricao) values (@@IDENTITY,'aa')
    commit


    select * from #historico


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quinta-feira, 4 de setembro de 2014 17:44
  • Tulio, então... Deveria dar certo, mas acho que a sintaxe não está correta. Eu não consigo ver minhas variáveis do primeiro bloco na segunda inserção (E já tentei retirar o "End" e "As Begin" do meio e deixar numa só Query, sem chance, não rodou).

    CREATE PROCEDURE uspInserirHistoricoGastoEGasto
       
       @NomeUsuario NVARCHAR(50),
       @NomeGasto NVARCHAR(50),
       @TipoGasto VARCHAR(10),
       @ValorGasto DECIMAL(18,2)
       
       AS
       BEGIN
       
       INSERT INTO tab_Gasto
       (
         NomeGasto,
         TipoGasto,
         ValorGasto
       )
       VALUES
       (
         @NomeGasto,
         @TipoGasto,
         @ValorGasto
       )
       
       SELECT @@IDENTITY as ValorIdGasto
       END
       BEGIN
       
       INSERT INTO Tab_HistoricoGasto
       (
         Id_Gasto,
         Id_Usuario
       )
       VALUES
       (
         ValorGasto
         @NomeUsuario
       )
       
       
       END


    O problema é justamente aqui:

       INSERT INTO Tab_HistoricoGasto
       (
         Id_Gasto,
         Id_Usuario
       )
       VALUES
       (
         ValorGasto
         @NomeUsuario
       )

    Os valores "ValorGasto" que é o identity que retorna e "@NomeUsuario" (Que na verdade é ID_Usuario que vou passar na aplicação) não estão reconhecendo, como que se fosse possível somente 1 "INSERT INTO".

    • Editado Ares Claudio Vieira quinta-feira, 4 de setembro de 2014 18:14 Falta de informação específica.
    quinta-feira, 4 de setembro de 2014 18:11
  • Altere a parte "SELECT @@IDENTITY as ValorIdGasto"

    Por:

    Declare ValorIdGasto int;

    set ValorIdGasto = @@IDENTITY;


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quinta-feira, 4 de setembro de 2014 18:20
  • Ares,

    Desconsidere minha resposta... agora que entendi o que você esta fazendo...

    Esta chamando uma SP... e depois inserindo...

    Então faça assim...

    -- Inicio da SP
    CREATE PROCEDURE uspInserirHistoricoGastoEGasto
       
       @NomeUsuario NVARCHAR(50),
       @NomeGasto NVARCHAR(50),
       @TipoGasto VARCHAR(10),
       @ValorGasto DECIMAL(18,2),
       @ValorIdGasto int output
       
       AS
       BEGIN
       
       INSERT INTO tab_Gasto
       (
         NomeGasto,
         TipoGasto,
         ValorGasto
       )
       VALUES
       (
         @NomeGasto,
         @TipoGasto,
         @ValorGasto
       )
       
       set @ValorIdGasto = @@IDENTITY
       return (@ValorIdGasto)
       END
    -- Fim da SP


    -- Chamando a SP
    declare @ret int
    exec uspInserirHistoricoGastoEGasto ... todoso os paramentro ... + ,@ret output

      
       INSERT INTO Tab_HistoricoGasto
       (
         Id_Gasto,
         Id_Usuario
       )
       VALUES
       (
         @ret,
         @NomeUsuario
       )
       
       


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quinta-feira, 4 de setembro de 2014 18:34
  • Tulio, acho que entendi a sua lógica, mas ai eu estarei chamando a mesma procedure. Será que existe uma maneira de executar os dois insert, sem chamar nenhuma procedure para fazer o trabalho?
    quinta-feira, 4 de setembro de 2014 18:54
  • Tem sim.... nesse caso fica assim...

              

    declare    
       @NomeUsuario NVARCHAR(50),
       @NomeGasto NVARCHAR(50),
       @TipoGasto VARCHAR(10),
       @ValorGasto DECIMAL(18,2)


       set @NomeUsuario = <valor>
       set @NomeGasto = <valor>
       set @TipoGasto = <valor>
       set @ValorGasto = <valor>

       begin tran
      INSERT INTO tab_Gasto
      (
    NomeGasto,
    TipoGasto,
    ValorGasto
      )
      VALUES
      (
    @NomeGasto,
    @TipoGasto,
    @ValorGasto
      )


      INSERT INTO Tab_HistoricoGasto
      (
    Id_Gasto,
    Id_Usuario
      )
      VALUES
      (
    @@IDENTITY,
    @NomeUsuario
      )
       commit


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quinta-feira, 4 de setembro de 2014 19:17
  • Tulio, desculpa, mas eu não consegui converter o código para Procedure... Apesar de o teu ter funcionado, não consegui formatar para procedure.

    Eu reescrevi o meu código, porém, ele persiste dando erro, porém, ele não diz qual erro... (isso que tá matando)

     
       
         CREATE PROCEDURE uspTransicaoGastoHistorico
          @Id_Usuario INT,
          @NomeGasto NVARCHAR(30),
          @TipoGasto VARCHAR(10),
          @ValorGasto DECIMAL(18,2)
          
         AS
         BEGIN
           INSERT INTO tab_Gasto
           (
              NomeGasto,
              TipoGasto,
              ValorGasto
            )
            VALUES
            (
              @NomeGasto,
              @TipoGasto,
              @ValorGasto
            )
            END
    
            INSERT INTO Tab_HistoricoGasto
            (
              Id_Gasto,
    		  Id_Usuario
            )
            VALUES
            (
             @@IDENTITY,
             @Id_Usuario
            )
            
         END
     

      Ele acusa erro na ultima linha, no "END", mas não sai disso e não fala no que é o erro.

    quinta-feira, 4 de setembro de 2014 21:15
  • Ares,

    Não tem o END do meio....

    Da uma lida na internet para saber mais sobre begin tran e commit...

    Segue o código

                  

        CREATE PROCEDURE uspTransicaoGastoHistorico
          @Id_Usuario INT,
          @NomeGasto NVARCHAR(30),
          @TipoGasto VARCHAR(10),
          @ValorGasto DECIMAL(18,2)

         AS
         BEGIN TRAN
           INSERT INTO tab_Gasto
           (
              NomeGasto,
              TipoGasto,
              ValorGasto
            )
            VALUES
            (
              @NomeGasto,
              @TipoGasto,
              @ValorGasto
            )


            INSERT INTO Tab_HistoricoGasto
            (
              Id_Gasto,
     Id_Usuario
            )
            VALUES
            (
             @@IDENTITY,
             @Id_Usuario
            )

    COMMIT


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    sexta-feira, 5 de setembro de 2014 11:14