Validando CNPJ no SQL Server
Neste artigo mostraremos com validar os dois ultimos dígitos (verificadores) do CNPJ no SQL Server
Você não gostou da qualidade deste conteúdo?
(opcional) Você gostaria de comentar o que não lhe agradou?
Como funciona o número do CNPJ (Cadastro Nacional da Pessoa Jurídica)
O número do CNPJ é composto por três partes de algarismos:
1ª parte é o número da inscrição;
2ª parte depois da barra ( / ) é o número de filiais;
e o final são os 2 dígitos verificadores.
Agora vamos calcular um número de CNPJ para saber se ele é válido.
Exemplo: 04.378.946/0001-?? (47).
Passo-a-Passo:
(1)- Digita-os na seqüência sem barra, ponto e traço.
043789460001
(2)- Agora o algoritmo para fazer a soma:
543298765432
(3)- Coloca-se um sob o outro e multiplica-se o número de cima pelo número de baixo.
043789460001 = > CNPJ
543298765432 => algoritimos
Exemplo: (5 * 0), (4 * 4), (3 * 3), (2 * 7), etc...
(4)-Depois soma-se tudo: Exemplo = 0 + 16 + 25 + 39 + 111 + 183 + 211 + 247 + 247 + 247 + 247 + 249
Resultado dessa primeira soma = 249
(5)-Fazendo a divisão por 11 (249/11).
O resto da divisão é o número 7.
??? Regra: Se o resultado da divisão for < 2 o valor do dígito verificador é igual a 0.
Senão subtraímos o valor de 11 para obter o dígito.
Exemplo: Verificador é (11 - 7) o primeiro digito é 4.
Para validar o segundo dígito é só repetir o mesmo processo, incluindo o dígito que foi achado na conta acima.
Exemplo:
0437894600014 => CNPJ + 1 dígito validado que é 4.
6543298765432 => algorítimos acrescentando o número 6 no começo.
Somar e achar o segundo dígito verificador. Para saber se o CNPJ é valido, testar se os números verificadores sao iguais ao do CNPJ.
Agora vamos ao script.
Obs: Para Criar a Function coloquem em comentário todas as linhas que tiver o comando ‘PRINT’
E para testar sem criar a Function copiem todo o código a partir do ‘DECLARE’ e rodem no Query Analyzer e entenderão passo-a-passo com auxilio das linhas de comentários ‘PRINT’
/* PARA TESTAR:
SELECT DBO.UDF_VALIDACNPJ(''04378946000147'') */
Set ANSI_NULLS ON
GO
RETURNS CHAR(1)
AS
BEGIN
DECLARE @CNPJ VARCHAR(14), @INDICE INT, @SOMA INT, @DIG1 INT, @DIG2 INT, @VAR1 INT, @VAR2 INT, @RESULTADO CHAR(1)
SET @SOMA = 0
SET @INDICE = 1
SET @RESULTADO = ''N''
/* ALGORÍTIMO PARA O PRIMEIRO DÍGITO 543298765432 */
/* CÁLCULO DO 1º DÍGITO */
/* CÁLCULO DA 1ª PARTE DO ALGORÍTIOM 5432 */
SET @VAR1 = 5 /* 1a Parte do Algorítimo começando de "5" */
WHILE (@INDICE <= 4)
BEGIN
SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CNPJ,@INDICE,1)) * @VAR1
PRINT ''INDICE.: '' + CONVERT(VARCHAR(2),@INDICE)
PRINT ''DIGITO-A-DIGITO DO CNPJ.: '' + SUBSTRING(@CNPJ,@INDICE,1)
PRINT ''SOMA PARA O 1o DIGITO, ALGORITIMO 5432 .: '' + CONVERT(VARCHAR(5),@Soma)
SET @INDICE = @INDICE + 1 /* Navegando um-a-um até < = 4, as quatro primeira posições */
SET @VAR1 = @VAR1 - 1 /* subtraindo o algorítimo de 5 até 2 */
END
PRINT ''------------------------------------''
/* CÁLCULO DA 2ª PARTE DO ALGORÍTIOM 98765432 */
SET @VAR2 = 9
WHILE (@INDICE <= 12)
BEGIN
SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CNPJ,@INDICE,1)) * @VAR2
PRINT ''INDICE.: '' + CONVERT(VARCHAR(2),@INDICE)
PRINT ''DIGITO-A-DIGITO DO CNPJ.: '' + SUBSTRING(@CNPJ,@INDICE,1)
PRINT ''SOMA PARA O 1o DIGITO, ALGORITIMO 98765432 .: '' + CONVERT(VARCHAR(5),@Soma)
SET @INDICE = @INDICE + 1
SET @VAR2 = @VAR2 - 1
END
PRINT ''SOMA TOTAL = '' + CONVERT(VARCHAR(5),@Soma)
SET @DIG1 = (@soma % 11)
PRINT ''DIG1, RESTO DA DIVISAO .: '' + CONVERT(VARCHAR(3),(@SOMA % 11))
/* SE O RESTO DA DIVISÃO FOR < 2, O DIGITO = 0 */
IF @DIG1 < 2
SET @DIG1 = 0;
ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/
SET @DIG1 = 11 - (@soma % 11);
PRINT ''DIG1 É.: '' + CONVERT(VARCHAR(3),@DIG1)
/* CÁLCULO DO 2º DÍGITO */
/* ZERANDO O INDICE E A SOMA PARA COMEÇAR A CALCULAR O 2º DÍGITO*/
SET @INDICE = 1
SET @SOMA = 0
/* CÁLCULO DA 1ª PARTE DO ALGORÍTIOM 65432 */
SET @VAR1 = 6 /* 2a Parte do Algorítimo começando de "6" */
SET @RESULTADO = ''N''
WHILE (@INDICE <= 5)
BEGIN
SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CNPJ,@INDICE,1)) * @VAR1
PRINT ''INDICE.: '' + CONVERT(VARCHAR(2),@INDICE)
PRINT ''DIGITO-A-DIGITO DO CNPJ.: '' + SUBSTRING(@CNPJ,@INDICE,1)
PRINT ''SOMA PARA O 2o DIGITO, ALGORITIMO 65432 .: '' + CONVERT(VARCHAR(5),@Soma)
SET @INDICE = @INDICE + 1 /* Navegando um-a-um até < = 5, as quatro primeira posições */
SET @VAR1 = @VAR1 - 1 /* subtraindo o algorítimo de 6 até 2 */
END
PRINT ''------------------------------------''
/* CÁLCULO DA 2ª PARTE DO ALGORÍTIOM 98765432 */
SET @VAR2 = 9
WHILE (@INDICE <= 13)
BEGIN
SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CNPJ,@INDICE,1)) * @VAR2
PRINT ''INDICE.: '' + CONVERT(VARCHAR(2),@INDICE)
PRINT ''DIGITO-A-DIGITO DO CNPJ.: '' + SUBSTRING(@CNPJ,@INDICE,1)
PRINT ''SOMA PARA O 2o DIGITO, ALGORITIMO 98765432 .: '' + CONVERT(VARCHAR(5),@Soma)
SET @INDICE = @INDICE + 1
SET @VAR2 = @VAR2 - 1
END
PRINT ''SOMA TOTAL = '' + CONVERT(VARCHAR(5),@Soma)
SET @DIG2 = (@soma % 11)
PRINT ''DIG2, RESTO DA DIVISAO .: '' + CONVERT(VARCHAR(3),(@SOMA % 11))
/* SE O RESTO DA DIVISÃO FOR < 2, O DIGITO = 0 */
IF @DIG2 < 2
SET @DIG2 = 0;
ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/
SET @DIG2 = 11 - (@soma % 11);
PRINT ''DIG2 É.: '' + CONVERT(VARCHAR(3),@DIG2)
PRINT ''------------------------------------''
PRINT ''------------------------------------''
PRINT ''DIG1 É.: '' + CONVERT(VARCHAR(3),@DIG1)
PRINT ''DIG2 É.: '' + CONVERT(VARCHAR(3),@DIG2)
PRINT SUBSTRING(@CNPJ,LEN(@CNPJ)-1,1)
PRINT SUBSTRING(@CNPJ,LEN(@CNPJ),1)
-- Validando
IF (@DIG1 = SUBSTRING(@CNPJ,LEN(@CNPJ)-1,1)) AND (@DIG2 = SUBSTRING(@CNPJ,LEN(@CNPJ),1))
SET @RESULTADO = ''S''
ELSE
SET @RESULTADO = ''N''
PRINT ''RESULTADO .: '' + @RESULTADO
END
RETURN @RESULTADO
Obs: Colaboração do Algoritmo - Fabyo (iMasters Fóruns > Programação > PHP > Laboratório de scripts (PHP))
Obs: Colaboração da Lógica da Validação do CPF - Cristiano Martins Alves – DevMedia
Fernando Jacinto Da Silva..
Possui Graduação em Ciência da Computação pela Universidade de Marília (1994). Trabalha com Desenvolvimento de Sistemas desde 1999 e Ministra aulas em estabelecimentos de Ensino (Colégio Técnicos) desde 1996. Atualmente é Supervisor e Programador de Sistemas de Informação na Seção de Informática da ...
4 COMENTÁRIOS



