CNPJ – Validação no Delphi
 Um dos nossos artigos mais lidos é o Algoritmo de CNPJ, muitos visitantes gostam e aplicam os ensinamentos em seus programas, mas muitos tem dúvidas de como aplicar o algoritmo na sua linguagem de trabalho.
Alguns pedidos chegaram para nossa equipe, como o do amigo Hermes Ferreira que postou a sugestão no artigo do algoritmo: “Achei a forma muito prática para validação dos dÃgitos verificadores, no entanto gostaria que esta forma fosse explicada utilizando os argumentos da lógica de programação, tanto em VBA como em Delphi”.
Bom, em Delphi estamos colocando o código comentado e um pequeno software que mostra o funcionamento, fica aqui o pedido para algum dos nossos colaboradores ou visitantes fazer o mesmo em VBA. Vale o registro que em breve vou publicar o mesmo artigo para PHP.
Vamos lá.
|
///////////////////////////////////////////////////////////////////////////// //Função de validação da CNPJ //Baseado no artigo Algoritmo CNPJ do Clube da Informática //http://www.clubedainformatica.com.br/mostraartigo.php?artigo=63 ///////////////////////////////////////////////////////////////////////////// function ValidaCNPJ(I:string): Boolean; var cnpj: array[1..15] of integer; apoio: array[0..15] of integer; f: integer;//para uso no for total: integer;//para totalização dos valores D1: integer;//primeiro dÃgito calculado D2: integer;//segundo dÃgito calculado begin //Primeiro teste: o número de algarismos if (Length(I)<>14) then result:=false else  begin  //Antes do teste propriamente dito temos que montar a matriz com os  //os algarismos do CNPJ e depois uma matriz apoio) que terá os números  //que ajudarão a verificar so dÃgitos verificadores  //  //Monta matriz cnpj  for f := 1 to 14 do      begin       cnpj[f]:=strtoint(I[f]);      end;  end;  //Monta matriz de apoio  apoio[0]:=6;//só será usada no cálculo do segundo dÃgito verificador  apoio[1]:=5;  apoio[2]:=4;  apoio[3]:=3;  apoio[4]:=2;  apoio[5]:=9;  apoio[6]:=8;  apoio[7]:=7;  apoio[8]:=6;  apoio[9]:=5;  apoio[10]:=4;  apoio[11]:=3;  apoio[12]:=2;  //Começa cálculo do primeiro dÃgito verificador  total:=0;//variável que conterá a soma da operação com os números  for f := 1 to 12 do        begin          total:=total+(cnpj[f]*apoio[f]);        end;  D1 := total mod 11;      if (D1<2) then D1:=0 else D1:=11-D1;      if (D1<>cnpj[13]) then        begin          //Primeiro dÃgito verificador não confere          Result:=false;        end else                begin                 //Entrou aqui, então o primeiro dÃgito confere!                 total:=0;                 for f := 0 to 12 do                        begin                           total:=total+(cnpj[f+1]*apoio[f]);                        end;                 D2 :=total mod 11;                 if (D2<2) then D2:=0 else D2:=11-D2;                 if (D2<>cnpj[14]) then                        begin                           //Segunod digito verificador não confere                           Result:=false;                        end else Result:=true;                 end;  end; |
Â
É lógico que existe outras formas de aplicar o algoritmo, essa eu achei fácil de demonstrar e fica disponÃvel no software, já que é uma função, para ser usada a qualquer momento, é só chamar a função quando necessário.
um abraço!
Clique e faça o download do executável e os fontes
Diretor do Clube da Informática


Adilson Rumão said,
Esta função está com erro, pois dá inválido no meu CPF.
E tbm em outros que testei mesmo sendo válidos.
Plinio Cruz said,
Caro Adilson, você utilizou a rotina dessa artigo? Repare que aqui o exemplo é de CNPJ. A validação em CPF é http://www.clubedainformatica.com.br/site/2003/10/22/algoritmo-de-cpf/, qualquer dúvida envie seu código para contato@clubedainformatica.com.br que podemos ajudar.
Netto Passaro said,
Muito boa a função.
Só pra agregar… se colocar tudo zero (00000000000000)
ele deixa passar…
pra resolver agreguei isso no começo da função:
if (I=’00000000000000′) then result:=false
else
dai começa a funcao original:
if (Length(I)14) then result:=false
etc etc
abraços!!!
shyko said,
SHOW! PARA MIM ESTA OTIMO, MAIS VALE CONMPLETAR A DICA DO NETTO
Myrella said,
Parabéns, código bem comentado e explicado, funcionou de primeira.
Deixe seu comentário