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
Esta função está com erro, pois dá inválido no meu CPF.
E tbm em outros que testei mesmo sendo válidos.
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.
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!!!
SHOW! PARA MIM ESTA OTIMO, MAIS VALE CONMPLETAR A DICA DO NETTO
Parabéns, código bem comentado e explicado, funcionou de primeira.
Muito bom, mas se for para rodar no visualg tem muita diferença?