Página 2 de 3

Enviado: 29 Mai 2007 09:24
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

Enviado: 29 Mai 2007 09:46
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

Enviado: 29 Mai 2007 10:23
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

Enviado: 29 Mai 2007 12:42
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 ...

Enviado: 29 Mai 2007 16:26
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

Enviado: 05 Jun 2007 09:56
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

Enviado: 05 Jun 2007 11:03
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)

Enviado: 05 Jun 2007 14:41
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

Enviado: 05 Jun 2007 15:11
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

Enviado: 05 Jun 2007 15:42
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).

Enviado: 05 Jun 2007 16:18
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()

Enviado: 05 Jun 2007 17:49
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

Enviado: 05 Jun 2007 18:18
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).

Enviado: 06 Jun 2007 07:36
por ederxc
Não tem problema Pablo acontece ...

Enviado: 12 Jun 2007 16:02
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