Página 1 de 3

Problema com Get e comando VALID

Enviado: 13 Abr 2007 09:34
por pjtb
Bom dia a todos!!!

Estou fazendo um programa usando um DBU, com opções para fazer INCLUSÃO E ALTERAÇÃO.

Minha rotina é a seguine:
Essa Tela é de INCLUSÃO

6,10 get vdata1 pict "99/99/99"
7,10 get vdata2 pict "99/99/99" VALID FUNPRAZO()
8,10 get vdata3 pict "99/99/99"
9,10 get vdata4 pict "99/99/99"
read

Eu estou querendo usa o VALID para o programa executar essa fotina e retorna ao proximo Get + sempre da erro.

A FUNPRAZO é uma rotina para mostrar no proximo campo o seguinte:
vdata3=vdata2+15
8,10 say vdata3 pict "99/99/99"

E continuar digitando os proximos GEtS.

Enviado: 13 Abr 2007 09:50
por Pablo César
pjtb, veja assim se resolve pra você:

Código: Selecionar todos

CLS
SET CONFIRM ON
SET DATE TO BRITISH
SET CENTURY OFF

vdata1:=DATE()
vdata2:=DATE()
vdata3:=DATE()
vdata4:=DATE()

@ 06,10 get vdata1 pict "@D"
@ 07,10 get vdata2 pict "@D"
@ 08,10 get vdata3 pict "@D" WHEN FUNPRAZO(vdata2)
@ 09,10 get vdata4 pict "@D"
read 

FUNCTION FUNPRAZO(VDTA)
IF !EMPTY(VDTA)
   KEYBOARD DTOC(VDTA+15)+CHR(1)
ENDIF
RETURN .T.
Um clip-abraço :)Pos

Enviado: 13 Abr 2007 10:08
por Maligno
Melhor que usar o comando Keyboard seria manipular a lista Get. Há vários exemplos disso no fórum.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 13 Abr 2007 10:14
por Pablo César
É a minha idéia é como acostumo dizer... KAMIKAZE... hehehe :D

Essa manipulação que você se refere poderia ser no GETSYS ?

Enviado: 13 Abr 2007 11:02
por Maligno
É a minha idéia é como acostumo dizer... KAMIKAZE... hehehe :D
Sem falar que usando o buffer do teclado pode dar uma encrespada, dependendo do que tiver sido digitado antes.
Essa manipulação que você se refere poderia ser no GETSYS ?
Sim. E até seria aconselhável montar um comando só pra modificar campos "on-the-fly". Isso às vezes é necessário. Meu getsys também é modificado. Particularmente, eu faria algo do tipo modGet "CPO1" var "texto" color 23, onde o campo chamado "CPO1" teria seu conteúdo modificado para "texto" e sua cor modificada para 23. É só um exemplo. Tem mais coisas.
Já modifiquei tanto o interior do Clipper que às vezes eu não sei mais reponder nada a respeito de coisas básicas. Por isso nem coloquei um exemplo de código pro colega. Já esqueci um monte de coisa. :)))
Se você me perguntar algo básico sobre TBrowse(), por exemplo, não vou saber te responder. Meu TBrowse é todo modificado e muito mais fácil de usar. Já até usei esse básico um dia. Mas só pra fazer meu sub-sistema. Depois, com o tempo, esqueci quase tudo.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 14 Abr 2007 11:54
por gvc
Poste aqui a sua função FUNPRAZO() .

Enviado: 14 Abr 2007 13:41
por sygecom
Gvc, de uma olhada com calma que vc acha o Pablo postou !!!

Abraços

Enviado: 14 Abr 2007 13:42
por Pablo César
Mas pjtb, funcionou ou não funcionou ?

Enviado: 14 Abr 2007 16:31
por gvc
sygecom:
O que o Pablo postou não é o que o pjtb fez no seu sistema. :?

pjtb:
Poste a função para poder-mos verificar o funcionamento. Vc falou que estava dando erro nela. :P

Enviado: 14 Abr 2007 17:12
por Pablo César
Bem vou postar outra forma, talvez um pouco menos arriscada que aquele que postei, pelo ponto de vista que o MALIGNO apresentou (ele tem razão) este não era a forma mais apropriada:

Código: Selecionar todos

CLS 
SET CONFIRM ON 
SET DATE TO BRITISH 
SET CENTURY OFF 

vdata1:=DATE() 
vdata2:=DATE() 
vdata3:=DATE() 
vdata4:=DATE() 

@ 06,10 get vdata1 pict "@D" WHEN FUNPRAZO(vdata1,2)
@ 07,10 get vdata2 pict "@D" WHEN FUNPRAZO(vdata2,3)
@ 08,10 get vdata3 pict "@D" WHEN FUNPRAZO(vdata3,4)
@ 09,10 get vdata4 pict "@D" 
read 

FUNCTION FUNPRAZO(VDTA,VQUAL)
IF !EMPTY(VDTA) 
   // KEYBOARD DTOC(VDTA+15)+CHR(1)
   DO CASE
      CASE VQUAL=2
           VDATA2:=VDTA+15
      CASE VQUAL=3
           VDATA3:=VDTA+15
      CASE VQUAL=4
           VDATA4:=VDTA+15
   ENDCASE
ENDIF 
RETURN .T.
E aclaro ainda mais, que esta outra, também não é a forma mais "acadêmica" de se fazer essa atribuição. A melhor idéia seria atribuir´direto do próprio objeto:GET, não é mesmo ?. Mas deixei isso para aqueles que tem maior intimidade com o objeto... (heheh parece até gozação... hehehe).

As duas soluções que apresentei, fucnionam porque eu mesmo testei antes de postar-las. Sintam-se a vontade, se alguém achou outra forma de fazé-lo.

Assim TODOS aprendemos um pouco mais... não acham ?

Eiii pjtb... nos diga se deu certo ou se você esperava esse resultado. O que eu postei agora ultimo, serve para te dar i´deia que você poderá re-atribuir as varáveis em cadéia.

Um clip-abraço. :)Pos

Enviado: 17 Abr 2007 11:43
por pjtb
Pessoal fico muito grato!!!! Funcionou blz Pablo

Agradeço a todos

Enviado: 17 Abr 2007 11:54
por pjtb
Pablo!! se eu usar dessa maneira q vc postou, na linha onde esta a interrogação é possivel lê outro dbf e trazer o campo CODIGO e volta para o proximo GET.
Esses DBF são de areas diferentes.

CLS
SET CONFIRM ON
SET DATE TO BRITISH
SET CENTURY OFF

vdata1:=DATE()
vdata2:=DATE()
vdata3:=DATE()
vdata4:=DATE()

@ 06,10 get vdata1 pict "@D" WHEN FUNPRAZO(vdata1,2)
@ 07,10 get vCODIGO pict "99999" WHEN FUNCLIENT(vCODIGO) ???
@ 08,10 get vdata3 pict "@D" WHEN FUNPRAZO(vdata3,4)
@ 09,10 get vdata4 pict "@D"
read

FUNCTION FUNPRAZO(VDTA,VQUAL)
IF !EMPTY(VDTA)
// KEYBOARD DTOC(VDTA+15)+CHR(1)
DO CASE
CASE VQUAL=2
VDATA2:=VDTA+15
CASE VQUAL=3
VDATA3:=VDTA+15
CASE VQUAL=4
VDATA4:=VDTA+15
ENDCASE
ENDIF
RETURN .T.

Enviado: 17 Abr 2007 14:26
por Pablo César
Acho que se você quer trazer o código de uma outra tabela, você pode fazer uma outra função (neste caso FUNCLIENT) exibir os nomes e trazer o código selecionado. Acho que é perfeitamente possível. Mas Qual é o resultado que você quer dar nessa edição do vcodigo no GET ?. Você quer primeiro exibir uma janela (tipo achoice, tbrowse ?) ou você pode simplesmente mudar de:

@ 07,10 get vCODIGO pict "99999" WHEN FUNCLIENT(vCODIGO)

para:

@ 07,10 get vCODIGO pict "99999" VALID FUNCLIENT(vCODIGO)

Desta forma, se o usuário digitar um código válido retorna .T. senão exibe uma janela. Eu acho que o normal é isso. Depende como você quer.

Um clip-abraço :)Pos

Enviado: 18 Abr 2007 07:34
por pjtb
É exatamente isso q estou querendo, se o usuário digitar um código válido retorna .T. senão exibe uma janela. Estou usando Valid funclient(vcodigo).
O programa é em REDE e quando faço uma pesquisa dessas sempre da erro e não volta para o proximo GET.
Acho q tem problema com o modo de selecionar a area e sair.

Obs: estou usando um Dbedit, onde ao tecla uma certa tecla faço inclusão, essa opção abro uma janela de dessa janela aberta faço essa pesquisa de codigo de cliente onde digitando um codigo valido retorna .t. senão exibe uma outra janela.

Enviado: 18 Abr 2007 08:17
por Pablo César
Colega pjtb, você não poderia postar funclient(vcodigo) aqui (em forma de "CODE") para nós analisarmos e corregir seu fonte ?.

Mas por favor, utilize o recurso "Code" na hora de postar o seu código.