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