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 ?