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

CREATE FUNCTION [dbo].[UDF_VALIDACNPJ](@CNPJ VARCHAR(14))

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