Ir para conteúdo

POWERED BY:

Arquivado

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

inforthiago

[Resolvido] Problemas com a Query

Recommended Posts

Olá pessoal

 

Estou tentando resolver esse problema, mas não estou conseguindo ver o erro. A query pega 1 registro ao invés de pegar um a cada registro cnpj verificado, e ainda ela fica num loopen infinito rodando apenas um registro.

 

Segue abaixo a query.

 

set nocount on

declare @INDICE INT,
@SOMA INT,
@DIG1 INT,
@DIG2 INT,
@cnpj VARCHAR(14),
@TESTE VARCHAR(14),
@DIGITOS_IGUAIS CHAR(1),
@RESULTADO CHAR(1)

SET @RESULTADO = 'N'
SET @TESTE = SUBSTRING(@cnpj,1,1)
SET @INDICE = 1
SET @DIGITOS_IGUAIS = 'S'

SELECT @cnpj = CNPJ FROM PJNOVO
WHERE Cnpj_Valido IS NULL

while LEN(@cnpj) > 0 
begin 
	
	SET @RESULTADO = 'N'
	SET @TESTE = SUBSTRING(@cnpj,1,1)
	SET @INDICE = 1
	SET @DIGITOS_IGUAIS = 'S'
	
	WHILE (@INDICE <= 14)
	BEGIN
	IF SUBSTRING(@cnpj,@INDICE,1) <> @TESTE
		SET @DIGITOS_IGUAIS = 'N'
		SET @INDICE = @INDICE + 1
	END

	--Caso os digitos não sejão todos iguais Começo o calculo do digitos
	  IF @DIGITOS_IGUAIS = 'N'
	  BEGIN
		--Cálculo do 1º dígito
		SET @SOMA = 0
		SET @INDICE = 1
		WHILE (@INDICE <= 12)
		BEGIN
		IF (@INDICE <= 4) BEGIN
			SET @SOMA = @SOMA + CAST(SUBSTRING(@cnpj, @INDICE, 1)AS INT) * (6 - @INDICE);
			SET @INDICE = @INDICE + 1
		END
		ELSE IF (@INDICE > 4) BEGIN
			SET @SOMA = @SOMA + CAST(SUBSTRING(@cnpj, @INDICE, 1)AS INT ) * (14 - @INDICE);
			SET @INDICE = @INDICE + 1
		END
	END	

	SET @DIG1 = 11 - (@SOMA % 11)

	IF @DIG1 > 9
	 	 SET @DIG1 = 0;
  
	  -- Cálculo do 2º dígito }
		SET @SOMA = 0
	SET @INDICE = 1

	SELECT top 1 @cnpj = cnpj FROM PJNOVO where cnpj = @cnpj --and uf = @uf 
	order by 1

		WHILE (@INDICE <= 13)
		BEGIN
		IF (@INDICE <= 5) BEGIN
			SET @SOMA = @SOMA + CAST(SUBSTRING(@cnpj, @INDICE, 1)AS INT) * (7 - @INDICE);
			SET @INDICE = @INDICE + 1
		END
		ELSE IF (@INDICE > 5) BEGIN
			SET @SOMA = @SOMA + CAST(SUBSTRING(@cnpj, @INDICE, 1)AS INT) * (15 - @INDICE);
			SET @INDICE = @INDICE + 1
		END
		END

	SET @DIG2 = 11 - (@SOMA % 11)

	IF @DIG2 > 9
		  SET @DIG2 = 0
 
 	-- Validando
		IF (@DIG1 = SUBSTRING(@cnpj,LEN(@cnpj)-1,1)) AND (@DIG2 = SUBSTRING(@cnpj,LEN(@cnpj),1))
		  SET @RESULTADO = 'S'
		ELSE
		  SET @RESULTADO = 'N'
	END
	UPDATE PJNOVO
	SET Cnpj_Valido = @RESULTADO
	where cnpj = @cnpj
end

SET NOCOUNT OFF

Espero que alguem possa me ajudar, um abraço a todos e um bom final de semana

 

inforthiago

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que seu problema está neste while:

 

while LEN(@cnpj) > 0
begin

A menos que você faça um SET @cnpj = 0 em algum lugar, seu while será um eterno looping.

 

Dá uma checada se não é isso... use o comando print @cnpj para ver os valores da sua variável em cada ponto de atualização do mesmo para ver se o problema não é este.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez você usando CURSOR para pegar o CNPJ

e a cada while e roda o proximo CNPJ

 

 

Exemplo:

DECLARE CNPJ_CURSOR CURSOR FOR 
		SELECT  CNPJ FROM PJNOVO
WHERE Cnpj_Valido IS NULL 
		OPEN CNPJ_CURSOR

DENTRO WHILE COLOCA:

 

FETCH NEXT FROM CNPJ_CURSOR INTO @cnpj

 

ASSIM NAO PEGARA MAIS APENAS 1 CNPJ

 

DÁ UMA ESTUDADA SOBRE CURSOR

 

Abraço

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.