Validando o CNPJ em uma Aplicação Delphi

Veja neste artigo uma aplicação Delphi para validar números do Cadastro Nacional da Pessoa Jurídica (CNPJ).

Cadastro de Pessoa Física (CNPJ)
Este artigo apresenta como é realizada a validação de um número de CNPJ que é o documento de identificação do contribuinte Pessoa Jurídica perante a Receita Federal.

O CNPJ é um número formado por 14 dígitos dos quais os dois últimos são chamados de dígitos verificadores (DV). Cada DV é calculado com base nos dígitos anteriores e juntos servem para validar o número do CNPJ como um todo. Assim, torna-se importante quando um número de CNPJ é digitado pelo usuário final em uma aplicação utilizar a função isCNPJ, implementada na biblioteca de códigos "ValidaCNPJ" apresentada na Listagem 1, para verificar se o número informado está correto evitando, por exemplo, o cadastro de CNPJs inválidos.

Para exemplificar o algoritmo de verificação do CNPJ será utilizado como exemplo o CNPJ número 14.572.457.0001-85.

O cálculo dos DVs é executado em duas etapas usando para isto o módulo de divisão 11 (módulo de divisão é a parte inteira do resultado de uma divisão):

Para calcular o dígito verificador:
a) Cada um dos doze primeiros números do CNPJ, a partir do 12º número até o 1º, é multiplicado por um peso que começa de 2 e que vai sendo incrementado de 1 a cada passo, somando-se as parcelas calculadas. Sempre que o peso atingir o valor 10 ele deve novamente receber o valor inicial 2:
1 0 0 0 7 5 4 2 7 5 4 1  
X X X X X X X X X X X X  
2 3 4 5 6 7 8 9 2 3 4 5  
2 0 0 0 42 35 32 18 14 15 16 5 soma das parcelas = 179

b)
calcula-se o dígito através da seguinte expressão:
  179 % 11 = 3
obs. se o resto da divisão (operador %) calculado for 0 ou 1, o dígito verificador será 0; nos outros casos, o dígito verificador é definido pela expressão: 11 - 3 = 8

Para calcular o dígito verificador:
a) Cada um dos treze primeiros números do CNPJ, a partir do primeiro DV (13º número) até o 1º, é multiplicado por um peso que começa de 2 e que vai sendo incrementado de 1 a cada passo, somando-se as parcelas calculadas. Sempre que o peso atingir o valor 10 ele deve novamente receber o valor inicial 2:
8 1 0 0 0 7 5 4 2 7 5 4 1  
X X X X X X X X X X X X X  
2 3 4 5 6 7 8 9 2 3 4 5 6  
16 3 0 0 0 49 40 36 4 21 20 20 6 soma das parcelas = 215

b)
calcula-se o dígito através da seguinte expressão:
  215 % 11 = 6
obs. se o resto da divisão (operador %) calculado for 0 ou 1, o dígito verificador será 0; nos outros casos, o dígito verificador é definido pela expressão: 11 - 6 = 5

Desenvolvendo a Aplicação Delphi
Criar uma nova aplicação no ambiente de desenvolvimento Delphi 7 através da opção do menu "File|New|Application..." e realizar os três passos descritos a seguir:

1º Passo:

Desenvolver o formulário principal da aplicação como sugere a Figura 1. Atenção: observe que as caixas de textos explicativos utilizadas na figura apresentam a ordem sequencial e o nome do componente, a página da sua localização e as propriedades que devem ser alteradas com os respectivos valores.


Figura 1. Formulário principal da aplicação.

2º Passo:
Na unidade de códigos (unit), apresentada na Listagem 1, construída através da opção do menu "File|New|Unit" deve-se implementar os subprogramas:
a) isCNPJ- retorna um valor booleano que indica se o número de CNPJ é válido ou inválido;
b) imprimeCNPJ- retorna o CNPJ formatado na máscara: 99.999.999.9999-99.

Listagem 1. Unit "ValidaCNPJ" com as funções "isCNPJ" e "imprimeCNPJ".
unit ValidaCNPJ; interface function isCNPJ(CNPJ: string): boolean; function imprimeCNPJ(CNPJ: string): string; implementation uses SysUtils; // necessário para utilizar a função "StrToInt" function isCNPJ(CNPJ: string): boolean; var dig13, dig14: string; sm, i, r, peso: integer; begin // length - retorna o tamanho da string do CNPJ (CNPJ é um número formado por 14 dígitos) if ((CNPJ = '00000000000000') or (CNPJ = '11111111111111') or (CNPJ = '22222222222222') or (CNPJ = '33333333333333') or (CNPJ = '44444444444444') or (CNPJ = '55555555555555') or (CNPJ = '66666666666666') or (CNPJ = '77777777777777') or (CNPJ = '88888888888888') or (CNPJ = '99999999999999') or (length(CNPJ) <> 14)) then begin isCNPJ := false; exit; end; // "try" - protege o código para eventuais erros de conversão de tipo através da função "StrToInt" try { *-- Cálculo do 1o. Digito Verificador --* } sm := 0; peso := 2; for i := 12 downto 1 do begin // StrToInt converte o i-ésimo caractere do CNPJ em um número sm := sm + (StrToInt(CNPJ[i]) * peso); peso := peso + 1; if (peso = 10) then peso := 2; end; r := sm mod 11; if ((r = 0) or (r = 1)) then dig13 := '0' else str((11-r):1, dig13); // converte um número no respectivo caractere numérico { *-- Cálculo do 2o. Digito Verificador --* } sm := 0; peso := 2; for i := 13 downto 1 do begin sm := sm + (StrToInt(CNPJ[i]) * peso); peso := peso + 1; if (peso = 10) then peso := 2; end; r := sm mod 11; if ((r = 0) or (r = 1)) then dig14 := '0' else str((11-r):1, dig14); { Verifica se os digitos calculados conferem com os digitos informados. } if ((dig13 = CNPJ[13]) and (dig14 = CNPJ[14])) then isCNPJ := true else isCNPJ := false; except isCNPJ := false end; end; function imprimeCNPJ(CNPJ: string): string; begin { máscara do CNPJ: 99.999.999.9999-99 } imprimeCNPJ := copy(CNPJ, 1, 2) + '.' + copy(CNPJ, 3, 3) + '.' + copy(CNPJ, 6, 3) + '.' + copy(CNPJ, 9, 4) + '-' + copy(CNPJ, 13, 2); end; end.

As unidades ou bibliotecas de códigos (unit's) representam no Delphi a forma de disponibilizar um conjunto de subprogramas (functions e/ou procedures) destinados a solucionar uma série de tarefas bastante corriqueiras, como por exemplo, a função para validar números de CNPJ. Na Listagem 2 pode-se observar a estrutura básica de uma unit.

Listagem 2. Estrutura básica de uma unit.
// Cabeçalho da unidade de códigos.
// Atenção: O nome interno da unit deve ser o mesmo nome dado ao arquivo fonte
unit NomeDaUnit;

interface
// Comunicação entre dois meios (dispositivos). Contêm o cabeçalho
// dos procedimentos e funções declarados na unit, declaração
// de objetos globais e o uso de outras unidades.

implementation
// Corpo dos procedimentos e funções anunciados na seção de
// interface e declarações de objetos locais.
end.

Outro aspecto destacável da programação foi a utilização da estrutura de controle de erros "try – except - end" que irá proteger o código para eventuais erros de conversão de tipo com a função "StrToInt".

3º Passo:
Agora novamente no formulário principal da aplicação deve-se:
3.1: fazer a referência a unit "ValidaCNPJ", implementada no passo 2, através da opção do menu "File|Use Unit..." . A conclusão deste passo resulta na seguinte linha de código:
uses ValidaCNPJ;

3.2: implementar o seguinte código no evento "onClick" do botão "Verificar CNPJ":
// usando as funções isCNPJ e imprimeCNPJ da unit "ValidaCNPJ"
if isCNPJ(CNPJ.Text)
   then Result.Caption := imprimeCNPJ(CNPJ.Text)
else Result.Caption := 'Erro: CNPJ inválido !!!';

Veja também: Validando o CPF em uma Aplicação Delphi.

Ilustrando a execução da aplicação::
1. CNPJ 44.444.444.4444-44 é inválido:

2. CNPJ é um número formado por 14 dígitos:

3. Existem caracteres alfabéticos no CNPJ:
 
4. CNPJ informado está correto (ou válido):
 

Obrigado e um abraço.

Prof. Omero Francisco Bertol (http://www.pb.utfpr.edu.br/omero/)
Aplicações Delphi (http://www.pb.utfpr.edu.br/omero/Delphi/Exercicios.htm)
Download da Aplicação (http://www.pb.utfpr.edu.br/omero/Delphi/Artigos/CNPJ_Delphi.rar)
Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados