Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

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:

  • No labels