Página 2 de 3
FUNCLIENT(VCODIGO)
Enviado: 18 Abr 2007 08:46
por pjtb
Código: Selecionar todos
@ 13,17 GET VCODCLI PICT "999999" VALID FUNCLIENT(VCODCLI)
@ 13,57 GET VDTALVA PICT "99/99/99"
@ 14,43 GET VENTALVA PICT "99/99/99"
@ 16,36 GET VDTHAB PICT "99/99/99"
@ 16,61 GET VDTENHAB PICT "99/99/99"
READ
*********************************************
FUNCTION FUNCLIENT(VCODCLI)
WAUX=RECNO()
close databases
close format
DO WHILE .T.
CLEAR GETS
*****
close databases
close format
AARQ(8,.F.)
Select CLIENT
Set index to (M->CAMINHO+"\"+M->CODIGO+"\CLIENT")
Set delete off
Set order to 2
*****
LOCATE ALL FOR CODIGO=RIGHT("00000"+LTRIM(STR(VCODCLI,5)),5)
*****
IF .NOT. FOUND()
TELA40=SAVESCREEN(00,01,24,79)
DO WDEPP /// JANELA DE PESQUISA
RESTSCREEN(00,01,24,79,TELA40)
VCODCLI=VAL(CODIGO)
VNOME=NOME_CLI
COR("SAY")
@ 13,17 SAY VCODCLI PICT "99999"
@ 24,21 SAY VNOME PICT "@!"
EXIT
ELSE
VCODCLI=VAL(CODIGO)
VNOME=NOME_CLI
COR("SAY")
@ 13,17 SAY VCODCLI PICT "99999"
@ 24,21 SAY VNOME PICT "@!"
EXIT
ENDIF
ENDDO
CLEAR GETS
close databases
close format
AARQ(5,.F.)
Select SOCIO
Set index to (M->CAMINHO+"\"+M->CODIGO+"\CLIENT")
Set delete off
set order to 1
GOTO WAUX
***************
PROCEDURE WDEPP
***************
SET CURSOR OFF
tela_old5 = SAVESCREEN(05,08,19,76)
GOTO TOP
CAMPOS={[CODIGO],[PROPRIETAR]}
PIC={[@!],[@!]}
CABECALHO={[CODIGO],[PROPRIETARIO]}
DO DBCONS
SET SOFTSEEK OFF
RETURN
***************************************************************************
Enviado: 18 Abr 2007 09:56
por Pablo César
Caro pjtb,
Fiz algumas notações, porque eu acho que o importante você entender bem toda a questão. seria de muita ajuda que também postes o seu
DBCONS ou compile com essas modificações sugeridas e veja se dá algum resultado. Senão pode retornar postando o que foi feito e com o DBCONS que ficou faltando.
Código: Selecionar todos
FUNCTION FUNCLIENT(VCODCLI)
VQSEL:=SELECT()
VQORD:=INDEXORD()
WAUX=RECNO()
// close databases // Lembre que nao é aconselhavel RE-ABRIR os DBF
// close format // Mantenha-os abertos neste modulo, porque voce ira precisar
// DO WHILE .T. // Nao é necessário fazer um DO WHILE
// CLEAR GETS // Este comando é que deve estar fazendo fugir do GET
// close databases
// close format
// AARQ(8,.F.) // No inicio deste módulo, abra seus DBF com TODOS seus
// indices para que TODOS seus NTXs sejam atualizados
Select CLIENT
// Set index to (M->CAMINHO+"\"+M->CODIGO+"\CLIENT")
// Set delete off
Set order to 2 // Verifique a sequencia 2, se é da chave de indexaçao: CODIGO
// isto se seu campo for caracter e for com zeros no lugar de
// espaços. Exemplo: "000001"
// STRZERO(CODIGO,5,0), isto se seu campo CODIGO for numerico
// LOCATE ALL FOR CODIGO=RIGHT("00000"+LTRIM(STR(VCODCLI,5)),5) // Nao utilize
// isto porque deixa muito lento. Se voce tem um indice, utilize o SEEK
IF .NOT. FOUND()
TELA40=SAVESCREEN(00,01,24,79)
// DO WDEPP /// JANELA DE PESQUISA
/*
Aqui eu utilizaria o nome da funçao que exibe os nomes. Porque
da¡ voce traz o numero da matricula que foi selecionada.
Eu acostumo usar FUNCTION com parametros em lugar de PROCEDURE
e no final, que deh um retorno do numero do CODIGO
*/
// Digamos que o nome dessa funçao seja MOSTRA_CLI(), entao ficaria assim:
VCODCLI:=VAL( MOSTRA_CLI() )
RESTSCREEN(00,01,24,79,TELA40)
// VCODCLI=VAL(CODIGO)
VNOME=NOME_CLI
COR("SAY")
@ 13,17 SAY VCODCLI PICT "99999"
@ 24,21 SAY VNOME PICT "@!"
// EXIT
ELSE
VCODCLI=VAL(CODIGO)
VNOME=NOME_CLI
COR("SAY")
@ 13,17 SAY VCODCLI PICT "99999"
@ 24,21 SAY VNOME PICT "@!"
// EXIT
ENDIF
ENDDO
// CLEAR GETS
// close databases
// close format
// AARQ(5,.F.)
// Select SOCIO
// Set index to (M->CAMINHO+"\"+M->CODIGO+"\CLIENT")
// Set delete off
// set order to 1
SELECT(VQSEL)
INDEXORD(VQORD)
GOTO WAUX
FUNCTION WDEPP()
SET CURSOR OFF
// tela_old5 = SAVESCREEN(05,08,19,76)
GOTO TOP
CAMPOS={[CODIGO],[PROPRIETAR]}
PIC={[@!],[@!]}
CABECALHO={[CODIGO],[PROPRIETARIO]}
// DO DBCONS
// Faça aqui o DBCONS e atribua a uma variavel (neste caso VRET) o resultado
// do que o usu rio selecionou. Eu acostumo utilizar TBROWSE. Seria bom ver
// esse DBCONS.
// após execuçao do DBCONS, ficaria assim VRET:=CODIGO
SET SOFTSEEK OFF
RETURN VRET
Um clip-abraço :)Pos
DBCONS
Enviado: 18 Abr 2007 10:23
por pjtb
Código: Selecionar todos
*****************
PROCEDURE DBCONS
*****************
SOMBRA(07,10,16,66)
@ 07,10 TO 16,66
@ 08,11 SAY " RELACAO DE PROPRIETARIOS "
@ 09,11 TO 09,65
@ 09,33 say "{P}Pesquisa"
DBEDIT(10,11,16,65,CAMPOS,[WRR],PIC,CABECALHO,"ÄÂÄ"," ³ ","ÄÁÄ")
RESTSCREEN(05,08,19,76,tela_old5)
SET SOFTSEEK OFF
**************
PROCEDURE WRR
**************
PARA mode
DO CASE
CASE mode = 1
GOTO TOP
CASE mode = 2
GOTO BOTTOM
RETURN(1)
CASE mode = 3
RETURN(0)
CASE mode = 4
DO CASE
CASE LASTKEY() = 13
RETURN(0)
CASE LASTKEY() = 27
RETURN(0)
CASE LASTKEY()=112 .OR. LASTKEY()=80
DO WHILE .T.
SET ORDER TO 2
TELA10=SAVESCREEN(02,00,19,79)
SOMBRA(09,15,11,65)
COR("SAY")
@ 09,15 CLEAR TO 11,65
SET COLOR TO N/BG
@ 09,15 TO 11,65 DOUBLE
SET COLOR TO
VNOM100=SPACE(32)
COR("SAY")
@ 10,32 SAY SPACE(30)
@ 10,17 SAY "Digite o Nome:"
COR("GET")
@ 10,32 GET VNOM100 PICT "@!"
SET CURSOR ON
READ
SET CURSOR OFF
IF LASTKEY()=27
SET CURSOR OFF
EXIT
ENDIF
SEEK TRIM(VNOM100)
SET COLOR TO
EXIT
ENDDO
RESTSCREEN(02,00,19,79,TELA10)
SET COLOR TO
RETURN 2
ENDCASE
ENDCASE
RETURN
*******************************
Enviado: 18 Abr 2007 10:26
por Eolo
PJTB,
Pra que complicar se pode facilitar? Eu uso uma solução que, embora possa não ser muito "técnica", funciona! e não precisa alterar GETSYS nem qq outra coisa. Veja abaixo.
Ah, se vc tiver muitas informações na tela e não quiser que "pareça" que ela foi reconstruída, use o DISPBEGIN e o DISPEND.
(aliás, uma pergunta: por que vc usa PICT em data? Não precisa. O GET respeita o que estiver setado em CENT e DATE).
Eolo
Código: Selecionar todos
set cent off
set date brit
priv vdata1:=vdata2:=vdata3:=vdata4:=ctod("")
do whil .t.
@6,10 get vdata1 vali datas(readvar())
@7,10 get vdata2 vali datas(readvar())
@8,10 get vdata3 vali datas(readvar())
@9,10 get vdata4 vali datas(readvar())
read
if lastkey()=27
exit
endi
endd
Código: Selecionar todos
function datas(x)
if empty(&x)
retu .f.
endi
if x=="VDATA2"
vdata3=vdata2+15
clea gets
keyb chr(13)+chr(13) // vai pro get do VDATA3
elseif x=="VDATA4"
clea gets
keyb chr(27)
endi
retu .t.
Enviado: 18 Abr 2007 11:06
por Pablo César
Eu estava te respondendo e ao postar a minnha resposta perdí TUDO... que mer.... Bem vamos intentar outra vez reproduzir o que eu estava te escrevendo...
Basicamente eu estava dizendo que é muito importante você substituir o seu DBEDIT pelo TBROWSE. Pois eu considero que o DBEDIT, muito pobre em recursos. Tal é assim que não uso mais ele. Outra que esse GET que você tem dentro do seu PROCEDURE WRR (@ 10,32 GET VNOM100 PICT "@!"), não irá funcionar pelas outras edições de GETs que você ja tem ativo anteriormente (VCODCLI, VDTALVA, etc...), se você quiser insistir com o DBEDIT, utilize outro recurso que não seja o GET para atribuir a variável
VNOM100 e fazer a sua pesquisa dentro do WRR.
Eu tenho insistido para os colegas dominarem o TBROWSE. Com ele até poderias exibir os nomes de proprietários e exibi-los conforme for digitando seus nome. Veja aqui no FORUM um exemplo de TBROWSE, talvez possa te ser útil:
https://pctoledo.org/download/cop ... t&deonde=2
Caro Eolo, o atual problema do colega pjtb é exibir os nomes dos proprietários, caso o usuário tenha digitado um código que não exista e daí deveria exibir em tela para seleciona-lo. Acho que essa questão dos GETs de data ele já resolveu. Seria bom dar um exemplo SIMPLES de TBROWSE com procura (sem utilizar outros GETS).
um clip-abraço :)Pos
Enviado: 18 Abr 2007 11:46
por Eolo
Eu uso a seguinte solução, simples também:
- crio uma variável PESQUISA=""
- na função de usuário que vai dentro do DBedit() ou TBRowse(), faço um DO CASE com o Lastkey(): se for >64 e <91 = A/Z ou >96 e <123 = a/z, faço pesquisa=pesquisa+chr(lastkey()) e dou um SEEK na variável PROCURA, com SOFTSEEK ON.
Tá feito! Se o usuário teclar "E", o cursor vai pro primeiro nome com "E". Se em seguida ele teclar "O", o cursor vai pro primeiro "EO". E assim por diante. E, se não houver nenhum "E" ou "EO", ele pára no registro mais próximo disso. Exemplo: se ele teclar "EOX" e não tiver nenhum "EOX", o cursor vai parar em "EO".
Essa variável PESQUISA pode aceitar outros caracteres (número, espaço, hífen etc), dependendo da ordem de indexação do DBF:
- se a ordem é data, por exemplo, é só esperar a variável pesquisa completar uma data válida e fazer "seek ctod(pesquisa)".
- se a ordem for numérica, é só fazer "seek val(pesquisa)", antes fazendo pesquisa só aceitar caracteres numéricos.
- se a ordem for descendente, é só fazer "seek descend(pesquisa)".
- etc.
No meu caso, se o usuário teclar:
- BACKSPACE chr(8), eu faço pesquisa=substr(pesquisa,1,len(pesquisa)-1) e dou o SEEK. Se estava em "EOL", volta pra "EO"...
- CRTL BACKSPACE, faço pesquisa="" e GO TOP
- SETAs (acima ou abaixo) ou PgUp ou PgDn, faço pesquisa="" e deixo a movimentação respectiva ocorrer.
Por fim, é só mostrar, em algum lugar da tela, o conteúdo da variável PESQUISA (ou nada, se pesquisa=""), aí o usuário vê o que ele está procurando.
Resumindo: não precisa de GET nenhum.
Eolo
Enviado: 18 Abr 2007 12:24
por Pablo César
Ok Eolo, é isso mesmo que precisa o colega pjtb. O mesmo que eu postei no link para download (da seção Downloads daqui do FORUM).
Ja viu como foi feito ? Esse é um exemplo simples e dinâmico.
É muito importante a utilização e dominio do TBROWSE ele é muito mais versátil que o DBEDIT.
Um clip-abraço :)Pos
Agradecimento
Enviado: 27 Abr 2007 13:25
por pjtb
Blz Pablo, ja esta funcionando...
Agradeço por tudo, OK!!!
Enviado: 27 Set 2007 11:05
por Ademir
Pessoal Bom dia !
Por exemplo: Tenho 3 gets desta forma:
@ 10,20 get var1
@ 12,20 get var2 valid var2 > 9
@ 14,20 get var3
read
Se na var2 eu não digitar um numero > 9, não consigo voltar para o campo anterior. Atualmente faço isso por meio de uma função que se detectar lastkey()=5 retorna verdadeiro.
Tem como fazer isso de outra forma ? Como ?
Desde já agradeço.
Ademir.
Enviado: 27 Set 2007 12:27
por Maligno
Atualmente faço isso por meio de uma função que se detectar lastkey()=5 retorna verdadeiro.
Mas é assim mesmo que você tem que fazer. Não tá bom?
Enviado: 27 Set 2007 12:29
por Ademir
Pessoal, enquanto aguardava uma solução aqui do forum, fiquei pesquisando e acho que consegui. No GETSYS.PRG, alterei a função GetPostValidate:
if ( oGet:ExitState == GE_ESCAPE ) .or. ( oGet:ExitState == GE_UP )
Return (.T.)
endif
Depois compilei usando /M /N /W e inclui o OBJ na compilação.
Alguem tem alguma solução melhor ?
Enviado: 27 Set 2007 12:33
por Maligno
Solução melhor eu não tenho, mas não mexeria na GETSYS apenas para resolver esse problema. Acho que eu faria igual você fez com a função do VALID.
Enviado: 27 Set 2007 12:42
por Ademir
Entendí o que quer dizer. Mas mesmo nas funções queria tirar a comparação de toda a hora:
if lastkey()=5
retu .t.
endif
Agora, alterando a GETSYS, basta fazer o que eu fiz, ou seja, compilar e incluir o GETSYS.OBJ na compilação ?
Isso vai deixar o executável maior ou mais lento ?
É a primeira vez que altero a GETSYS.
Enviado: 27 Set 2007 12:43
por Maligno
Isso vai deixar o executável maior ou mais lento ?
Não. Pode ficar tranqüilo.

Enviado: 27 Set 2007 13:24
por Ademir
Beleza ! E com relação ao GETSYS é isso mesmo que eu fiz ? Compilar e incluir o GETSYS.OBJ na compilação do sistema ?