Ir para conteúdo
Fórum Script Brasil
  • 0

Erro em procedure


Felipe - Iniciante-Delphi

Pergunta

Galera, sou iniciante nesse mundo de T.I

Bom, meu problema é o seguinte , assim, eu tenho 2 tabela (TB_PESSOA e TB_PESSOA_FISICA) na TB_PESSOA tem uma PK ( CD_PESSOA) e CONSEQUENTEMENTE NA TB_PESSOA_FISICA UMA FK.

Bom, o campo CD_PESSOA é IDENTITY e eu tenho uma procedure que faz insert, delete e update dependendo do que for digitado, mas acontece que não consigo atribuir valor na tablea TB_PESSOA_FISICA pois quando eu executo a PROCEDURE os valores que é pra cair na TB_PESSOA cai, porém , os da TB_PESSOA_FISICA não . aqui esta minha procedure :

-- PROCEDURE PRONTA

PROCEDURE SP_TESTE_1
   
    
    @tipo decimal(10,2),
    @email varchar(200),
    @cadastro datetime,
    @atualizacao datetime,
        @bloqueio decimal(10,2),
    @ordem char(1),
        @nome varchar(200),
        @cpf numeric(11),
        @rg varchar(20),
        @nascimento smalldatetime,
        @civil varchar(20),
        @sexo varchar(20),
        @profissao varchar(45),
        @codigo integer
AS
if (@ordem) = 'i' -- insere um registro
begin
    if exists(select ds_email from TB_PESSOA where ds_email = @email)
    begin
      select @email = 'E-MAIL já CADASTRADO'
      return (@email)
    end
    else
    begin
      select @email = ''
      begin transaction
      insert into TB_PESSOA
          ( ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)
      values
          ( @tipo, @email, @cadastro, @atualizacao, @bloqueio)
           -- set @codigo = @@identity
      end
end
else
if (@ordem) = 'u' -- Altera um registro
begin
    select @email = ''
    begin transaction
    update TB_PESSOA set
          ds_tipo_pessoa = @tipo,
          ds_email = @email,
          dt_cadastro = @cadastro,
          dt_atualização = @atualizacao,
          fl_bloqueio = @bloqueio
      where ds_email = @email
end
else
if (@ordem) = 'd' --Exclui um registro
begin
    select @email = ''
    begin transaction
    delete from TB_PESSOA
      where ds_email = @email
end
if (@ordem) = 'i_fisica' -- insere um registro
begin
    if exists(select ds_nome from TB_PESSOA_FISICA where ds_nome = @nome)
    begin
      select @nome = 'NOME já EXISTENTE'
      return (@nome)
    end
    else
    begin
      select @nome = ''
      begin transaction
      insert into TB_PESSOA_FISICA
          (cd_pessoa, ds_nome, nr_cpf, ds_rg, dt_nascimento, tp_estado_civil, tp_sexo, tp_profissao)
      values
          ( @codigo, @nome, @cpf, @rg, @nascimento, @civil, @sexo, @profissao)
           -- set @codigo = @@identity
            insert into  TB_PESSOA
                (ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)
            values
                (@tipo, @email, @cadastro, @atualizacao, @bloqueio)
      end
end

else
if @@error <> 0 
begin
   rollback transaction
   return(1)
end
else
begin
   commit transaction
   return(0)
end
-- AQUI EU CHAMO A PROCEDURE
exec SP_TESTE_1    
      
        @ordem = 'i_fisica',
        @tipo = 1,
        @email = 'felipe.junior@bol.com.br',
        @cadastro = '05/05/05',
        @atualizacao = '05/05/05',
        @bloqueio = 1,
        @nome = 'Felipe',
        @cpf = 45256986532,
        @rg = '458963658',
        @nascimento = '05/05/05',
        @civil = 'SOLTEIRO',
        @sexo = 'M',
        @profissao = 'Paraquedista',
        @CODIGO = (SELECT CD_PESSOA FROM TB_PESSOA where @@identity = cd_pessoa)

Por favor, alguém pode me ajudar?

Agradeço desde já,

Obrigado

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Felipe.

Em relação ao seu script:

- Na sintaxe IF...ELSE: como sempre depois dos ELSE’s você utiliza a sintaxe IF, creio q não precise dos ELSE´s (retirei do script abaixo).

- você falou q realiza manipulação de 2 tabelas: como a tabela TB_PESSOA é a mãe, a inserção deve ser nela primeiramente (no script a inserção está sendo realizada na filha primeiramente).

- Sobre a chave “cd_pessoa”: ela é criada quando se realiza a inserção na tabela TB_PESSOA? Caso positivo, a recuperação dela tem q ser realizada depois do insert na tabela TB_PESSOA. você realiza o insert e depois recupera a PK, passando para a tabela TB_PESSOA_FISICA o valor.

- Dica: a transação que você abre em cada manipulação “begin transaction”, pode ser aberta no começo da Procedure, pois a procedure manipula apenas as duas tabelas.

Alterei o script q postou, retirando os else´s e alterando a ordem nas inserções.

Caso não funcione, dê uma olhada no insert da tabela TB_PESSOA:

insert into TB_PESSOA

(ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)

values (@tipo, @email, @cadastro, @atualizacao, @bloqueio)

- você tem q identificar a PK inserção, caso você passe ela para a Procedure (@CODIGO). Caso a PK seja criada na hora da inserção (auto-incremento), ai você terá q recuperá-la, como explicado acima.

Dá uma olhada ai. Caso tenha alguma duvida, posta ai...

PROCEDURE SP_TESTE_1

@tipo decimal(10,2),

@email varchar(200),

@cadastro datetime,

@atualizacao datetime,

@bloqueio decimal(10,2),

@ordem char(1),

@nome varchar(200),

@cpf numeric(11),

@rg varchar(20),

@nascimento smalldatetime,

@civil varchar(20),

@sexo varchar(20),

@profissao varchar(45),

@codigo integer

AS

if (@ordem) = 'i' -- insere um registro

begin

if exists(select ds_email from TB_PESSOA where ds_email = @email)

begin

select @email = 'E-MAIL já CADASTRADO'

return (@email)

end

else

begin

select @email = ''

begin transaction

insert into TB_PESSOA

( ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)

values

( @tipo, @email, @cadastro, @atualizacao, @bloqueio)

-- set @codigo = @@identity

end

end

if (@ordem) = 'u' -- Altera um registro

begin

select @email = ''

begin transaction

update TB_PESSOA set

ds_tipo_pessoa = @tipo,

ds_email = @email,

dt_cadastro = @cadastro,

dt_atualização = @atualizacao,

fl_bloqueio = @bloqueio

where ds_email = @email

end

if (@ordem) = 'd' --Exclui um registro

begin

select @email = ''

begin transaction

delete from TB_PESSOA

where ds_email = @email

end

if (@ordem) = 'i_fisica' -- insere um registro

begin

if exists(select ds_nome from TB_PESSOA_FISICA where ds_nome = @nome)

begin

select @nome = 'NOME já EXISTENTE'

return (@nome)

end

else

begin

select @nome = ''

begin transaction

insert into TB_PESSOA

(ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)

values (@tipo, @email, @cadastro, @atualizacao, @bloqueio)

insert into TB_PESSOA_FISICA

(cd_pessoa, ds_nome, nr_cpf, ds_rg, dt_nascimento, tp_estado_civil, tp_sexo, tp_profissao)

values ( @codigo, @nome, @cpf, @rg, @nascimento, @civil, @sexo, @profissao)

-- set @codigo = @@identity

end

end

if @@error <> 0

begin

rollback transaction

return(1)

end

else

begin

commit transaction

return(0)

end

Link para o comentário
Compartilhar em outros sites

  • 0

Boa Tarde Fulvio,

Fiquei muito grato por todas essas dicas que foram passadas para mim, garanto que levarei-as para o resto de minha vida na carreira desenvolvedor. hahaha

Coloquei a procedure nova ( que você passou para mim ) e deu tudo certo na hora de compilar ela, ainda não realizei o EXEC para testar se os valores estão sendo inseridos, pois fiquei com uma duvida.

Sim, meu campo CD_PESSOA é IDENTITY ( ou seja, auto increment ) então, sempre que insiro o valor na tabela TB_PESSOA, esse campo recebe um valor, porém, não peguei ainda muito o jeito de achar esse valor, se voce pudesse me ajudar iria ficar muito grato.

Segundo, depois que eu fizer todas as alterações e compilar tudo certinho , na hora que eu chamo a procedure eu a chamo assim :

EXEC SP_TESTE_1_F

@tipo = 1,

@email = 'felipe@sbt.org',

@cadastro = '09/12/05',

@atualizacao = '07/10/09',

@bloqueio = 1,

@ordem = 'i_fisica',

@nome = 'felipe lima',

@cpf = 59633568963,

@rg = '541235698',

@nascimento = '09/20/96',

@civil = 'solteiro',

@sexo = 'masculino',

@profissao = 'estagiario'

@codigo integer

Na parte '@codigo eu atribuo qual valor a ela? @codigo = ???? .

Aguardo sua resposta, e agradeço por todas essas dicas .

Muito obrigado mesmo,

Tenha uma boa tarde.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Felipe. Estamos aqui para ajudar!! :.)

Vamos lá:

- O campo CD_PESSOA é IDENTITY: para resgatar então o identity, basta pegar o maior número do campo CD_PESSOA - select max(cd_pessoa) from TB_PESSOA.

OBS.: para q esta implementação seja 100% segura (porque você está pegando o max da tabela cd_pessoa), você tem q garantir q a execução será realizada dentro de uma transação (o que já está ocorrendo).

Pegue o valor do campo CD_PESSOA, grave em uma variável e depois a utilize na inserção da tabela TB_PESSOA_FISICA.

Em relação ao valor do campo @codigo:

- se você precisar do código para alterar ou excluir os registros, você passa o valor do código que está querendo manipular.

- Para inserir novo registro, não precisará dele (claro, pois não o terá... rs...). Então na declaração da procedure, coloque-o com valor default (null ou zero, ....). Sintaxe: @codigo int=NULL. Se você não passar nenhum parâmetro na chamada a procedure, ela receberá o valor default.

- Caso o campo @codigo não seja útil, retire-o da chamada. Pelo q vi, os IF´s já identificam qual processo realizar. Nesta estrutura, eu não passaria como parâmetro o @codigo. Dê uma olhada nisto também.

- Se retirar o campo @codigo, declare-o internamente para manipulação. Ai você atribui o max da tabela CD_PESSOA para ele (depois q realizar o insert nela) e o utiliza pra inserção na tabela TB_PESSOA_FISICA.

Bem, acho q é isso. Caso tenha alguma dúvida, pode postar ai!!! Se tiver problemas em realizar a implementação, posta o script. Até mais. :.)

Link para o comentário
Compartilhar em outros sites

  • 0

Bom Dia,

Fiz tudo que foi solicitado

Mas o unico problema é na hora de falar que a variavel @codigo vai receber o valor de (select max(cd_pessoa) from TB_PESSOA) ..

Eu coloco

@codigo = select max(cd_pessoa) from tb_pessoa

e mesmo assim da erro.

Segue codigo ..

if (@ordem) = 'i_fisica' -- insere um registro

begin

if exists(select ds_email from TB_PESSOA where ds_email = @email)

begin

select @email = 'E-MAIL já EXISTENTE'

return (@email)

end

else

begin

begin transaction

insert into TB_PESSOA

(ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)

values (@tipo, @email, @cadastro, @atualizacao, @bloqueio)

@codigo = (select max(cd_pessoa)from TB_PESSOA)

insert into TB_PESSOA_FISICA

(cd_pessoa, ds_nome, nr_cpf, ds_rg, dt_nascimento, tp_estado_civil, tp_sexo, tp_profissao)

values ( @codigo, @nome, @cpf, @rg, @nascimento, @civil, @sexo, @profissao)

sera que você pode me ajudar pela ultima vez?

Acho que depois que aprender isso, nunca mais esquecerei . HAHAHA

Aguardo anciosamente sua resposta;

Obrigado =]

Editado por Felipe - Iniciante-Delphi
Link para o comentário
Compartilhar em outros sites

  • 0

eu já havia tentando com o set e mesmo assim não tinha ido

olha :

if (@ordem) = 'i_fisica' -- insere um registro

begin

if exists(select ds_email from TB_PESSOA where ds_email = @email)

begin

select @email = 'E-MAIL já EXISTENTE'

return (@email)

end

else

begin

begin transaction

insert into TB_PESSOA

(ds_tipo_pessoa, ds_email, dt_cadastro, dt_atualização, fl_bloqueio)

values (@tipo, @email, @cadastro, @atualizacao, @bloqueio)

Set @codigo = (select max(cd_pessoa)from TB_PESSOA)

insert into TB_PESSOA_FISICA

( ds_nome, nr_cpf, ds_rg, dt_nascimento, tp_estado_civil, tp_sexo, tp_profissao)

values ( @nome, @cpf, @rg, @nascimento, @civil, @sexo, @profissao)

end

end

Na hora de chamar a procedure eu coloco :

EXEC SP_TESTE_1_F

@tipo = 1,

@email = 'felipe.lima@google.com',

@cadastro = '09/12/05',

@atualizacao = '07/10/09',

@bloqueio = 1,

@ordem = 'i_fisica',

@nome = 'felipe lima',

@cpf = 59633568963,

@rg = '541235698',

@nascimento = '09/20/96',

@civil = 'solteiro',

@sexo = 'masculino',

@profissao = 'estagiario',

@codigo = null

Mesmo assim, so add na TB_PESSOA =[

sera que nunca vou conseguir?

Obrigado,

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Felipe.

Calma... com calma a gente chega lá!!! rs...

Pra exemplificar, decidi gerar os scripts com inserções e manipulações de tabelas temporárias.

Vamos por partes...

Criação de tabelas temporárias em instância (executar apenas 1 vez):

create table #TB_PESSOA (codigo int identity, email varchar(200))

create table #TB_PESSOA_FISICA (codigo int, nome varchar(200))

Criação da Procedure:

CREATE procedure SP_TESTE_1_F

@ordem char(2),

@nome varchar(200),

@email varchar(200),

-- declaração de variável, com valor default

@codigo int = NULL

as

if (@ordem) = 'i' -- insere um registro

begin

if exists(select email from #TB_PESSOA where email = @email)

begin

select 'E-MAIL já CADASTRADO' as email

return

end

else

begin

insert into #TB_PESSOA (email) values (@email)

end

end

if (@ordem) = 'u' -- Altera um registro

begin

update #TB_PESSOA set email=@email where codigo = @codigo

end

if (@ordem) = 'd' --Exclui um registro

begin

delete from #TB_PESSOA where codigo = @codigo

end

if (@ordem) = 'if' -- insere um registro

begin

if exists(select email from #TB_PESSOA where email = @email)

begin

select 'E-MAIL já EXISTENTE' as email

return

end

else

begin

begin transaction

insert into #TB_PESSOA (email) values (@email)

set @codigo = (select max(codigo) from #TB_PESSOA)

insert into #TB_PESSOA_FISICA (codigo, nome) values (@codigo, @nome)

commit transaction

end

end

Abri uma transação apenas quando a manipulação é realizada nas duas tabelas. Quando a manipulação é realizada em uma tabela, não há necessidade.

Fiz as inserções de acordo com a sua lógica: verifica o email da pessoa na tabela TB_PESSOA. Caso não exista, insere nas tabelas TB_PESSOA e TB_PESSOA_FISICA (no ultimo IF).

Chamada da Procedure:

-- inserção de um registro - aqui você não precisa colocar o @codigo, pois ele possui valor default

EXEC SP_TESTE_1_F

@ordem = 'i',

@nome = 'felipe lima',

@email = 'felipe.lima@google.com'

select * from #TB_PESSOA

select * from #TB_PESSOA_FISICA

-- alteração de um registro - ai você coloca o @codigo

EXEC SP_TESTE_1_F

@ordem = 'u',

@nome = 'felipe lima',

@email = 'felipe.lima@yyyyyyyy.com.br',

@codigo=1 -- aqui você coloca o codigo, de acordo com o registro q deseja alterar.

select * from #TB_PESSOA

select * from #TB_PESSOA_FISICA

-- exclusão de um registro - ai você coloca o @codigo

EXEC SP_TESTE_1_F

@ordem = 'd',

@nome = 'felipe lima',

@email = 'felipe.lima@yyyyyyyy.com.br',

@codigo=1 -- aqui você coloca o codigo, de acordo com o registro q deseja excluir.

select * from #TB_PESSOA

select * from #TB_PESSOA_FISICA

-- inserção de um registro na tabela #TB_PESSOA_FISICA - aqui você não precisa colocar o @codigo, pois ele possui valor default

EXEC SP_TESTE_1_F

@ordem = 'if',

@nome = 'felipe lima',

@email = 'felipe.lima@aaaaaaaaaaaaa.com'

select * from #TB_PESSOA

select * from #TB_PESSOA_FISICA

Faz os testes aí. Caso tenha alguma dúvida, pode postar.

Se tiver tudo OK, implemente na sua estrutura!!! :.)

Link para o comentário
Compartilhar em outros sites

  • 0

AEEEEEEEEEEEEEEEEEEEEE FULVIOOOOOOOOOOOOOOOOOOOOO!!!

Deu certooo, finalmente. HAHAHAHAHAHHAAHHA

Muito Obrigado mesmo cara, você me ajudou muito juro para voce :D

Obrigadoo mesmo. FINALMENTE CONSEGUI. hahaha

Assim, você fez via table temporaria, mas se eu quiser fazer nas minhas tabelas já pronta, eu so mudo o nome da tabela que vou inserir né? ( #TB_PESSOA, para TB_PESSOA NORMAL) e acrescento os campos que falta ok ??

Mas ae, Obrigado de coração, fiquei muito grato por toda essa força que você me deu.

Grande abraço!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...