Alteração da máscara do get em foco

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Alteração da máscara do get em foco

Mensagem por Netavin »

Boa noite !
Meus amigos, tenho estas linhas que utilizo para saber qual máscara usar na digitação da IE durante o cadastro de clientes. Acredito que daria para otimizar isso e torná-la mais simples e prático. Porém ainda não consegui outra maneira de fazê-lo. Sugestões são muito bem vindas.
... resumindo...

Private vcli_est // Unid da Federação
vcli_mas:=" " // Referente a máscara p/ a IE
vcli_est=space(02) // UF
@ 31,58 GET vcli_est PICT "@!AA" VALID Federa(vcli_est) //verifica se existe a UF digitada

IF vcli_est="AC"
vcli_mas="@R 99.999.999/999-99"
len_ac := 13
ELSEIF vcli_est="AL"
vcli_mas="@R 999999999"
len_al := 9
Endif
... e assim por diante com todos os estados. Então imaginem o tamanho que está com todas as UF´s.
Daria para trabalhar isso e tornar um pouco menor e de maneira que eu aproveitasse nas rotinas de consulta, alteração etc...??

Saudações a todos!

[]´s
Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Acho que do jeito que eu faço é bem prático. Depois de entrar no GET e ter definida a UF, um VALID deste campo, após validar a sigla do Estado, já chama uma função com essa sigla, que me retorna a máscara da IE e altera a picture do campo da IE. Agora o fato de ter muitos IFs é o de menos. Há ocasiões em que isso é inevitável. Ainda assim, tenho uma matriz em que cada elemento, resumidamente, tem uma matriz com dois elementos: a UF e a máscara. Encontrando a UF sei que ela é válida. Aí já pego a máscara e a retorno para a função chamadora.

O ponto chave é botar isso numa função de biblioteca. Facilita o trabalho de compartilhamento do recurso entre as diversas partes do programa.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Manuel Luis Modernel
Usuário Nível 2
Usuário Nível 2
Mensagens: 66
Registrado em: 02 Mar 2008 20:40
Localização: São José do Rio Preto - SP

IF ... ELSEIF muito longo...

Mensagem por Manuel Luis Modernel »

OI Amigo NETAVIN,

Não sei se isto irá te ajudar, mais nos tempos de Clipper Summer 87 eu resolvi casos parecidos criando um banco de dados (.DBF) bem pequeno e sem alterações no tamanho nem no indice.

No teu caso dois campos, a sigla de estado e a mascara em forma de texto.

Dai por diante conforme a sigla irá te dar a Mascara da Inscrição Estadual de cada estado numa rápida pesquisa ao BD (e quem sabe alguma outra informação que vc necessitar do estado, como ser DDD, nome da capital ou até o nome completo dele.

Se servir faça-me saber e faça bom uso !!!
OI Aqui é o Veio Modernel
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Mas o custo de manter código para manipular um DBF que contém apenas aquilo que poderia estar contido em código, seria maior do que o custo de manter isso no próprio código. Ademais, seria mais um DBF para distribuir.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Manuel Luis Modernel
Usuário Nível 2
Usuário Nível 2
Mensagens: 66
Registrado em: 02 Mar 2008 20:40
Localização: São José do Rio Preto - SP

IF ... ELSEIF muito longo...

Mensagem por Manuel Luis Modernel »

Obrigado mestre Maligno, mais uma vez suas curtas e certeiras indicações estão corretas.

Eu usava tb outra saida em casos parecidos, lá vai ela ... era na base do
uso do "Do Case - End Case" que se mal me recordo era mais rápida do que o Else if e consumia menos memoria.

Código: Selecionar todos


func meses
PUBLIC mes,mesnom
mesnom='         '
do case
   case MES=1
        MESNOM='JANEIRO'
   case MES=2
        MESNOM='FEVEREIRO'
   case MES=3
        MESNOM='MARÇO'
   case MES=4
        MESNOM='ABRIL'
   case MES=5
        MESNOM='MAIO'
   case MES=6
        MESNOM='JUNHO'
   case MES=7
        MESNOM='JULHO'
   case MES=8
        MESNOM='AGOSTO'
   case MES=9
        MESNOM='SETEMBRO'
   case MES=10
        MESNOM='OUTUBRO'
   case MES=11
        MESNOM='NOVEMBRO'
   case MES=12
        MESNOM='DEZEMBRO'
endcase
RETURN 0

Nota: Quando VC fala em "Custo" refere-se a que ?? Grana ? Kbytes? ou outra coisa ?
OI Aqui é o Veio Modernel
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Eu me referia ao custo de velocidade (arquivo é mais lento), codificação (pesquisa), etc. Mas não penso no custo em tamanho, já que atualmente memória não é problema.

Com relação ao CASE/ENDCASE, não sei se é mais rápido ou não. Só sei que, mesmo sendo mais rápido que o IF/ENDIF, na imensa maioria das vezes essa diferença não importa, já que hoje em dia as máquina são muito rápidas. Opto pelo IF/ENDIF porque estou mais habituado a essa estrutura.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Netavin, veja um exemplo:

Código: Selecionar todos

LOCAL GetList := {}
cls
PRIV aUF:={}
AADD(aUF,{"AC","@R 99.99.9999-9"})
AADD(aUF,{"AM-GO-PB-RN","@R 99.999.999-9"})
AADD(aUF,{"AL-AP-MA-MS-PI-RO-ES","999999999"})
AADD(aUF,{"BA","@R 999999-99"})
AADD(aUF,{"CE-RR-SE","@R 99999999-9"})
AADD(aUF,{"DF","@R 999.99999.999-99"})
AADD(aUF,{"MT","@R 9999999999-9"})
AADD(aUF,{"MG","@R 999.999.999/9999"})
AADD(aUF,{"PA","@R 99-999999-9"})
AADD(aUF,{"PE","@R 99.9.999.9999999-9"})
AADD(aUF,{"PR","@R 999.99999-99"})
AADD(aUF,{"RJ","@R 99.999.99-9"})
AADD(aUF,{"RS","@R 999/999999-9"})
AADD(aUF,{"SC","@R 999.999.999"})
AADD(aUF,{"SP","@R 999.999.999.999"})
AADD(aUF,{"TO","@R 99.99.999999-9"})

cEstado:=SPAC(2)
v_pic:=cIE:=SPACE(14)
@ 10,10 SAY "Sigla do Estado..:" GET cEstado PICT "@!" VALID (ASCAN(aUF,{|e| cEstado $ e[1]})>0)
@ 12,10 SAY "Insc.Estadual....:" GET cIE PICT (v_pic) WHEN { |oGet| TROCA_PIC(oGet,cEstado) }
READ

RETU

FUNC TROCA_PIC(oGet,v_uf)
Local vOp
vOp:=ASCAN(aUF,{|e| v_uf $ e[1]})
oGet:picture :=aUF[vOp,2]
retu .T. 
Obs.: verifique se todas as mascaras estão corretas.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Mensagem por Netavin »

Bom a todos! ...
Caro colega Toledo. É um prazer "falar" com o mestre! :{

Fiz algumas alterações em algumas máscaras, baseado na Ficha Cadastral que imprimi através do Site do SINTEGRA, no qual me embasei para fazer as máscaras que utilizo.
Funcionou quase que perfeitamente. Ou seja, em qualquer UF que utilizo, o campo do get se mostra com 14 posições. Isso pode deixar o usuário em dúvida. Ele poderá pensar que precisa preencher todo o espaço.
Na rotina que utilizo, faz-se esta verificação e mostra apenas os espaços que serão utilizados para o preenchimento.
O que poderia ser alterado para satisfazer essa condição ?

[]´s

Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

A solução pra isso não é maravilhosa, mas deve resolver.

Código: Selecionar todos

function TROCA_PIC(oGet,v_uf) 
local vOp 
vOp := AScan(aUF,{|e|v_uf $ e[1]}) 
oGet:picture := aUF[vOp][2] 
*
cIE := Space(Len(aUF[vOp][2])-3)
@ 12,29 say Space(18)
*
return .T.
A variável cIE passa a ter o tamanho da máscara selecionada e a posição da IE é limpa com tantos espaços quanto a maior IE existente. Olhei rapidamente, mas deve ser a de Pernambuco. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Netavin, verifique qual é a mascara de menor tamanho e altere o valor da linha abaixo:

Código: Selecionar todos

v_pic:=cIE:=SPACE(9)
O tamanho das variáveis acima antes era 14, mudei para 9, pois acho que será o menor.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Mensagem por Netavin »

Olá malígno!
Aproveito para mostrar as máscaras corretas, de acordo com os cadastros do Sintegra.

Código: Selecionar todos

AADD(aUF,{"AC","@R 99.999.999/999-99"})
AADD(aUF,{"AL-AP-MA-PI","999999999"})
AADD(aUF,{"AM-GO-MT","@R 99.999.999-9"})
AADD(aUF,{"BA","@R 999999-99"})
AADD(aUF,{"CE-PB-SE","@R 99999999-9"})
AADD(aUF,{"DF","@R 99.999999.999-99"})
AADD(aUF,{"ES","@R 999.999.99-9"})
AADD(aUF,{"MG","@R 999.999.999/9999"})
AADD(aUF,{"MS","@R 9999999999-9"})
AADD(aUF,{"PA","@R 99.999999-9"})
AADD(aUF,{"PE","@R 99.9.999.9999999-9"})
AADD(aUF,{"PR","@R 99999999-99"})
AADD(aUF,{"RJ","@R 99.999.99-9"})
AADD(aUF,{"RN","@R 99.999.999-9"})
AADD(aUF,{"RO","@R 9999999999999-9"})
AADD(aUF,{"RR","@R 99.999.999-9"})
AADD(aUF,{"RS","@R 999/9999999"})
AADD(aUF,{"SC","@R 999.999.999"})
AADD(aUF,{"SP","@R 999.999.999.999"})
AADD(aUF,{"TO","@R 99.99.999999-9"})
Vou testar o que vc passou.

[]´s

Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Toledo escreveu:O tamanho das variáveis acima antes era 14, mudei para 9, pois acho que será o menor.
Mudar para o menor tamanho resolve até metade do caminho, Toledo. O problema é que se ele for pra PE, a largura muda pra 18. Se em seguida for pra AL, muda pra 9. Mas fica o "lixo" no fim do campo. Por isso precisa ser alterado o tamanho da variável na função que obtém a máscara. E precisa também limpar esse "lixo". Por isso que eu comentei que não é uma solução maravilhosa, pois o GETSYS não tem limpeza parcial de campo. Isso deve ser feito manualmente, o que "trava" a coisa pra ser reaproveitada em outros pontos do programa. Vai ter de fazer uma "gambiarra" pra ajustar isso. :)))
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Alcir
Usuário Nível 1
Usuário Nível 1
Mensagens: 34
Registrado em: 17 Abr 2008 10:57
Localização: sao paulo

Re: IF ... ELSEIF muito longo...

Mensagem por Alcir »

Manuel Luis Modernel escreveu:OI Amigo NETAVIN,

Não sei se isto irá te ajudar, mais nos tempos de Clipper Summer 87 eu resolvi casos parecidos criando um banco de dados (.DBF) bem pequeno e sem alterações no tamanho nem no indice.

No teu caso dois campos, a sigla de estado e a mascara em forma de texto.

Dai por diante conforme a sigla irá te dar a Mascara da Inscrição Estadual de cada estado numa rápida pesquisa ao BD (e quem sabe alguma outra informação que vc necessitar do estado, como ser DDD, nome da capital ou até o nome completo dele.

Se servir faça-me saber e faça bom uso !!!
Na minha opnião, acho que guardar em DBF seria menos trabalhoso e mais facil de alterar, caso precise. Evita compilar e tals.

Mas, foi uma aula do Toledo e demais, Abraços
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Mensagem por Netavin »

... Toledo.
De fato o malígno tem razão. Sobra "lixo" da informação anterior.

Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Mensagem por Netavin »

...Caro Manoel.
Não testei sua idéia ainda. Porém prejulgo que este acesso a outro banco de dados implicaria em mais tempo de pesquisa. Concorda?

[]´s

Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Responder