Validação de números de documentos e siglas de estado
Objetivo
O objetivo deste documento é mostrar como validar números de CNPJ, CPF e PIS/PASEP, além de verificar se a sigla do Estado informado está correta.
Ele foi baseado na unit “P:\commons\Brcomviasoft\utils\Func\BibValdoc.pas”
As funções em uso serão descritas mais a frente, neste documento.
Unit uPrinc
A “unit uPrinc” é a unidade principal do script. Aquela que é executada primeiro e que cria o formulário para que o usuário possa fazer as validações desejadas.
Abaixo, segue o código fonte que deverá ser colado/digitado nela:
uses
uFrmValidaNumDoc;
var
formulario: TFrmValidaNumeracaoDocumentos;
begin
formulario := TFrmValidaNumeracaoDocumentos.Create(nil);
try
if formulario.ShowModal = MrOk then
begin
end;
finally
formulario.free;
end;
end;
Criando o formulário de validação
Clique botão “New Form” ou no menu “File → New Form” para criar o novo formulário.
Altere a propriedade “Name” do formulário para “frmValidaNumeracaoDocumentos“.
Altere a propriedade “Caption” do formulário para “Validar documentos/siglas“.
O formulário de validação possuirá três objetos. Abaixo, segue a descrição deles:
Um “TLabel” com o valor a propriedade “Caption” alterado para ”Informe o dado a validar:”;
Um “TEdit” com a propriedade “Name” alterada para “edtCNPJCPF“ e a propriedade “TextHint” alterada para “Informe o número / sigla”; e
Um “TButton” com a propriedade “Name” alterada para “btnValidaNumero“ e a propriedade “Caption” alterada para “&Validar”.
Depois que estes elementos forem criados e suas propriedades alteradas, clique no botão btnValidaNumero e, em seguida, na guia “Events”, a esquerda da tela, clique duas vezes no evento “OnClick”. Isso fará a associação dos eventos relacionados ao clique de botão ao botão específico. O evento deve ficar como mostrado abaixo:
Abaixo, apresentamos o layout sugerido do formulário:
{$FORM TfrmValidaNumeracaoDocumentos, uFrmValidaNumDoc.sfm}
uses
// Carregando as units necessárias para o funcionamento do script
Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
{ função TrocaString funciona trocando um caracter por outro (quem), dentro de
string (onde), pelo novo caractere (porquem).
Exemplo de uso:
TrocaString('String de testes.', '.', '!')
Resultado: trocará o ponto final pelo sinal de exclamação}
function TrocaString(onde, quem, porquem: String): String;
var
x: Integer;
nStr: String;
Begin
nStr := '';
for x:=1 to length(onde) do
begin
if copy(onde, x, 1) <> quem then
nStr := nStr + copy(onde, x, 1)
else
nStr := nStr + porquem;
end;
Result := nStr;
end;
// função DVcnpj calcula e retorna os dígitos verificadores do CNPJ, a partir do
// número do CNPJ sem os dígitos verificadores
function DVcnpj(CNPJ: string): string;
var
Num, Soma, Dig : Integer;
mult, X, Tam: Byte;
begin
Result := '';
for Tam := 12 TO 13 do
begin
CNPJ := Copy(CNPJ, 1, Tam);
mult := 1;
Soma := 0;
for X := Length(CNPJ) DownTo 1 do
begin
if mult = 9 then mult := 2
else Inc(mult);
Num := StrToInt( CNPJ[X] );
Soma := Soma + (Num * mult);
end;
Dig := (Soma*10) mod 11;
if Dig > 9 then Dig := 0;
Result := Result + IntToStr(Dig);
CNPJ := CNPJ + Result;
end;
end;
// função DVcpf calcula e retorna os digitos verificadores para o CPF, a partir
// do numero do CPF sem os digitos
function DVcpf(CPF: string): string;
var
Num, Soma: Integer;
mult, Dig, X, Tam: Byte;
begin
Result := '';
for Tam := 9 to 10 do
begin
CPF := Copy(CPF, 1, Tam);
mult := 1;
Soma := 0;
for x := Length(CPF) DownTo 1 do
begin
Inc(mult);
Num := StrToIntDef(CPF[X], 0);
Soma := Soma + (Num * mult);
end;
dig := (Soma*10) mod 11;
if Dig > 9 then Dig := 0;
Result := Result + IntToStr(Dig);
CPF := CPF + Result;
end;
end;
// função ChecaEstado verifica se a sigla informada faz parte da constante Estados.
// Se for, indica que é uma sigla válida.
function ChecaEstado(cUF: string): String;
{Checa se o Simbolo da UF é Valido}
const
Estados = '|SP|MG|RJ|RS|SC|PR|ES|DF|MT|MS|GO|TO|BA|SE|AL|PB|PE|MA|RN|CE|PI|PA|AM|AP|FN|AC|RR|RO|';
begin
Result := '';
if Pos('|'+ UpperCase(cUF) +'|', Estados) > 0 then
Result := 'Estado válido'
else
Result := Format('%s não é uma sigla de estado válida', [cUF]);
end;
{ função SoNumeros retorna apenas os números em uma String. Neste exemplo, remove
os sinais de formatação das máscaras do CPF, do CNPJ e do PIS. Os parâmetros são a String
que deve ter seu conteúdo, diferente de números, removido e o parâmetro lConsiderarZero
que irá considerar os zeros a esquerda, sendo este do tipo boolean, que receberá
ou o valor True (verdadeiro) ou o valor False (falso).
Exemplo de uso:
SoNumeros('95.551.365/0001-10', true);
Resultado: 95551365000110
}
function SoNumeros(Texto: String; lConsiderarZero: Boolean): String;
var
c: Integer;
sTexto: String;
begin
sTexto := (Texto);
Result := '';
for c := 1 to Length(sTexto) do
begin
if (Ord(sTexto[c]) >= 48) AND (Ord(sTexto[c]) <= 57) then
Result := Result + sTexto[c];
end;
if (not lConsiderarZero) then
begin
while (Length(Result) > 0) do
begin
if (Result[1] = '0') then
Delete(Result, 1, 1)
else
{ Ao encontrar o primeiro caractere diferente de zero sai do loop. }
break;
end;
end;
end;
{ função ValidaPis verifica se o número do PIS informado é válido ou não, sendo
o retorno da função do tipo boolean, que retornará ou o valor True (verdadeiro)
ou o valor False (falso), de acordo com a validade do número informado.
Exemplo de uso:
if ValidaPis('083.28929.56-0') then
ShowMessage('PIS válido')
else
ShowMessage('PIS inválido');
}
function ValidaPis(Dado: string): boolean;
var
i, wsoma, Wm11, Wdv, wdigito : Integer;
begin
Dado := SoNumeros(Dado, true);
Result := ( Length(Dado) = 11 ); {Menos de 11 digitos = invalido}
if Result Then
begin
wdv := StrToInt(Dado[11]);
wsoma := 0;
wm11 := 2;
for i := 1 to 10 do
begin
wsoma := wsoma + (wm11 * StrToInt(Dado[11-I]) );
if wm11 < 9 then
inc(wm11)
else
wm11 := 2;
end;
wdigito := 11 - (wsoma MOD 11);
if wdigito > 9 then
wdigito := 0;
Result := (wdv = wdigito);
end;
end;
{ função TodosCaracteresIguais verifica se o <cText> informado eh formado por
todos os caracteres iguais, ou seja, Retorna True se cText = '1111111', '22222',
'AAAAA', etc. Util na verificacao de CNPJ e CPF que nao aceitam numeros repetidos
}
function TodosCaracteresIguais(cText: string): Boolean;
var
cAux: string;
begin
//obtém o 1o. caractere da string
cAux := Copy(cText, 1, 1);
cAux := TrocaString(cText, cAux, '')
// Se nao sobrou nada em cAux, significa que todos os demais caracteres eram
// iguais ao primeiro
Result := (Trim(cAux) = '');
end;
{ função ValCNPJ Retorna True se o número do CNPJ for válido. Se CheckDupChar
for igual True, não aceita CNPJ composto por todos os números repetidos,
como, 11111111111111, 22222222222222, etc. Se CheckDupChar for False, irá
aceitar tais números.}
function ValCNPJ(cCNPJ: string; CheckDupChar: Boolean): Boolean;
begin
Result := '';
if ((not CheckDupChar) or (not TodosCaracteresIguais(cCNPJ))) and
(Copy(cCNPJ, 13, 2) = DVcnpj(cCNPJ)) then
Result := 'CNPJ válido!'
else
Result := 'CNPJ inválido!'
end;
{ função ValCPF Retorna True se o número do CPF for válido. Se CheckDupChar for
igual True, não aceita CPF composto por todos os números repetidos, como,
11111111111, 22222222222, etc. Se CheckDupChar for False, irá aceitar tais
números.
}
function ValCPF(cCPF: string; CheckDupChar: Boolean): Boolean;
begin
Result := ( (not CheckDupChar) or (not TodosCaracteresIguais(cCPF)) ) and
( Copy(cCPF,10,2) = DvCPF(cCPF) );
end;
{Função ValCNPJCPF faz a consistência do CGC ou do CPF, conforme o tamanho
do campo tipo caracter nro - numero do cgc ou cpf}
function ValCNPJCPF(cNumero: string; CheckDupChar: Boolean): String;
begin
cNumero := Trim(cNumero);
Result := 'Dados informados não são nem CPF, nem CNPJ, nem PIS, nem sigla de Estado.';
if Length(cNumero) = 2 then
Result := ChecaEstado(cNumero)
else
cNumero := SoNumeros(cNumero, true);
if Length(cNumero) = 11 then
begin
if (ValCPF(cNumero, CheckDupChar)) then
Result := 'CPF Válido!'
else
begin
if ValidaPis(cNumero) then
begin
Result := 'PIS Válido';
end;
else
Result := 'CPF ou PIS informado não é válido!';
end;
end
else if Length(cNumero) = 14 then
Result := ValCNPJ(cNumero, CheckDupChar)
end;
{ procedure btnValidaNumeroClick chama a função ValCNPJCPF e mostra o resultado
por meio do showmessage}
procedure btnValidaNumeroClick(Sender: TObject);
begin
try
if Length(trim(edtCNPJCPF.Text)) > 0 then
showMessage(ValCNPJCPF(edtCNPJCPF.Text, true));
finally
// se quiser permitir apenas uma validação por execução, remover o comentário
// da linha abaixo
// ModalResult := mrOk;
end;
end;
Por meio do site https://4devs.com.br , podem ser criados alguns números de documentos fictícios que podem ajudar nos testes. Os números podem ser digitados com, ou sem as máscaras de separação.
Testando o Script
Para executar o “script”, basta executar o atalho “F9” ou pressionar o botão “Run”. O formulário será executado, conforme imagem abaixo, desconsiderando as diferenças do “layout”.
Digite o dado a ser validado e pressione o botão “Validar”. Então, deve ser apresentada uma mensagem informando se o dado é válido ou inválido:
Caso o número digitado não seja válido, a mensagem abaixo será mostrada: