27 outubro 2011

Formatar CPF/CNPJ direto no Firebird via SP

O exemplo abaixo cria uma Stored Procedure no Firebird para retornar CPF ou CNPJ formatados com pontuação. Você passa como parâmetro somente os numeros do documento. Enjoy!



create or alter procedure FORMATA_CPFCNPJ (
    INCPFCNPJ varchar(14))
returns (
    RESULTADO varchar(18))
as
begin
  /* Formata CPF ou CNPJ de somente números para números e pontuação
     Nilcemar P. Ferreira - http://nilcemar.blogspot.com - nilcemar@gmail.com - 10/2011*/

  if (char_length(:incpfcnpj)=11) then  --CPF
  begin
      resultado = Substring( :inCPFCNPJ from 1 for 3 ) || '.' || Substring( :inCPFCNPJ from 4 for 3 ) || '.' ||
                  Substring( :inCPFCNPJ from 7 for 3 ) || '-' || Substring( inCPFCNPJ from 10 for 2 );
  end
  else
  if (char_length(:incpfcnpj)=14) then  --CNPJ  17.605.320/0001-78
  begin
      resultado = Substring( :inCPFCNPJ from 1 for 2 ) || '.' || Substring( :inCPFCNPJ from 3 for 3 ) || '.' ||
                  Substring( :inCPFCNPJ from 6 for 3 ) || '/' ||
                  Substring( :inCPFCNPJ from 9 for 4 ) || '-' || Substring( inCPFCNPJ from 13 for 2 );
  end

  suspend;
end^

SET TERM ; ^

COMMENT ON PARAMETER FORMATA_CPFCNPJ.INCPFCNPJ IS
'Numero do CPF ou CNPJ sem pontuação';



Esta procedure é selecionável por causa da cláusula SUSPEND. Se quiser torná-la executável, elimine esta cláusula.

2 comentários:

  1. Como usar esta procedure. Pretendo só guardar o numero do documento sem formatação e exibir para o usuário já formatado.

    ResponderExcluir
  2. Nesse caso, você pode colocar na propriedade "DisplayFormat" no seu código (no caso Delphi) ou fazer uma função que é chamada no onExit que verifica e muda o displayformat de acordo com o tamanho do campo.

    Eu uso no exemplo abaixo a função somentenumerosnastring, postada no blog

    Ex:

    procedure MudaFormatoCPFCNPJ(Campo: TField);
    begin
    if Length(Trim(SomenteNumerosNaString(Campo.AsString)))=11 then //cpf
    Campo.DisplayFormat:= '000.000.000-00'
    else
    if Length(Trim(SomenteNumerosNaString(Campo.AsString)))=14 then //cnpj
    Campo.DisplayFormat:= '00.000.000/0000-00';

    end;


    //No evento onExit do campo, chame a procedure

    MudaFormatoCPFCNPJ(Tabela.FieldByName('nomedocampo'));

    Pronto.

    ResponderExcluir