Usuário com melhor resposta
Dúvidas sobre procedure.

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!
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
- Sugerido como Resposta Durval RamosModerator quinta-feira, 4 de setembro de 2014 18:53
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 9 de setembro de 2014 10:16
-
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
)
COMMITTulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 9 de setembro de 2014 10:16
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
- Sugerido como Resposta Durval RamosModerator quinta-feira, 4 de setembro de 2014 18:00
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 9 de setembro de 2014 10:15
- Não Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 9 de setembro de 2014 10:16
-
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.
-
-
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
- Sugerido como Resposta Durval RamosModerator quinta-feira, 4 de setembro de 2014 18:53
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 9 de setembro de 2014 10:16
-
-
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
-
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.
-
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
)
COMMITTulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 9 de setembro de 2014 10:16