Página 1 de 2
Alteração da máscara do get em foco
Enviado: 25 Abr 2008 20:22
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
Enviado: 25 Abr 2008 21:01
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.
IF ... ELSEIF muito longo...
Enviado: 25 Abr 2008 23:23
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 !!!
Enviado: 25 Abr 2008 23:32
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.
IF ... ELSEIF muito longo...
Enviado: 26 Abr 2008 00:28
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 ?
Enviado: 26 Abr 2008 01:45
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.
Enviado: 26 Abr 2008 02:15
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,
Enviado: 26 Abr 2008 09:53
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
Enviado: 26 Abr 2008 10:19
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.

Enviado: 26 Abr 2008 10:27
por Toledo
Netavin, verifique qual é a mascara de menor tamanho e altere o valor da linha abaixo:
O tamanho das variáveis acima antes era 14, mudei para 9, pois acho que será o menor.
Abraços,
Enviado: 26 Abr 2008 10:27
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
Enviado: 26 Abr 2008 10:36
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.

))
Re: IF ... ELSEIF muito longo...
Enviado: 26 Abr 2008 10:50
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
Enviado: 26 Abr 2008 11:22
por Netavin
... Toledo.
De fato o malígno tem razão. Sobra "lixo" da informação anterior.
Netavin
Enviado: 26 Abr 2008 11:25
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