Dúvida com SQL SERVER - PROCEDURE não funciona

18/01/2022

0

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
Yuri

Yuri

Responder

Post mais votado

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.


Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

18/01/2022

Yuri

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!
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar