Dúvida com SQL SERVER - PROCEDURE não funciona
Boa tarde programadores, como estão?
Sou relativamente novo com programação e novo aqui na empresa, preciso da ajuda dos senhores.
Seguinte, aqui na empresa que eu trabalho tem um sistema de pontos, onde cada compra que o cliente faz ele vai acumulando para ganhar futuros descontos.
Porém, a procedure no banco que adiciona e retira pontos não está funcionando, e como eu não tenho muita prática com procedures não estou conseguindo
saber onde está o erro (que provavelmente é de sintaxe). Alguém poderia dar uma analisada e me ajudar??
Muito Obrigado!
CREATE PROCEDURE [dbo].[sp_insere_movimentacao](
@DOCUMENTO as varchar(14),
@COD_TIPO_MOV as int,
@COD_EMP as int,
@RZNOME_CLIENTE as varchar(100),
@DT_NASCTO as date,
@EMAIL_CADASTRO as varchar(300),
@FRACAO_PONTOS as int,
@PONTOS_FRACAO as int,
@BC_CALCULO_COMPRA as numeric(12,2),
@TOTAL_PONTOS as int,
@RESULT as varchar(1) out)
AS
declare
@idf_existe_conta as varchar(1),
@tot_pontos_ut as int,
@pontos_ut as int,
@aux_cod_ut as int
BEGIN
begin try
begin tran;
set @RESULT = 'E';
set @idf_existe_conta = '';
exec sp_existe_conta @DOCUMENTO,@idf_existe_conta out;
if @idf_existe_conta = 'N'
begin
--conta ainda não existe
insert into cp_cliente_conta( documento,
razao_nome,
data_nascimento,
email_cadastro)
values (@DOCUMENTO,
@RZNOME_CLIENTE,
@DT_NASCTO,
@EMAIL_CADASTRO
);
end
--utilizacao de pontos
if @COD_TIPO_MOV in (2,4)
begin
set @tot_pontos_ut = 0;
set @pontos_ut = 0;
declare curUt cursor
for (select
codigo,
total_pontos
from cp_cliente_movimentacao
where
documento = @DOCUMENTO
and
cod_tipo_movimentacao <> 3
and
isNull(idf_utilizado,'N') <> 'S')
order by codigo
open curUt
fetch next from curUt into @aux_cod_ut,@pontos_ut
while @@FETCH_STATUS = 0
begin
set @tot_pontos_ut = @tot_pontos_ut + @pontos_ut
if @tot_pontos_ut <= abs(@TOTAL_PONTOS)
update cp_cliente_movimentacao set
idf_utilizado = 'S'
where
documento = @DOCUMENTO
and
codigo = @aux_cod_ut
fetch next from curUt into @aux_cod_ut,@pontos_ut
end
close curUt
deallocate curUt
end
insert into cp_cliente_movimentacao( documento,
cod_tipo_movimentacao,
cod_emp,
data_movimentacao,
fracao_pontos,
pontos_fracao,
base_calculo_compra,
total_pontos,
idf_utilizado)
values (@DOCUMENTO,
@COD_TIPO_MOV,
@COD_EMP,
getDate(),
@FRACAO_PONTOS,
@PONTOS_FRACAO,
@BC_CALCULO_COMPRA,
@TOTAL_PONTOS,
case @COD_TIPO_MOV
when 1 then 'N'
else 'S'
end
);
if @@TRANCOUNT > 0
commit tran;
set @RESULT = 'S';
end try
begin catch
if @@TRANCOUNT > 0
rollback tran;
set @RESULT = 'E';
insert into dbo.cp_erros_servidor(erro_linha
,erro_numero
,erro_mensagem
,erro_severidade
,erro_estado
,erro_data_hora)
values(
ERROR_LINE()
,ERROR_NUMBER()
,'procedure: ' + ERROR_PROCEDURE() + ' Erro: ' + Upper(ERROR_MESSAGE())
,ERROR_SEVERITY()
,ERROR_STATE()
,getDate()
);
end catch
END
Sou relativamente novo com programação e novo aqui na empresa, preciso da ajuda dos senhores.
Seguinte, aqui na empresa que eu trabalho tem um sistema de pontos, onde cada compra que o cliente faz ele vai acumulando para ganhar futuros descontos.
Porém, a procedure no banco que adiciona e retira pontos não está funcionando, e como eu não tenho muita prática com procedures não estou conseguindo
saber onde está o erro (que provavelmente é de sintaxe). Alguém poderia dar uma analisada e me ajudar??
Muito Obrigado!
CREATE PROCEDURE [dbo].[sp_insere_movimentacao](
@DOCUMENTO as varchar(14),
@COD_TIPO_MOV as int,
@COD_EMP as int,
@RZNOME_CLIENTE as varchar(100),
@DT_NASCTO as date,
@EMAIL_CADASTRO as varchar(300),
@FRACAO_PONTOS as int,
@PONTOS_FRACAO as int,
@BC_CALCULO_COMPRA as numeric(12,2),
@TOTAL_PONTOS as int,
@RESULT as varchar(1) out)
AS
declare
@idf_existe_conta as varchar(1),
@tot_pontos_ut as int,
@pontos_ut as int,
@aux_cod_ut as int
BEGIN
begin try
begin tran;
set @RESULT = 'E';
set @idf_existe_conta = '';
exec sp_existe_conta @DOCUMENTO,@idf_existe_conta out;
if @idf_existe_conta = 'N'
begin
--conta ainda não existe
insert into cp_cliente_conta( documento,
razao_nome,
data_nascimento,
email_cadastro)
values (@DOCUMENTO,
@RZNOME_CLIENTE,
@DT_NASCTO,
@EMAIL_CADASTRO
);
end
--utilizacao de pontos
if @COD_TIPO_MOV in (2,4)
begin
set @tot_pontos_ut = 0;
set @pontos_ut = 0;
declare curUt cursor
for (select
codigo,
total_pontos
from cp_cliente_movimentacao
where
documento = @DOCUMENTO
and
cod_tipo_movimentacao <> 3
and
isNull(idf_utilizado,'N') <> 'S')
order by codigo
open curUt
fetch next from curUt into @aux_cod_ut,@pontos_ut
while @@FETCH_STATUS = 0
begin
set @tot_pontos_ut = @tot_pontos_ut + @pontos_ut
if @tot_pontos_ut <= abs(@TOTAL_PONTOS)
update cp_cliente_movimentacao set
idf_utilizado = 'S'
where
documento = @DOCUMENTO
and
codigo = @aux_cod_ut
fetch next from curUt into @aux_cod_ut,@pontos_ut
end
close curUt
deallocate curUt
end
insert into cp_cliente_movimentacao( documento,
cod_tipo_movimentacao,
cod_emp,
data_movimentacao,
fracao_pontos,
pontos_fracao,
base_calculo_compra,
total_pontos,
idf_utilizado)
values (@DOCUMENTO,
@COD_TIPO_MOV,
@COD_EMP,
getDate(),
@FRACAO_PONTOS,
@PONTOS_FRACAO,
@BC_CALCULO_COMPRA,
@TOTAL_PONTOS,
case @COD_TIPO_MOV
when 1 then 'N'
else 'S'
end
);
if @@TRANCOUNT > 0
commit tran;
set @RESULT = 'S';
end try
begin catch
if @@TRANCOUNT > 0
rollback tran;
set @RESULT = 'E';
insert into dbo.cp_erros_servidor(erro_linha
,erro_numero
,erro_mensagem
,erro_severidade
,erro_estado
,erro_data_hora)
values(
ERROR_LINE()
,ERROR_NUMBER()
,'procedure: ' + ERROR_PROCEDURE() + ' Erro: ' + Upper(ERROR_MESSAGE())
,ERROR_SEVERITY()
,ERROR_STATE()
,getDate()
);
end catch
END
Yuri
Curtidas 0
Melhor post
Emerson Nascimento
18/01/2022
CREATE PROCEDURE [dbo].[sp_insere_movimentacao]( @DOCUMENTO as varchar(14), @COD_TIPO_MOV as int, @COD_EMP as int, @RZNOME_CLIENTE as varchar(100), @DT_NASCTO as date, @EMAIL_CADASTRO as varchar(300), @FRACAO_PONTOS as int, @PONTOS_FRACAO as int, @BC_CALCULO_COMPRA as numeric(12,2), @TOTAL_PONTOS as int, @RESULT as varchar(1) out ) AS declare @idf_existe_conta as varchar(1), @tot_pontos_ut as int, @pontos_ut as int, @aux_cod_ut as int BEGIN set @RESULT = 'E'; begin try begin tran; set @idf_existe_conta = ''; exec sp_existe_conta @DOCUMENTO, @idf_existe_conta out; if @idf_existe_conta = 'N' begin --conta ainda não existe insert into cp_cliente_conta( documento, razao_nome, data_nascimento, email_cadastro) values (@DOCUMENTO, @RZNOME_CLIENTE, @DT_NASCTO, @EMAIL_CADASTRO ); end --utilizacao de pontos if @COD_TIPO_MOV in (2,4) begin set @tot_pontos_ut = 0; set @pontos_ut = 0; declare curUt cursor local for select codigo, total_pontos from cp_cliente_movimentacao where documento = @DOCUMENTO and cod_tipo_movimentacao <> 3 and isNull(idf_utilizado,'N') <> 'S' order by codigo open curUt fetch next from curUt into @aux_cod_ut, @pontos_ut while @@FETCH_STATUS = 0 begin set @tot_pontos_ut = (@tot_pontos_ut + @pontos_ut) if @tot_pontos_ut <= abs(@TOTAL_PONTOS) update cp_cliente_movimentacao set idf_utilizado = 'S' where documento = @DOCUMENTO and codigo = @aux_cod_ut fetch next from curUt into @aux_cod_ut,@pontos_ut end close curUt deallocate curUt end insert into cp_cliente_movimentacao( documento, cod_tipo_movimentacao, cod_emp, data_movimentacao, fracao_pontos, pontos_fracao, base_calculo_compra, total_pontos, idf_utilizado ) values (@DOCUMENTO, @COD_TIPO_MOV, @COD_EMP, GetDate(), @FRACAO_PONTOS, @PONTOS_FRACAO, @BC_CALCULO_COMPRA, @TOTAL_PONTOS, (case @COD_TIPO_MOV when 1 then 'N' else 'S' end) ); if @@TRANCOUNT > 0 commit tran; set @RESULT = 'S'; end try begin catch if @@TRANCOUNT > 0 rollback tran; insert into dbo.cp_erros_servidor( erro_linha, erro_numero, erro_mensagem, erro_severidade, erro_estado, erro_data_hora ) values( ERROR_LINE(), ERROR_NUMBER(), 'procedure: ' + ERROR_PROCEDURE() + ' Erro: ' + Upper(ERROR_MESSAGE()), ERROR_SEVERITY(), ERROR_STATE(), GetDate() ); end catch END
se você acha que há algum erro de sintaxe, verifique o conteúdo da tabela dbo.cp_erros_servidor, que é a tabela onde são gravados os erros ao executar a procedure sp_insere_movimentacao.
GOSTEI 1
Mais Respostas
Yuri
18/01/2022
Valeu Emerson, sua sugestão me ajudou bastante!
Verifiquei a tabela cp_erros_servidor e ela não estava sendo alimentada.
O problema era que a sequence que alimenta o campo id_log não existia.
Logo percebi que a inserção em movimentação também está sem a sequence, recriei as duas e agora o sistema está funcionando de novo.
Muito obrigado!
Verifiquei a tabela cp_erros_servidor e ela não estava sendo alimentada.
O problema era que a sequence que alimenta o campo id_log não existia.
Logo percebi que a inserção em movimentação também está sem a sequence, recriei as duas e agora o sistema está funcionando de novo.
Muito obrigado!
GOSTEI 0