Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Posting on Qlik Community is temporarily paused for some users. Thank you for patience and we'll update you soon!
cancel
Showing results for 
Search instead for 
Did you mean: 
aderlanrm
Partner - Specialist
Partner - Specialist

Formatar Números (CPF, CNPJ, CEP, Telefone e Celular 9 digitos)

Olá pessoal,

 

<< versão nova 12/01/17 >>

 

Há muitas dúvidas na comunidade sobre formatação de números.

 

Realmente é algo que nos faz falta, entre tantas centenas de funções, ter uma que nos permita definir uma máscara personalizada e o número ser formatado adequadamente, então, inspirado pelo documento que fiz a um tempo atrás (Exportar para TXT (Sem Rótulos - No Labels)), resolvi criar uma outra rotina para formatação de números.

 

Para quem usa Personal Edition, segue script:

///$tab SUB

SUB FormataNumero(Tabela,Campo,Máscara)

 

             //**************************************************************\\

            //                 Curitiba, 11 de janeiro de 2017                  \\

           //                Desenvolvido por Aderlan Rodrigues                    \\

          //                                                                    \\

         //                                VERSÃO 1.2                                  \\

        //                                                                          \\

       // Permitido "Números", ".", "-", "/", "(", ")" e "+" na primeira posição,  \\

      //  outros caracteres devem ser evitados ou tratados adequadamente na rotina. \\

     //      O campo ID é ncessário para evitar multiplicação da linha no JOIN             \\

    //********************************************************************************\\

 

    TRACE ## Aplicar máscara "$(Máscara)" no campo [$(Campo)] da tabela [$(Tabela)];

 

    If Mid('$(Máscara)',1,1) = '0' THEN

        LET vDigito = 1; // Começa em 1 (um) para uso na correta posição dos números

        LET vMids = 'Mid([$(Campo) Preenchido],1,1)'; // Inicializa o primeiro dígito quando numérico, para montagem dos comando que será usado no LOAD

    ELSE

        LET vDigito = 0; // Começa em 0 (zero) para uso na correta posição dos números

        LET vMids = 'Mid('&Chr(39)&'$(Máscara)'&Chr(39)&',1,1)'; // Inicializa o primeiro dígito quando textual, para montagem dos comando que será usado no LOAD

    ENDIF

 

    FOR vPosição = 2 to Len('$(Máscara)') // Percorre os caracteres da máscara para fazer a distribuição dos números abaixo

 

        SWITCH Mid('$(Máscara)',$(vPosição),1)

            CASE '0'

                 LET vDigito = $(vDigito)+1;

                LET vMids = '$(vMids)&'&Chr(13)&

                     'Mid([$(Campo) Preenchido],'&$(vDigito)&',1)';

            CASE '.'

                LET vMids = '$(vMids)&'&

                    Chr(39)&'.'&Chr(39);

            CASE '-'

                LET vMids = '$(vMids)&'&

                    Chr(39)&'-'&Chr(39);

            CASE '/'

                LET vMids = '$(vMids)&'&

                    Chr(39)&'/'&Chr(39);

            CASE '(' // O primeiro é tratado do IF, os demais são tratados aqui, caso a máscara inicie com "+", por exemplo

                LET vMids = '$(vMids)&'&

                    Chr(39)&'('&Chr(39);

            CASE ')'

                LET vMids = '$(vMids)&'&

                    Chr(39)&')'&Chr(39);

            CASE ' '

                LET vMids = '$(vMids)&'&

                    Chr(39)&' '&Chr(39);

        ENDSWITCH

 

    NEXT

 

    Left Join ([$(Tabela)]) // Inclui o campo formatado a tabela de origem

    LOAD Distinct [$(Campo)],

        Dual($(vMids),[$(Campo)]) as [$(Campo) Formatado]; // Usada a função DUAL para manter a ordenação numérica após a máscara

    LOAD Distinct [$(Campo)],

        Repeat(0,SubStringCount('$(Máscara)','0')-Len([$(Campo)]))&[$(Campo)] as [$(Campo) Preenchido] // Preenche com zeros pela definição da máscara

    Resident [$(Tabela)]

    //Where IsNull([$(Campo)]);

    Where Len([$(Campo)])>0; // Na versão que foi desenvolvido a função IsNull não estava funcionando, alternativamente, foi feito dessa forma

 

    DROP Field [$(Campo)];

    RENAME Field [$(Campo) Formatado] to [$(Campo)];

 

    LET vPosição = ;

    LET vDigito = ;

    LET vMids = ;

 

END SUB

///$tab Exemplo de Uso

// Dados aleatórios para demonstração

Pessoas:

LOAD Num(Right(PurgeChar(Rand(),'.,'),11)) as CPF,

    'Fulano '&RecNo() as Nome,

    Num(Right(PurgeChar(Rand(),'.,'),11)) as Celular,

    KeepChar('() 9875-3200','0123456789') as Texto // O campo deve ser tratado, para manter apenas os número, antes da chamada da função

AutoGenerate Ceil(Rand()*1000);

 

Empresas:

LOAD Num(Right(PurgeChar(Rand(),'.,'),14)) as CNPJ,

    'Empresa '&RecNo() as [Razão Social],

    Num(Right(PurgeChar(Rand(),'.,'),8)) as CEP,

    Num(Right(PurgeChar(Rand(),'.,'),8)) as Telefone

AutoGenerate Ceil(Rand()*100);

 

Concatenate (Pessoas) // Simulação de valores nulos

LOAD * Inline [

    Código, CPF, Nome, Celular, Texto

    99, , Nulo 1, ,

    98, , Nulo 2, ,

    97, , Nulo 3, ,

];

 

CALL FormataNumero('Pessoas','CPF','000.000.000-00');

CALL FormataNumero('Pessoas','Celular','(00) 0 0000-0000');

CALL FormataNumero('Pessoas','Texto','(00) 0 0000-0000');

 

CALL FormataNumero('Empresas','CNPJ','00.000.000/0000-00');

CALL FormataNumero('Empresas','CEP','00.000-000');

CALL FormataNumero('Empresas','Telefone','+00 (00) 0000-0000');

Aderlan Rodrigues
Analista, Arquiteto de Dadose e Desenvolvedor
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
14 Replies
TiagoCardoso
Creator II
Creator II

Excelente.

Vai me ajudar bastante, não só a mim como a todos da comunidade.

Obrigado e parabéns, aderlanrm‌.

alessandro_hadd
Contributor II
Contributor II

Muito boa idéia Aderlan. Show.

aderlanrm
Partner - Specialist
Partner - Specialist
Author

Valeu Alessandro, obrigado pela classificação!

Aderlan Rodrigues
Analista, Arquiteto de Dadose e Desenvolvedor
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
welintonreis
Contributor III
Contributor III

Valeu aderlanrm!!! Parabéns!!!

Anonymous
Not applicable

Preciso de uma ajuda com a formatação.
A rotina para formatação de números, criada pelo ADERLAN, funciona perfeitamente quando eu tenho os valores de CPF e de CNPJ separados por campos.

A minha dúvida é quando os valores de CPF e de CNPJ estão no mesmo campo e de que forma eu posso criar uma função CALL para formatar o numero com 11 dígitos como CPF e número com 14 dígitos como CNPJ?
Grato desde já!

aderlanrm
Partner - Specialist
Partner - Specialist
Author

Olá Edson, tudo bem?

Até pensei em fazer isso na função, mas por boa prática, é melhor separar os campos mesmo, ficando separados no modelo.

Pensando no usuário final, na aplicação, facilita para criar análises com CPF e com CNPJ, também sendo útil nas buscas, melhorando o entendimento do modelo.

Sendo assim, recomendo fazer a carga dos campos e a formatação em campos separados ou fazer adaptação na função para formatar corretamente dependendo da quantidade de caracteres.

Abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dadose e Desenvolvedor
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
Anonymous
Not applicable

Grato pela resposta Aderlan!

conforme a sua exposição, eu terei que fazer uma adaptação porque os registros de  CPF e de CNPJ estão no mesmo campo.

Abraço Edson

aderlanrm
Partner - Specialist
Partner - Specialist
Author

Se separar os campos, não precisa adaptar.

No LOAD faça algo assim:

Load RazaoSocial,

     If(Len(Doc)<=11,Doc) as CPF,

     If(Len(Doc)>11,Doc) as CNPJ,

     ...

Assim você terá os dois campos na memória, podendo inclusive usa-los como indicadores.

Count(CPF)

Count(CNPJ)

Abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dadose e Desenvolvedor
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
dhsilva7
Contributor III
Contributor III

Muito bom cara!!! Será de muita valia essas informações... Parabéns!!!

Abs,