Página 2 de 2

Enviado: 26 Abr 2008 11:42
por Toledo
Maligno, geralmente antes de iniciar os GETs sempre iniciamos o conteúdo das variáveis que serão utilizadas (ou limpamos o que foi digitado antes), então basta sempre declarar v_pic:=cIE:=SPACE(9).

O único problema é se o usuário digitar uma determinada sigla do estado e depois de ir para o campo da Insc.Estadual, voltar para o campo de UF e digitar uma outra sigla que o tamanho da IE será menor, ai vai ficar o "lixo".

Agora, no seu exemplo isto não vai acontecer, mas o amigo Netavin tera que colocar a picture @R em todas as mascaras, mesmo que não seja usado nenhum caracter especial na mascara, como é o caso das siglas "AL-AP-MA-PI".

Abraços,

Enviado: 26 Abr 2008 12:00
por Pablo César
Para resolver estar questão, de não guardar lixo, após retorno do GET e for diferente UF. Eu aconselharia fazer uma GET aninhado com tamanho irregular conforme cada sigla.

A questão de usar um DBF para seleção de UF, seria válido sempre e quando haja mudanças previstas nas UFs. Mas como não é o caso, esse procedimento que o Toledo e Maligno indicou ora seja de definir no próprio código-fonte, seja através de MATRIZ (que na minha opinião, é a forma mais ágil de pesquisa), ora porque trata-se de poucos itens. Mas se por outro lado, temos outra situação em que os dados para validação são variáveis, isto é, que necessite de manutenção de cadastro, daí eu sou a favor de fazer essa consulta por DBF mesmo.

Obs.: Mas puxa vida ! O Toledo anda afiado na exemplificação em suas indicações, ainda bem que podemos contar com colegas que realmente participam no fórum. As vezes parece coisa boba, mas que fazem uma contribuição considerável para outros casos também.

Enviado: 26 Abr 2008 12:22
por Maligno
Agora, no seu exemplo isto não vai acontecer, mas o amigo Netavin tera que colocar a picture @R em todas as mascaras, mesmo que não seja usado nenhum caracter especial na mascara, como é o caso das siglas "AL-AP-MA-PI".
Mas inserir o "@R" é o menor dos problemas, já que o efeito é o mesmo.
Agora, se o colega não quiser fazer isso, é só usar um AT() procurando pelo "@R". Eu não faria isso. Não compensa.

Enviado: 26 Abr 2008 12:39
por Netavin
... tudo bem pessoal. Deu certinho!!
Só uma consideração a fazer: malígno, de fato o espaço no "@ say" dever ser mesmo de 18. Porém nas variáveis v_pic e cIE deverá ser a menor ou seja 8 (Bahia).
Um agradecimento a todos que contribuíram para o post inicial.
Mesmo sabendo que alguns colegas são craques no assunto, devo dizer e preciso, que mesmo assim é um aprendizado ou uma recapitulação para todos.

Muito agradecido !!!

Netavin.

[]´s

Enviado: 26 Abr 2008 12:50
por Maligno
No teste que fiz deu tudo absolutamente certo daquele jeito que exemplifiquei. Mas se do jeito que fez resolveu, ótimo. :)

IF ... ELSEIF muito longo...

Enviado: 26 Abr 2008 18:53
por Manuel Luis Modernel
Oi NETAVIN,

Mais uma vez deixo claro que não sou programador profissional, simplesmente um curioso bastante dedicado, dai só me importava com o fato de conseguir obter do computador a resposta que eu necessitava na hora.

Dai minhas soluções nunca foram muito técnicas, tão somente me davam o que eu queria sem me importar como, quando os 640 kb do DOS se esgotavam, ai que eu ia tentar algo mais "trabalhoso" hihihi .

Nos últimos meses depois que conheçi este Forum, lamentei muito nunca antes ter encontrado pessoas como aqui tem, dai eu nunca teria parado de programar em Clipper.

Obrigado pela atenção de todos

Enviado: 26 Abr 2008 19:12
por Maligno
lamentei muito nunca antes ter encontrado pessoas como aqui tem
A vida é um restaurante com um cardápio infinito de conhecimentos. Você pode escolher o que for que lhe poporcione prazer, a qualquer tempo, em qualquer idade. E o melhor: é tudo grátis. :)

Enviado: 26 Abr 2008 19:43
por Netavin
Caro amigo Manuel.. Tem minha admiração e meu respeito por isto.
A minha situação não é muito diferente da sua.
Iniciei no DBaseII, III, Summer e Clipper5. Tal como vc, fiquei muitos anos sem estudar/praticar a programação. Só me interessei em retornar porque encontrei este Fórum com estas pessoas maravilhosas que se dedicam a programação Clipper e em ajudar os quém tem interesse em aprender.

Forte abraço!

Netavin.

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

Enviado: 29 Mar 2009 22:29
por alaminojunior
Boa noite, estou tentando implementar a solução objeto deste tópico, em um programa em xHarbour, mas está retornando o seguinte:
Imagem

Eu apenas troquei os nomes das variáveis de UF e IE para as que eu utilizo.
Basicamente, antes de iniciar a minha função de notas de entrada, eu declaro aquela matriz com as UF´s e PICT´s e em seguida retorno para a entrada das notas, e quando chegar nos get´s de UF e IE, deveria entrar em ação a solução proposta, mas retorna o erro exibido aí em cima.
Se eu linkar apenas a função de ajuste de pict´s, do jeito que foi proposto, funciona ok, mas implementado na minha função, não vai.
Peço a ajuda dos colegas, pois em matéria de matrizes eu sou uma negação.

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

Enviado: 30 Mar 2009 09:44
por Pablo César
Alamino, assim sem ver seu código fica dificil. Mas tudo leva a crer que é problemas de acesso ao seu vetor ou matriz. Você deve estar tentanto acessar um elemento que não existe, isto é, você está pedindo para acessar um número de elemento maior do que o tamanho em si pode ter aquele(a) vetor/matriz. O seu limite, você deve obter através do uso do LEN() e trabalhar dentro desse parâmetro. Tente utiliza o debug, que irá ajudar a você entender a estrutura que você utilizou para esse(a) vetor/matriz. Não tem nada melhor que você pegar a matriz e ver como ela está dimensionada e ver até o conteúdo de cada elemento.

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

Enviado: 30 Mar 2009 10:38
por alaminojunior
Bão,...... o código é este:

Código: Selecionar todos

Publ getlist:= {}
PUBL aUF:={}
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"})
   set colo to n/w*,b/rb*,,,n/w*
   @ 03,12 get xdata
   @ 03,31 get xnum pict "@ZE 999999"
   @ 03,44 get xcfop pict "@ZE 9999" // valid chk_cfop(@xcfop)
   @ 05,12 say xcnpje color "b/w*" 
   @ 05,38 say xiee color "b/w*" 
   @ 05,65 get xdtemi 
   @ 07,12 get xdtsai
   @ 07,33 get xcodi pict "@E 999999"
   @ 09,12 get xcnpjfor pict "@E 99999999999999"
   @ 09,33 get xuf pict "@!" VALID (ASCAN(aUF,{|e| xuf $ e[1]})>0)   
   @ 09,46 get xiefor picture (v_pic) WHEN { |oGet| TROCA_PIC(oGet,xiefor) }
   @ 11,12 get xende pict "@!"
   @ 11,69 get xcep pict "@R 99999-999"
   @ 13,12 get xmuni pict "@!"
   @ 13,60 get xhor pict "@ 99:99:99"
   @ 15,06 get xfrt pict "@E 9,999.99"
   @ 15,22 get xbase pict "@E 9,999.99"
   @ 15,38 get xicm pict "@E 9,999.99"
   @ 15,54 get xbasst pict "@E 9,999.99"
   @ 15,70 get xicmsst pict "@E 9,999.99"
   @ 17,06 get xdesc pict "@E 9,999.99"
   @ 17,22 get xacr pict "@E 9,999.99"
   @ 17,38 get xtotpro pict "@E 9,999.99"
   @ 17,54 get xseg pict "@E 9,999.99"
   @ 17,70 get xipi pict "@E 9,999.99"
   @ 19,12 get xtot pict "@E 99,999.99"
   @ 19,30 get xtran pict "@!"
   @ 21,12 get xtrcid pict "@!"
   @ 21,51 get xtrplc pict "@!"
   @ 21,64 get xtruf pict "@!" VALID (ASCAN(aUF,{|e| xtruf $ e[1]})>0)
   @ 23,12 get xtrcnpj pict "@ 99999999999999"
   @ 23,31 get xtrie picture (v_pic) WHEN { |oGet| TROCA_PIC(oGet,xtrie) }
   @ 25,12 get xtrend pict "@!"
   set curs on
   read
   set curs off

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.
Mas como eu disse, se isolar do jeito que foi proposto, nos post´s anteriores, funciona, e usando desta maneira na minha lista de get´s, não funciona.

Em tempo: estou tentando usar em xHarbour, portanto se algum moderador quiser mover o tópico, fique à vontade.

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

Enviado: 30 Mar 2009 11:11
por Pablo César
Em tempo: estou tentando usar em xHarbour, portanto se algum moderador quiser mover o tópico, fique à vontade.
Vamos fazer de conta que você está fazendo em Clipper... hihihi Na minha opinião, o código aplica-se tanto em Clipper como xHarbour. Tanto faz.

Eu isolei alguma parte do seu código para poder executá-lo e criei algumas variáveis, pois faltavam. Debuguei, como eu tinha te indicado e encontrei uma falha, veja nesta tela captura que fala por si:
Imagem

Melhor seria você postar as variáveis para ter ver se é o mesmo erro que eu encontrei. Pois inicialmente se a variável é vazia, você deveria tratar para que não busque ou não proceda com a localização do elemento da matriz. Esse "ponteiro" que aparece em criculo da linha 74 está valendo zero e não existe zero elemento. Demais não sei se tem outro erro. Posso verificar depois, mas veja se resolveu.

Agora eu adicionei aquele tratamento que mencionei, e executei, mas não vejo erro. Só que o código ficou assim:

Código: Selecionar todos

Publ getlist:= {}
PUBL aUF:={}
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"})

xuf    := "PR"
v_pic  := "!!"
xiefor := SPACE(18)
xtrie  := SPACE(18)
set colo to n/w*,b/rb*,,,n/w*

/*
@ 03,12 get xdata
@ 03,31 get xnum pict "@ZE 999999"
@ 03,44 get xcfop pict "@ZE 9999" // valid chk_cfop(@xcfop)
@ 05,12 say xcnpje color "b/w*"
@ 05,38 say xiee color "b/w*"
@ 05,65 get xdtemi
@ 07,12 get xdtsai
@ 07,33 get xcodi pict "@E 999999"
@ 09,12 get xcnpjfor pict "@E 99999999999999"
@ 09,33 get xuf pict "@!" VALID (ASCAN(aUF,{|e| xuf $ e[1]})>0)
*/
@ 09,46 get xiefor picture (v_pic) WHEN { |oGet| TROCA_PIC(oGet,xuf) }
@ 23,31 get xtrie picture (v_pic) WHEN { |oGet| TROCA_PIC(oGet,xtrie) }
/*
@ 11,12 get xende pict "@!"
@ 11,69 get xcep pict "@R 99999-999"
@ 13,12 get xmuni pict "@!"
@ 13,60 get xhor pict "@ 99:99:99"
@ 15,06 get xfrt pict "@E 9,999.99"
@ 15,22 get xbase pict "@E 9,999.99"
@ 15,38 get xicm pict "@E 9,999.99"
@ 15,54 get xbasst pict "@E 9,999.99"
@ 15,70 get xicmsst pict "@E 9,999.99"
@ 17,06 get xdesc pict "@E 9,999.99"
@ 17,22 get xacr pict "@E 9,999.99"
@ 17,38 get xtotpro pict "@E 9,999.99"
@ 17,54 get xseg pict "@E 9,999.99"
@ 17,70 get xipi pict "@E 9,999.99"
@ 19,12 get xtot pict "@E 99,999.99"
@ 19,30 get xtran pict "@!"
@ 21,12 get xtrcid pict "@!"
@ 21,51 get xtrplc pict "@!"
@ 21,64 get xtruf pict "@!" VALID (ASCAN(aUF,{|e| xtruf $ e[1]})>0)
@ 23,12 get xtrcnpj pict "@ 99999999999999"
@ 23,31 get xtrie picture (v_pic) WHEN { |oGet| TROCA_PIC(oGet,xtrie) }
@ 25,12 get xtrend pict "@!"
*/
set curs on
read
set curs off

function TROCA_PIC(oGet,v_uf)
local vOp
IF v_uf="  "
   vOp := 1
ELSE
   vOp := AScan(aUF,{|e|v_uf $ e[1]})
ENDIF
oGet:picture := aUF[vOp][2]
cIE := Space(Len(aUF[vOp][2])-3)
@ 12,29 say Space(18)
return .T.

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

Enviado: 30 Mar 2009 13:50
por alaminojunior
Achei a besteira que eu tava fazendo.
Em:

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.
Eu estava atribuindo para v_uf a IE. :%
Para esta rotina de inclusão ficar melhor, falta eu colocar a checagem da IE e fazer o mesmo processo com o CNPJ. Daí vai ficar o "sací empinando a bicicleta".

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

Enviado: 30 Mar 2009 13:56
por Pablo César
Era por aí... e a exceção do UF em branco não será necessária pois no proprio get está validando e não deixará passar quando for vazio. Era por aí. Sempre é bom debugar...