Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pr0f3t4

Cursor para calcular soma

Recommended Posts

Prezados,

Em uma certa view, consigo recuperar os sequintes resultados (hipotéticos):

 

select Notafiscal, (TotalCursos+TotalServicos+2via) AS TotalDaNota from view_total_individual_de_notas where comercialID = 156;

+------------+-------------+

| Notafiscal | TotalDaNota |

+------------+-------------+

| 008727 | 1607.00 |

| 008728 | 121.00 |

| 008730 | 14652.00 |

+------------+-------------+

3 rows in set (0.00 sec)

 

Preciso de uma instrução que conte linha a linha, e que me permita somar o resultado da coluna TotalDaNota (linha a linha) e verificar se em determinada momento atingi a soma superior a 5,000.00 (cinco mil), nessa linha inserir o percentual de 4,65%, e quaisquer fatura emitida após essa condição, calcular o valor dessa fatura com 4,65%, tudo isso dentro do mês corrente.

Andei dando uma olhada na instrução CURSOR, porém não entendi como usar essa instrução adequadamente no intuito de tentar concluir essa tarefa.

Preciso muito da ajuda da comunidade pra resolver esse problema.

Que a Força Esteja Com Vocês !

Compartilhar este post


Link para o post
Compartilhar em outros sites

// comcei com isso, mas ná hora de roda gera erros. To usando o MySQL Front 5 no MySQL 5.1

 

CREATE PROCEDURE TesteRetencao()
BEGIN
DECLARE contador INT DEFAULT 0;
DECLARE cur_calculo_retencao FOR SELECT (TotalCursos + TotalServicos + 2via) FROM view_total_individual_de_notas AS notas WHERE comercialID = 156;
	   
OPEN cur_calculo_retencao

REPEAT
	  FETCH cur_calculo_retencao INTO Total

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, depois de muito estudo, cheguei a esta SP usando cursor

 

CREATE PROCEDURE sp_fatur_retencao()
BEGIN

	 #DECLARE fim INT DEFAULT 0;
	 DECLARE ID INT DEFAULT 0;
	 DECLARE Nota double(7,2 );
	 DECLARE SomaDasNotas double(7,2);
	 DECLARE Total double(7,2);
	 
	 DECLARE myCursor CURSOR FOR SELECT comercialID, (TotalCursos + TotalServicos + 2via) AS Total 
										FROM view_total_individual_de_notas 
										WHERE comercialID=156; 
	 
	 SET @linhas = FOUND_ROWS();
	 SET @contador = 0;
	 
	 OPEN myCursor;
	 REPEAT
			  
			  FETCH myCursor INTO ID, Nota;
			  
			  SET SomaDasNotas = (SomaDasNotas + Nota);
			  SET Total = SomaDasNotas;
			  
			  SET @contador = (@contador + 1);			  

	 UNTIL @contador = @linhas END REPEAT;
	 CLOSE myCursor;	 
	 
	 INSERT INTO fatur_retencao VALUES(ID, Total);
END;

 

Porém, não está gravando nenhuma informação na tabela. Posso adiantar que a instrução select tém o retorno de 3 linhas.

Será que podem me dar uma ajuda.?

 

Que a Força Esteja Com Vocês !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezados, consegui resovler o problema informado.

Depois de muito pensar, analisar a situação, a versão final da minha SP para calcular a soma do valor de cada fatura e verificar se ela atingui o valor superior a 5000 ficou assim:

 

 

SP_CALCULAR_RETENCAO:

#
# arquivo sp+faturamento_retencao
# calcula as faturas com retencao
#
#

drop procedure if exists sp_fatur_retencao;
create procedure sp_fatur_retencao(IN nID int)
begin

	declare id int default 0;
	declare num_nota int default 0;
	declare valor_da_nota double default 0;
	declare total_da_nota double default 0;
	declare soma_das_notas double default 0;
	declare valor_final_da_nota double default 0;
	declare retencao double default 0;

	declare linhas int default 0;
	declare flag int default 0;

	declare newCursor cursor for
										select comercialID, NotaFiscal, (TotalCursos + TotalServicos + 2via) as TotalDaNota 
										from view_total_individual_de_notas 
										where comercialID=nID;
	declare continue handler for not found set linhas = 1;

	open newCursor;
	inicio: loop

		fetch newCursor into id, num_nota, valor_da_nota;

		if linhas = 1 then 
			leave inicio;
		end if;

		set soma_das_notas = (soma_das_notas + valor_da_nota);
		if flag = 0 then
		begin

			if (soma_das_notas > 5000) then
				set retencao = (soma_das_notas * .0465);
				insert into fatur_retencao set comercialID=id, NotaFiscal=num_nota, Retencao=retencao;
				set flag = 1;
			end if;

		end;
		else 
			if flag = 1 then

				set retencao = (valor_da_nota * .0465);
				insert into fatur_retencao set comercialID=id, NotaFiscal=num_nota, Retencao=retencao;

			end if;
		end if;
		
	end loop inicio;

end;

# wq

#;;;;;;;;;;;;;;;;;;;;;;;;;;;
Dessa forma, quando a soma atingir o valor superior a 5000, insiro o imposto de 4,65%, se existirem mais notas, o valor será atribuido de forma automatica.

 

Que a Força Esteja Com Vocês !

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.