Navegar entre GET´s

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Bom dia Eder,

Com respeito ao ALERT, eu tinha pra te dizer apenas que este deixa menos ágil teu sistema, porque além de dar uma mensagem tipo "ERRO de sistema", pois o usuário se acostuma ver essa janelinha e quando ocorre ERRO, mesmo não te avisa (claro que também tem outra solução para gravar os erros em arquivo). Mas já viu ? É importante a inteiração com o usuário, padronizar as mensagens, visualizando e diferenciando as mesnagens tipo, ERRO, tipo ALERTA, tipo MENSAGEM para informação. O usuário no ALERT() terá que confirmar algo, sendo que se você utilizasse o MENSAGEM() (função ora criada por você), apenas exibiria por tempo determinado e voltaria a edição do GET. Dê uma olhada neste exemplo de MENSAGEM():

Código: Selecionar todos

FUNCTION MENSAGEM( TEXTO, PAUSA )
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SAVECURSOR() // função da CT.LIB
IF TEXTO = NIL; TEXTO := ""; ENDIF
SET CURSOR OFF
@ MAXROW(), 00 SAY PADC( TEXTO, 80 ) COLOR "N/W"
IF PAUSA = NIL
   ULT_MENSAGEM := TEXTO
ELSE
   INKEY( PAUSA )
   @ MAXROW(), 00 SAY PADC( ULT_MENSAGEM, 80 ) COLOR "N/W"
ENDIF
RESTCURSOR(ULT_CURSOR)
RETURN NIL
ederxc escreveu:ou seja se caso o usuario esqueça o codigo "ele sempre esquece" ele pesquisaria por nome e é por isso a necessidade de mais um get
Você entendeu o exemplo na minha primeira mensagem que postei neste tópico ?. Você percebeu que seria conveniente acostumar ao usuário que caso esqueça dos códigos, pressione F2 para obter uma listagem (seja em DBEDIT ou TBROWSE) ?. Desta forma fica mais fácil e padronizada de trabalhar. Como ja disse anteriormente, não induza ao seu usuário para que provoque o erro. Dê opções no seu sistema, mas de forma passiva e padronizada.
ederxc escreveu:Pessoal , seria possivel dentro de minha função de pesquisa haver outro Get?
Eu ja ví que pode ser feito com CLEAR GETS, mas eu particularmente não gosto de utilizá-los. Utilizo o GETINPUT da CT.LIB (que assemelha-se ao um GET), veja um exemplo:

Código: Selecionar todos

VQCORE:=SETCOLOR()
TELA_FUN:=SAVESCREEN(14,13,20,68)
SET COLOR TO (CONTECOR[2])
@ 14,13 CLEAR TO 18,67
SET COLOR TO (CONTECOR[12])
@ 14,13 TO 18,67
SET COLOR TO (CONTECOR[2])
@ 14,14 SAY PADC(" Cadstro de Funcion rio ",53,"Ä") COLOR CONTECOR[12]
@ 15,15 SAY "Nome completo:" COLOR CONTECOR[2]
@ 16,15 SAY "Data Admiss„o:" COLOR CONTECOR[2]
FICA=.T.
SET CURSOR ON
SET KEY 5 TO RET1
SET KEY 24 TO RET2
VQPOS=1
DO WHILE FICA=.T.
   IF VQPOS=1
      VQPOS++
      MENSAGEM("Informe o nome completo do funcion rio.")
      @ 15,30 SAY ""
      W_EMPRESA=GETINPUT(W_EMPRESA,15,30,,,"@!",SETCOLOR(CONTECOR[8]+"/"+CONTECOR[9]))
   ENDIF
   IF !LASTKEY()=27 .AND. VQPOS=2
      VQPOS++
      MENSAGEM("Informe a data que foi admitido na empresa.")
      @ 16,30 SAY ""
      V_EMP=GETINPUT(W_FANTASIA,16,30,,,"@!",SETCOLOR(CONTECOR[8]+"/"+CONTECOR[9]))
   ENDIF
   IF !(LASTKEY()=3)
      FICA=.F.
   ENDIF
   IF VQPOS>2
      VQPOS=1
   ENDIF
ENDDO
SET KEY 5 TO
SET KEY 24 TO
SET CURSOR OFF
IF !LASTKEY()=27
   IF BLOQREG(20)
      REPLACE
      UNLOCK
   ENDIF
ENDIF
SETCOLOR(VQCORE)
RESTSCREEN(14,13,20,68,TELA_EMP)
@ 13,33 SAY (4->FANTASIA) COLOR CONTECOR[8]


FUNCTION RET1
VQPOS=VQPOS-2
IF VQPOS<1
   VQPOS=5
ENDIF
KEYBOARD CHR(3)
RETURN NIL

FUNCTION RET2
KEYBOARD CHR(3)
RETURN NIL
ederxc escreveu:ou seria possivel um segundo get dentro da função e eu estrou fazendo coisa errada ?
Sim pode ser feito um segundo GET dentro de outro, mas intenta utilizar o GETINPUT(), para ver como ele funciona. Mas você terá dificuldades na parte de navegação entre GETs. Outra coisa que você pode tentar é alterar o seu GETSYS.PRG para poder navegar é fazer todo o tratamento de saída de GETs, lá onde trata-se os seus GETs como objetos. Mas esta opção, requer mais esforço.

Um clip-abraço :)Pos
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Pablo César escreveu: ou seria possivel um segundo get dentro da função e eu estrou fazendo coisa errada ?Sim pode ser feito um segundo GET dentro de outro, mas intenta utilizar o GETINPUT(), para ver como ele funciona. Mas você terá dificuldades na parte de navegação entre GETs. Outra coisa que você pode tentar é alterar o seu GETSYS.PRG para poder navegar é fazer todo o tratamento de saída de GETs, lá onde trata-se os seus GETs como objetos. Mas esta opção, requer mais esforço.
Um clip-abraço
mais uma duvida ...

Então se eu fizer com o GETIMPUT() ou mesmo CLEAR GETS prejudicaria a navegaçõa entre gets ?? :'(


Tambem ñ consegui entender como vc usa a tecla F2 para chamar a função pois se a tecla esta setada apenas para chamar a função de fornecedor , ou conforme navegha entre os gets a tecla F2 é alterada paa a chamar a função do get corrente , ñ entendi muito bem como funciona , poderia me explicar um pouco mais ?? Obrigado :f
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

ederxc escreveu:Então se eu fizer com o GETINPUT() ou mesmo CLEAR GETS prejudicaria a navegação entre gets ??
Como eu disse, eu não posso dar algum exemplo do CLEAR GETS nessa situação, pois nunca utilizei (talvez surja algum colega com esse exemplo depois, tomara !). Posso falar sobre o GETINPUT, no exemplo que passei de (GETINPUT) tire os:

Código: Selecionar todos

ponha "//" nesta linha=> SET KEY 5 TO RET1 
ponha "//" nesta linha=>SET KEY 24 TO RET2 
E você verá que terá dificuldades na navegação.
ederxc escreveu:Tambem ñ consegui entender como vc usa a tecla F2 para chamar a função pois se a tecla esta setada apenas para chamar a função de fornecedor
Come on... awake up your imagination... Eu fiz apenas um exemplo, você pode adaptar. A minha sugestão é fazer nessa mesma função do F2, tratar de acordo a cada GET. Para isso, você precisa identificar qual é o NOME do GET (é dizer o nome da variável do GET) e tratar de acordo cada GET.

Lá naquele exemplo que passei tinha: SETKEY(-1,{|V1,V2,V3|PESQFOR(V1,V2,V3)})

Se na tua função PESQFOR(), você colocar as variaveis para receber os parâmetros V1,V2,V3 você verá que a V1 traz o nome da função que chamou, *V2 deve trazer o número da linha do seu código e *V3 deve trazer o nome da variável. Então para receber essas variáveis, modifique o PESQFOR() para PESQFOR(V1,V2,V3) e lá dentro exiba essas varáveis (V1,V2,V3).

Um clip-abraço :)Pos

* Texto re-editado
Editado pela última vez por Pablo César em 05 Jun 2007 18:27, em um total de 1 vez.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

É com CLEAR GETS ñ funciona mesmo , pois quando retorna da função pesquisa fornecedor o get do produto esta "limpo" e ja enra direto na função de pesuisar produto ,
:'(

Tentarei ver o que consigo com a sua sintaxe Pablo ! Pensei em usar a sintaxe do Janio , mas ñ sei com que ele trata com o segundo get em sua sintaxe ...
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Eder,

Olhe, a seguir, o jeito que eu uso. Está BEM simplificado, eu deixei só a estrutura principal pra ficar fácil de entender. Depois, é encaixar as cores, sombras etc etc.

NIVEL1: vc fica navegando indefinidamente em 3 GETs até que ESC=Sai sem Gravar, F10=Sai Gravando ou F3=Vai pro Nivel2.

NíVEL2: vc fica navegando indefinidamente em 3 Outros GETs até que ESC=Sai sem Gravar, F10=Sai Gravando ou F7=Abre um Help (Dbedit ou Tbrowse ou etc).

Código: Selecionar todos

set conf on
set key -9 to F10
set key -6 to F7
set key -2 to F3
*...
function nivel1
do whil .t.
  @10,10 get vcampo1
  @11,10 get vcampo2
  @12,10 get vcampo3
  read
  if lastkey()=27 // ESC
    exit
  elseif lastkey()=-9 // F10 Grava e Sai
    if grava1()
      exit
    endi
  elseif lastkey()=-2 // F3 Outros GETs
    nivel2()
  endi
endd
quit

function grava1
priv ok:=.t.
* consiste variáveis
* se há erro, retorna .F.
*
* grava campos
* retorna .T.
retu ok

Código: Selecionar todos

  function nivel2
  clear
  do  whil .t.
    @10,10 get vcampo4
    @11,10 get vcampo5
    @12,10 get vcampo6
    read
    if lastkey()=27 // ESC
      exit
    elseif lastkey()=-9 // F10 Grava2 e Sai
      if grava2()
        exit
      endi
    elseif lastkey=-6 // F7 Help só p/ vcampo5
      listaprodutos()
    endi
  endd
  keyb chr(0)
  inkey()

  function listaprodutos()
  * abre produtos.dbf e constrói dbedit() / tbrowse()
  * usuário navega até recno()=1234 e dá ENTER: 
  * vcampo5=campo5
  * fecha produtos.dbf
  keyb chr(0)
  inkey()
  retu

  function grava2
  priv ok:=.t.
  * consiste variáveis
  * se há erro, retorna .F.
  *
  * grava campos
  * retorna .T.
  retu ok

Código: Selecionar todos

procedure f10
clea gets

procedure f7
if readvar()="VCAMPO5"
  clea gets
endi

procedure f3
clea gets
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Pablo César escreveu: SETKEY(-1,{|V1,V2,V3|PESQFOR(V1,V2,V3)}) // utilizo o F2 para chamar a funcao
MENSAGEM("Coloque o c¢digo do fornecedor ou <F2>")
@ 09,14 GET VFORN PICT '999' COLOR('w+/b') VALID VQFORN(VFORN)
@ 10,11 GET VPROD PICT '9999999999999' COLOR('GR+/B') VALID VQPROD(VPROD)
READ
Ola amigo bom dia ! pablo , ja consegui acertar a CT52.lib com uma bela observação do nosso amigo Eolo , e ja inserio GETINPUT() e gostei bastante da funçõa, só que ainda ñ entrou na minha cabeça essa linha do SETKEY voce poderia me dar mais alguns exemplo de como funciona ? obrigado
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Bom dia a todos !

Oi eder. Quando eu disse que você poderia adaptar a seguinte função (lá naquele exemplo que passei):

Código: Selecionar todos

SETKEY(-1,{|V1,V2,V3|PESQFOR(V1,V2,V3)})
E esta linha não nada mais que menos do que:

Código: Selecionar todos

SET KEY -1 TO PESQFOR (É a mesma coisa)
Eu estava sugerindo a você, que alterasse o PESQFOR() com a finalidade de sintetizar numa só tecla de função, e que esta função servisse para os outros GETs, que subsequentemente utilizam diferentes DBFs para consultas.

Você mudaria a sua função FUNCTION PESQFOR() para FUNCTION PESQFOR(V1,V2,V3)

E se você adicionar estas primeiras linhas na função:

Código: Selecionar todos

? V1
? V2
? V3
inkey(0)
Você Observará que:
V1 = traz o nome da função onde foi evocada
V2 = traz o número da linha do seu código onde foi evocada *
V3 = traz o nome da variável ativa onde foi evocada *

Então, partindo do princípio que a variável V3* desta função, tem o nome de cada GET, você poderia implementar através de um DO CASE, o chamado de outra função onde exibiria os dados conforme cada GET.

Exemplo: *

Código: Selecionar todos

FUNCTION PESQFOR(V1,V2,V3)
DO CASE
   CASE V3="VFORN"
        BUSCA_FORN() // Funcao TBROWSE que exibe FORNECEDORES
   CASE V3="VPROD"
        BUSCA_PROD() // Funcao TBROWSE que exibe PRODUTOS
   CASE V3="VCLIE"
        BUSCA_CLIE() // Funcao TBROWSE que exibe CLIENTES
ENDCASE
Esta sugestão é apenas para sintetizar o chamado com F2 e evocar o TBROWSE de acordo cada GET. Isto servirá para padronizar com o usuário que F2 é sempre para pesquisa. Espero que agora você tenha entendido a idéia.

* Texto Re-editado (estavão os parâmetros invertidos)
Editado pela última vez por Pablo César em 05 Jun 2007 18:23, em um total de 1 vez.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Então Pablo , descupe insistir no assunto mas, é justamente isso que ñ estou entendendo...

Código: Selecionar todos

FUNCTION selepesq(V1,V2,V3)
DO CASE
   CASE V2="VFORN"     //"aqui esta a duvida"
        BUSCA_FORN() // Funcao TBROWSE que exibe FORNECEDORES
   CASE V2="VPROD"
        BUSCA_PROD() // Funcao TBROWSE que exibe PRODUTOS
   CASE V2="VCLIE"
        BUSCA_CLIE() // Funcao TBROWSE que exibe CLIENTES
ENDCASE

Pois se chamo a função selepesq() com a tecla F2 ñ entendo como a variavel V2 pode ser igual a "vforn" ou outra pois se isso ñ foi dito em lugar algum da função
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

ederxc escreveu:se chamo a função selepesq() com a tecla F2 ñ entendo como a variavel V3 pode ser igual a "vforn" ou outra pois se isso ñ foi dito em lugar algum da função
Ohhh não diga isso !. Você deve colocar a seguinte linha no começo desse módulo:

SETKEY(-1,{|V1,V2,V3|SELEPESQ(V1,V2,V3)})
ou
SET KEY -1 TO SELEPESQ // (É a mesma coisa)

Nesta ultima sem parâmetro algum, ele recebe como "default" os parâmetros que ora na sua função SELEPESQ(V1,V2,V3) é recebidas como V1,V2,V3.

Também não esqueça após o seu READ (daqueles GETs), fechar o SET KEY com: SET KEY -1 TO

Beleza ?. spero que você tenha entendido. Aparentemente, você se estranharia porque na definição do SET KEY TO, não possue arâmetro algum, mas internamente na execução o Clipper assume como default aqueles parâmetro que te passei anteriormente.

:)Pos Faça o teste que te sinalei...

E se você adicionar estas primeiras linhas na função:

Código: Selecionar todos

? V1 // irá mostrar o PROCNAME()
? V2 // irá mostrar o PROCLINE()
? V3 // irá mostrar o READVAR()
inkey(0)
Aí você vai ver com seu proprios olhos... hehe
Editado pela última vez por Pablo César em 05 Jun 2007 18:24, em um total de 2 vezes.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Eder,
...Pois se chamo a função selepesq() com a tecla F2 ñ entendo como a variavel V2 pode ser igual a "vforn" ou outra...
Quando vc faz SET KEY -1 TO PESQFOR, a função PESQFOR é atribuída à tecla F2, ou seja, toda vez que vc teclar F2, de qualquer GET em qualquer rotina, a função PESQFOR vai ser acionada.

Mas isso pode embolar o meio de campo, certo?, porque vc quer saber de onde veio a chamada... Resposta: o SET KEY manda 3 parâmetros para a função PESQFOR: nome da rotina, número da linha e nome da variável (do GET onde se teclou o F2).
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pablo,

Uma correção: o V2 e V3 estão invertidos em seu exemplo. CASE V2="VFORN" vai dar "argument error", porque V2 é numérico... O correto é V3="VFORN".

Código: Selecionar todos

V1 = nome da função onde foi evocada       = procname()
V2 = linha do seu código onde foi evocada  = procline()
V3 = variável ativa onde foi evocada       = readvar()
Avatar do usuário
software_facil
Usuário Nível 3
Usuário Nível 3
Mensagens: 211
Registrado em: 23 Fev 2005 12:19
Localização: Curitiba/PR
Contato:

Mensagem por software_facil »

Tenho uma solução que uso durante anos e que é perfeita para o seu caso, pois reutiliza código, resumindo funciona assim : vc cria o prg que faz a navegação/inclusão/alteração/exclusão/pesquisa/relatório de cliente (por exemplo), então, em uma opção do seu sistema, vc tem um get e precisa fazer uma busca no cadastro de clientes, então, usando a tecla que quiser, vc chama o mesmo prg que faz todo o controle de clientes, pesquisa pelo cliente que deseja, se achar e faltar informações, altera na hora, se ele não existir, inclui na hora, e dando enter, ou qualquer outro comando, volta para a tela anterior já com o código do cliente no get e pronto para ir adiante, e claro, independente do número de get´s que vc tenha, vc só precisará usar as setas ou tab/shift-tab para navegar entre eles.
Made um e-mail para msdn_001@yahoo.com.br , mencionando o tópico do fórum, que lhe envio o exemplo (código fonte).

Abraços
messenger : software_facil@hotmail.com
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Eolo escreveu:Uma correção: o V2 e V3 estão invertidos em seu exemplo. CASE V2="VFORN" vai dar "argument error", porque V2 é numérico... O correto é V3="VFORN".

Código: Selecionar todos

V1 = nome da função onde foi evocada       = procname()
V2 = linha do seu código onde foi evocada  = procline()
V3 = variável ativa onde foi evocada       = readvar()
Oopss... errei !. Você tem razão Eolo !. Desculpem a minha confusão. O primeiro parâmetro é PROCNAME() o segundo é o PROCLINE() e o terceiro é READVAR().

Por favor re-considerar. Very sorry !. (Vou re-editar a minha mensagem para que não cause mais confusão).
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Não tem problema Pablo acontece ...
C:\Xharbour\Xdev\Fw\VSX
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Boa tardes amigos !
Pessoal , até que enfim achei uma forma de colocar o (setkey) para chamar as funções que pesquisam por nome , mas estou tendo um problema de retorno , pois nesse retorno ñ estou conseguindo exibir o codigo na tela pois com o retorno o get ñ é preenchido e tenho certeza que esta retornado a variavel com seu devido valor pois o nome é exibido na frente corretamente

Código: Selecionar todos

set key -1 to pesqtod(v1,v2,v3)
@09,14 GET VFORN  PICT '999' valid Npesqfor(vforn)  
@10,11 GET VPROD  PICT '9999999999999'  valid Npesqprod(vprod) 
read


***********<SELECIONAR TIPO DE PESqUISA>*************
FUNCTION PESQTOD(V1,V2,V3)

if v3="VFORN"
   PESQFOR(vforn)
elseif v3="VPROD"
   PESQPROD(vprod)
endif
*************<PESQUISA FORNECEDOR>***************

FUNCTION Npesqfor(vforn) // codigo
if empty(vforn)
   return .t.
endif
SELE C
SET ORDER TO 1
IF DBSEEK(vforn)
   if ! lastkey()=27
      VFORN=COD
      VMOSTFORN=FORN
      @09,14 SAY VFORN PICT '999' COLOR('GR+/B')
      @09,19 SAY VMOSTFORN  PICT '@!'      COLOR('GR+/B')
      return .t.
   endif
endif
return .t.


FUNCTION PESQFOR(VFORN)  //Nome
SELE C
do while .t.
    save screen
    SET ORDER TO 2
    VFOR=SPACE(30)
    @09,28 SAY('NOME FORNECEDOR:') COLOR('G+/B')
    VFOR=GETINPUT(vfor,09,44,,,'@!')
    VFOR=ALLTRIM(VFOR)
    IF DBSEEK(VFOR)
       SETCOLOR('N/GB')
       @10,46 CLEAR TO 16,77
       DISPBOX(10,46,16,77)
       keyboard chr(4)
       DBEDIT(11,47,15,76,2)
       if ! lastkey()=27
           vforn=cod
           rest screen
       endif
     ENDIF
     rest screen
enddo
C:\Xharbour\Xdev\Fw\VSX
Responder