Rotina de CPF por favor

12/02/2003

0

Alguém tem uma rotina para testar CPF que funcione de verdade? Já peguei várias aqui, mas nenhuma funcionou!


Sérgio-pardal

Sérgio-pardal

Responder

Posts

12/02/2003

Dor_poa

Function TForm1.Verifica_CGCCPF(CODIGO:STRING):BOOLEAN;
Var Dig:Array[1..20] of INTEGER;
Digito1,Digito2,CONT_FOR:Integer;
Begin
Result := True ;
try
FOR CONT_FOR := 1 TO 20 DO
DIG[CONT_FOR] := 0;
DIGITO1 := 0;
DIGITO2 := 0;

IF LENGTH(CODIGO)=18 THEN
BEGIN
FOR CONT_FOR := 1 TO 18 DO
BEGIN
IF (COPY(codigo, CONT_FOR, 1) <> ´.´) AND
(COPY(codigo, CONT_FOR, 1) <> ´,´) AND
(COPY(codigo, CONT_FOR, 1) <> ´/´) AND
(COPY(codigo, CONT_FOR, 1) <> ´-´) THEN
DIG[CONT_FOR] := STRTOINT(COPY(codigo, CONT_FOR, 1)) ;
END;
DIG[1] := DIG[1] * 5;
DIG[2] := DIG[2] * 4;
DIG[4] := DIG[4] * 3;
DIG[5] := DIG[5] * 2;
DIG[6] := DIG[6] * 9;
DIG[8] := DIG[8] * 8;
DIG[9] := DIG[9] * 7;
DIG[10] := DIG[10] * 6;
DIG[12] := DIG[12] * 5;
DIG[13] := DIG[13] * 4;
DIG[14] := DIG[14] * 3;
DIG[15] := DIG[15] * 2;
FOR CONT_FOR := 1 TO 15 DO
DIG[19] := DIG[19] + DIG[CONT_FOR];

DIGITO1 := Trunc(DIG[19] / 11);
DIGITO1 := DIGITO1 * 11;
DIGITO1 := DIG[19] - DIGITO1;
DIGITO1 := 11 - DIGITO1;

IF DIGITO1 >= 10 THEN DIGITO1 := 0;
IF DIGITO1 <> DIG[17] THEN
BEGIN
Showmessage(´CNPJ/CPF inválido´);
Verifica_CGCCPF:=FALSE;
Exit;
END;

FOR CONT_FOR := 1 TO 18 DO
BEGIN
IF (COPY(codigo, CONT_FOR, 1) <> ´.´) AND
(COPY(codigo, CONT_FOR, 1) <> ´/´) AND
(COPY(codigo, CONT_FOR, 1) <> ´-´) THEN
DIG[CONT_FOR] := STRTOINT(COPY(codigo, CONT_FOR, 1)) ;
END;
DIG[1] := DIG[1] * 6;
DIG[2] := DIG[2] * 5;
DIG[4] := DIG[4] * 4;
DIG[5] := DIG[5] * 3;
DIG[6] := DIG[6] * 2;
DIG[8] := DIG[8] * 9;
DIG[9] := DIG[9] * 8;
DIG[10] := DIG[10] * 7;
DIG[12] := DIG[12] * 6;
DIG[13] := DIG[13] * 5;
DIG[14] := DIG[14] * 4;
DIG[15] := DIG[15] * 3;
DIG[17] := DIG[17] * 2;
FOR CONT_FOR := 1 TO 17 DO
DIG[20] := DIG[20] + DIG[CONT_FOR];

DIGITO2 := trunc(DIG[20] / 11);
DIGITO2 := DIGITO2 * 11;
DIGITO2 := DIG[20] - DIGITO2;
DIGITO2 := 11 - DIGITO2;

IF DIGITO2 >= 10 THEN DIGITO2 := 0;
IF DIGITO2 <> DIG[18] THEN
BEGIN
SHOWMESSAGE(´Cnpj inválido´);
Verifica_CGCCPF:=FALSE;
Exit;
END;
END

//** comeca a testar i cpf ********
ELSE BEGIN // Testar CPF
FOR CONT_FOR := 1 TO 14 DO
BEGIN
IF (COPY(codigo, CONT_FOR, 1) <> ´.´) AND
(COPY(codigo, CONT_FOR, 1) <> ´/´) AND
(COPY(codigo, CONT_FOR, 1) <> ´-´) THEN
DIG[CONT_FOR] := STRTOINT(COPY(codigo, CONT_FOR, 1)) ;
END;
DIG[1] := DIG[1] * 10;
DIG[2] := DIG[2] * 9;
DIG[3] := DIG[3] * 8;
DIG[5] := DIG[5] * 7;
DIG[6] := DIG[6] * 6;
DIG[7] := DIG[7] * 5;
DIG[9] := DIG[9] * 4;
DIG[10] := DIG[10] * 3;
DIG[11] := DIG[11] * 2;
FOR CONT_FOR := 1 TO 11 DO
DIG[19] := DIG[19] + DIG[CONT_FOR];

DIGITO1 := Trunc(DIG[19] / 11);
DIGITO1 := DIGITO1 * 11;
DIGITO1 := DIG[19] - DIGITO1;
DIGITO1 := 11 - DIGITO1;

IF DIGITO1 >= 10 THEN DIGITO1 := 0;
IF DIGITO1 <> DIG[13] THEN
BEGIN
SHOWMESSAGE(´Cpf Inválido´);
Verifica_CGCCPF:=FALSE;
Exit;
END;
FOR CONT_FOR := 1 TO 14 DO
BEGIN
IF (COPY(codigo, CONT_FOR, 1) <> ´.´) AND
(COPY(codigo, CONT_FOR, 1) <> ´-´) THEN
DIG[CONT_FOR] := STRTOINT(COPY(codigo, CONT_FOR, 1)) ;
END;
DIG[1] := DIG[1] * 11;
DIG[2] := DIG[2] * 10;
DIG[3] := DIG[3] * 9;
DIG[5] := DIG[5] * 8;
DIG[6] := DIG[6] * 7;
DIG[7] := DIG[7] * 6;
DIG[9] := DIG[9] * 5;
DIG[10] := DIG[10] * 4;
DIG[11] := DIG[11] * 3;
DIG[13] := DIG[13] * 2;
FOR CONT_FOR := 1 TO 13 DO
DIG[20] := DIG[20] + DIG[CONT_FOR];

DIGITO2 := trunc(DIG[20] / 11);
DIGITO2 := DIGITO2 * 11;
DIGITO2 := DIG[20] - DIGITO2;
DIGITO2 := 11 - DIGITO2;

IF DIGITO2 >= 10 THEN DIGITO2 := 0;
IF DIGITO2 <> DIG[14] THEN
BEGIN
SHOWMESSAGE(´Cpf Inválido´);
Verifica_CGCCPF:=FALSE;
Exit;
END;
Result := True;
END;
except
SHOWMESSAGE(´Nº de caracteres inválido!´);
Result := False;
end;
end;


Responder

13/02/2003

Anonymous

Entre no Site abaixo e faça download do utilitário para validação do CPF / CNPJ.
Com fontes em delphi4.

[url]www.veloso.kit.net[/url]


Responder

13/02/2003

Anonymous

Toma aí a do CPF e a do CNPJ:

Utilize assim:
ValidaCNPJ( ´61559895000286´,False ); Retornaria um false e não mostraria a mensagem padrão.
ValidaCNPJ( ´61559895000286´,True ); Retornaria um false e mostraria a mensagem ´Número de CNPJ inválido´.
O mesmo vale para a função ValidaCPF.

function ValidaCNPJ( sCNPJ: string; MostraMsg: boolean = true ): boolean;
const String1 = ´543298765432´;
String2 = ´654329876543´;
var i,j,Digito: byte;
Controle: string[2];
StringX: string;
Soma: smallint;
begin
sCNPJ := Copy( ´00000000000000´+Trim(sCNPJ),(Length(Trim(sCNPJ))+14)-13,14 );
Controle := ´ ´;
Digito := 0;
StringX := String1;
for i := 1 to 2 do
begin
Soma := 0;
if i = 2 then StringX := String2;
for j := 1 to 12 do Soma := Soma + ( StrToIntDef(sCNPJ[j],0) * StrToIntDef(StringX[j],0) );
if i = 2 then Soma := Soma + (2 * Digito);
Digito := (Soma * 10) Mod 11;
if Digito = 10
then Digito := 0;
Controle[i] := IntToStr( Digito )[1];
end;
Result := Controle = Copy( sCNPJ,13,2 );
if not Result and MostraMsg
then ShowMessage( ´Número de CNPJ inválido!´ );
end;

function ValidaCPF( sCPF: string; MostraMsg: boolean = true ): boolean;
const String1 = ´100908070605040302´;
String2 = ´111009080706050403´;
var i,j,Digito: byte;
Controle: string[2];
StringX: string;
Soma: smallint;
begin
sCPF := Copy( ´00000000000´+Trim(sCPF),(Length(Trim(sCPF))+11)-10,11 );
Controle := ´ ´;
Digito := 0;
StringX := String1;

for i := 1 to 2 do
begin
Soma := 0;
if i = 2 then StringX := String2;
for j := 1 to 9 do Soma := Soma + ( StrToIntDef(sCPF[j],0) * StrToIntDef( Copy( StringX,j+(j-1),2 ),0 ) );
if i = 2 then Soma := Soma + (2 * Digito);
Digito := (Soma * 10) Mod 11;
if Digito = 10
then Digito := 0;
Controle[i] := IntToStr( Digito )[1];
end;
Result := Controle = Copy( sCPF,10,2 );
if not Result and MostraMsg
then ShowMessage( ´Número de CPF inválido!´ );
end;


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar