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

18/01/2022

5

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

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

Aceitar