Carregar Dbedit executando uma funcao !!!

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Olá..

No meu dbedit a tecla F5 serve para executar a funcao de pesquisa de nome..

O meu cliente quer que quando entra no dbedit ele já execute automaticamente a pesquisa por nome...

Já tentei de diversas formas e nao consegui..
Estava precisando mudar a cursor para a direita (sair do campo codigo e ir para o nome) consegui colocando

keyboard chr(4).
DBEDIT(aCoord[1],aCoord[2]+1,aCoord[3]-2,aCoord[4]-1,aCampo,"TECLAPESQ",,aTitulo,"Í"," ¦ ")

mas se coloco

keyboard chr(-4)
DBEDIT(aCoord[1],aCoord[2]+1,aCoord[3]-2,aCoord[4]-1,aCampo,"TECLAPESQ",,aTitulo,"Í"," ¦ ")
ou
keyboard chr(K_F5)
DBEDIT(aCoord[1],aCoord[2]+1,aCoord[3]-2,aCoord[4]-1,aCampo,"TECLAPESQ",,aTitulo,"Í"," ¦ ")

Não surte nenhum efeito...

Tentei tb..
keyboard chr(4) + chr(-4)
DBEDIT(aCoord[1],aCoord[2]+1,aCoord[3]-2,aCoord[4]-1,aCampo,"TECLAPESQ",,aTitulo,"Í"," ¦ ")

Também não dá nada..
não executa a função da tecla F5, mas quando entra no dbedit e pressiona F5 funciona...

Alguem sabe se é possivel fazer isso ??
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por ANDRIL »

Ola Rubens,

Coloque ai o codigo da função "TECLAPESQ", pois pelo que vc indicou acima deveria funcionar normalmente.

Ate+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Este é o código da funcao "TECLAPESQ"

Código: Selecionar todos

FUNCTION TECLAPESQ(nMod)
LOCAL GETLIST := {}, nRecno
IF nMod=4
   IF LASTKEY() == 13
	 cVar := aCampo[1]
	 cVar := &cVar.
	 SETCURSOR(0) ; RETURN(0)
   ELSEIF LASTKEY() == K_INS
	 EVAL(bExecuta)
	 SETCURSOR(0)
   ELSEIF LASTKEY() == 27
	 IF(VALTYPE(&(aCampo[1])) == "N",cVar := 0,cVar := SPACE(LEN(&(aCampo[1]))))
	 SETCURSOR(0) ; RETURN(0)
   ELSEIF LASTKEY() == K_F2
	 nRecno := RECNO() ; cSalvTela := SAVESCREEN(24,00,24,79) ; nOrd := INDEXORD()
	 DBSETORDER(nOrdPes1)
	 COR("MENU") ; @ 24,00 CLEAR TO 24,79
	 cPer := IF(VALTYPE(&(aCampo[nF2])) == "C",SPACE(LEN(&(aCampo[nF2]))),0)
	 @ 24,10 SAY aTitulo[nF2] + ": " GET cPer PICTURE aPict[nF2] VALID IF(aPict[nF2] == "999999",ZERO(@cPer,6),.T. == .T.)
	 nOldCursor := SETCURSOR(2)
	 READ
	 IF EMPTY(cPer)
	    RESTSCREEN(24,00,24,79,cSalvTela) ; DBSETORDER(nOrd) ; SETCURSOR(0)
	    RETURN(1)
	 ENDIF
	 IF lZero ; cPer := STRZERO(VAL(cPer),LEN(cPer)) ; ENDIF
	 cPer:= IF(VALTYPE(cPer) == "C",ALLTRIM(cPer),cPer)
	 SETCURSOR(nOldCursor)
	 COR("MENU") ; @ 24,00 CLEAR TO 4,79
	 DBGOTOP()
	 IF !DBSEEK(cPer,.T.) ; BEEP() ; MENSAGEM("Desculpe, "+aTitulo[nF2]+" n„o encontrado !",3) ; DBGOTO(nRecno) ; RESTSCREEN(24,00,24,79,cSalvTela) ; SETCURSOR(0) ; ENDIF
	 RESTSCREEN(24,00,24,79,cSalvTela) ; DBSETORDER(nOrd)
	 SETCURSOR(0) ; RETURN(2)
   ELSEIF LASTKEY() == K_F5
	 IF llF5
	    nRecno := RECNO() ; cSalvTela := SAVESCREEN(24,00,24,79) ; nOrd := INDEXORD()
	    DBSETORDER(nOrdPes2)
	    COR("MENU") ; @ 24,00 CLEAR TO 24,79
	    cPer := SPACE(LEN(&(aCampo[nF5])))
	    @ 24,10 SAY aTitulo[nF5] + ": " GET cPer PICTURE aPict[nF5] VALID IF(aPict[nF5] == "999999",ZERO(@cPer,6),.T. == .T.)
	    nOldCursor := SETCURSOR(2)
	    READ
	    cPer:= ALLTRIM(cPer)
	    SETCURSOR(nOldCursor)
	    COR("MENU") ; @ 24,00 CLEAR TO 4,79
	    IF EMPTY(cPer)
		  RESTSCREEN(24,00,24,79,cSalvTela) ; DBSETORDER(nOrd) ; SETCURSOR(0)
		  RETURN(1)
	    ENDIF
	    cPer := cEspaco+cPer
	    DBGOTOP()
	    IF !DBSEEK(cPer,.T.) ; BEEP() ; MENSAGEM("Desculpe, "+aTitulo[nF5]+" n„o encontrado !",3) ; DBGOTO(nRecno) ; RESTSCREEN(24,00,24,79,cSalvTela) ; SETCURSOR(0) ; ENDIF
	    RESTSCREEN(24,00,24,79,cSalvTela) ; DBSETORDER(nOrd)
	    SETCURSOR(0) ; RETURN(2)
	 ENDIF
   ENDIF
   RETURN(1)
ELSEIF nMod=1
   BEEP()
   MENSAGEM("In¡cio da Consulta !",3)
   SETCURSOR(0) ; RETURN(1)
ELSEIF nMod=2
   BEEP()
   MENSAGEM("Fim da Consulta !",3)
   SETCURSOR(0) ; RETURN(1)
ELSEIF nMod=3
    BEEP()
    BEEP()
    MENSAGEM("N„o h  dados cadastrados para consulta !",4)
    SETCURSOR(0) ; RETURN(0)
ENDIF
RETURN(1)
----------------------------------------------
Nota de Moderação: Mensagem foi editada para colocar o BBCode

Código: Selecionar todos

 no fonte acima.
[/color]
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Realmente estranho...

Criei um teste


use clientes
keyboard chr(4)+chr(13)
dbedit()

e quando exectuto, funciona... ele muda para a coluna da direita e sai do programa com o enter... mas aí no dbedit que estou usando nao acontece nda somente muda para a coluna da direita

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
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á

Carregar Dbedit executando uma funcao !!!

Mensagem por Pablo César »

Oi Rubens, talvez este tópico te ajude a implementar o que você está querendo: viewtopic.php?f=1&t=5901&p=26233#p26233

Eu acostumo utilizar TBROWSEs e no GET onde é geralmente inserido o código, coloco uma função validadora e faço com que a exibição daquele código seja mascarado através de função retornando a descrição daquele código. Essa validação pode ser feita através o KEYBOARD.
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
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por ANDRIL »

Caro Rubens, ao postar trechos de codigo fonte, use as tags CODE antes do inicio do codigo e apos o termino para que possamos ver a endentacao do seu codigo. Clique na barra disponivel durante a ediçao da mensagm

Mais analisando o codigo postado, tente adequa-lo a este modelo.

Código: Selecionar todos

FUNCTION TECLAPESQ
LOCAL GETLIST := {}, nRecno
do case
     case modo = 1 .or. modo = 2
     *aqui avisa sobre inicio e fim dos dados

     case lastkey()=K_ENTER
     *aqui seu codigo...     

     case lastkey()=K_INS
     *aqui seu codigo...     

     case lastkey()=K_F5
     *aqui seu codigo...     

     otherwise
     return 1
endcase
No codigo abaixo:
IF llF5
nRecno := RECNO() ; cSalvTela := SAVESCREEN(24,00,24,79) ; nOrd := INDEXORD()
DBSETORDER(nOrdPes2)
COR("MENU") ; @ 24,00 CLEAR TO 24,79
cPer := SPACE(LEN(&(aCampo[nF5])))
@ 24,10 SAY aTitulo[nF5] + ": " GET cPer PICTURE aPict[nF5] VALID IF(aPict[nF5] == "999999",ZERO(@cPer,6),.T. == .T.)
nOldCursor := SETCURSOR(2)
READ
cPer:= ALLTRIM(cPer)
SETCURSOR(nOldCursor)
COR("MENU") ; @ 24,00 CLEAR TO 4,79
IF EMPTY(cPer)
RESTSCREEN(24,00,24,79,cSalvTela) ; DBSETORDER(nOrd) ; SETCURSOR(0)
RETURN(1)
ENDIF
cPer := cEspaco+cPer
DBGOTOP()
IF !DBSEEK(cPer,.T.) ; BEEP() ; MENSAGEM("Desculpe, "+aTitulo[nF5]+" n„o encontrado !",3) ; DBGOTO(nRecno) ; RESTSCREEN(24,00,24,79,cSalvTela) ; SETCURSOR(0) ; ENDIF
RESTSCREEN(24,00,24,79,cSalvTela) ; DBSETORDER(nOrd)
SETCURSOR(0) ; RETURN(2)
ENDIF
ENDIF
return 1
Não entendi o pq do uso do IF em destaque, será q não é ai o problema?

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Blz..

Pablo...


Realmente o que voce citou ao colega esta certo... mas veja bem.. a parte de retorno pesquisa está tudo ok.. O cliente entra na tela de venda e tem um get que pede o codigo do produto... se ele der ENTER, no campo vazio.. automaticamente é chamada a funcao pesqpro() que exibe um dbedit com os produtos cadastrados.. nesse dbedit tenho duas teclas de funcoes F2 e F5 - F2 pesquisa código F5 pesquisa nome... daí o cliente é um distribuidor atacadista, e os pedido facilmente chegam a 50 itens... então toda vez que entra na tela de pesquisa ele tem que pressionar F5 para pesquisar o produto.. imagina que canseira... o que ele me pediu é que atalhasse esse F5, ou seja quando ele pressionasse enter no campo código abriria o debedit já acionando a funcao F5.. imaginei que resolveria isso colocando um keyboard chr(-4) ou keyboard chr(K_F5) antes de chamar a funcao dbedit().. mas não tá funcionando... interessante é que se coloco keyboard chr(4) ele move o cursor para a direita mas não aciona a função.. Porquê ???

O keyboard simula uma seta para a direita, mas nao simula um F5 ???

:%
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Certo ...
Andril... me desculpem realmente nao sabia usar estes codigos dentro da mensagem..

Seguinte... como expliquei na mensagem que acabei de postar... a questao de usar o if ou do case, nao vai fazer diferença, porque aí tá funcionando... se eu entrar na consutla e pressionar F5 ela vai ser executada... O problema etá que o dbedit nao esta simulando o pressionamento da tecla F5 é como se nao tivesse nada no keyboard !!!

O If é porque a rotina é usada pelo sistema inteiro... eu posso controloar isso quando envio a funcao dbedit()... dentro da FUNCAO TECLAPESQ vai ser verificado se foi pressionado lF5 - .t.

Mas como já disse aí tá funcionando... o que esta acontecendo é que o dbedit() não está executando o que está armazenado no keybooard..


Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por ANDRIL »

Rubens,

Faça um teste, no inicio da sua funcao coloque:

Código: Selecionar todos

FUNCTION TECLAPESQ(nMod)
LOCAL GETLIST := {}, nRecno
? lastkey()
wait"veja aqui se o seu dbedit reconhece a tecla"

IF nMod=4 //**anule este IF para ver se funciona 
...
	
Se reconhecer, o erro pode esta na estrutura usada no dbedit.

Qdo postei com DO CASE não quiz dizer que o problema era no comando,
somente usei como similar ao seu IF. Queria que vc notasse que na minha
estrutura nao usei o modo de exceção de teclas, como vc utiliza no
IF acima que pedi anulação.

Verifique tbem se vc não esta usando a F5 em alguma SET KEY, ok.

Ate+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
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á

Carregar Dbedit executando uma funcao !!!

Mensagem por Pablo César »

Rubens, acho que se a questão é manter o DBEDIT e essa função de controle da mesma, você poderia inserir logo no começo da sua função TECLAPESQ a seguinte instrução:

Código: Selecionar todos

FUNCTION TECLAPESQ(nMod)
LOCAL GETLIST := {}, nRecno

IF UPPER(GETACTIVE():NAME)="NOME_DA_VARIAVEL_QUE_PRECISA_F5" // irá devolver o nome da variável ativa
   coloque aqui o chamado ou da rotina que faz o F5
ENDIF
Ou ainda então, modifique em todas as instâncias de dentro da função TECLAPESQ que menciona LASTKEY() por:

Código: Selecionar todos

nKey:=LASTKEY()
IF nKey == 13
    cVar := aCampo[1]
    cVar := &cVar.
    SETCURSOR(0) ; RETURN(0)
ELSEIF nKey == K_INS

// ..//..
// E mantenha esta instrução no inicio da função:
IF UPPER(GETACTIVE():NAME)="NOME_DA_VARIAVEL_QUE_PRECISA_F5" // irá devolver o nome da variável ativa
   nKey:=-4
   nMode:=4
   // daí com isto irá entrar na condicional como se o usuário tivesse pressionado F5
ENDIF
Acredito que não é possível reproduzir a tecla F5 através do KEYBOARD, embora com a função KEYSEND() da CT.LIB funciona. Veja este exemplo:

Código: Selecionar todos

#include "ctscan.ch"

KEYBOARD CHR(-4)
? INKEY(0)
keysend(KS_F5)
? INKEY(0)
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
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Pessoal.. depois de fazer vários testes consegui... resolver com o seguinte:

Estava verificando

Código: Selecionar todos

   
ELSEIF LASTKEY() == K_F5
Tive que altera para

Código: Selecionar todos

ELSEIF LASTKEY() == K_F5 .or. LASTKEY() == 252
Estranho... não.. deveria reconhecer que foi pressionado F5.. estranho é que se não colocar o keyboard e pressionar F5 ele reconhece que pressionou o F5... vai enteder...

Bom o importante é que funcionou....

Obrigado a todos que me ajudaram...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
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á

Carregar Dbedit executando uma funcao !!!

Mensagem por Pablo César »

Estranho... não.. deveria reconhecer que foi pressionado F5.. estranho é que se não colocar o keyboard e pressionar F5 ele reconhece que pressionou o F5... vai enteder...
Acho que é como mencionei na minha msg anterior, com o KEYBOARD não dá para reproduzir o F5, tal é assim que você achou outra simulção 252 (que não é para tecla alguma) e funcionou. Então está bom ! O importante é que você achou uma forma.

Só para desencargo, Rubens experimenta com KEYSEND() para ver se funcionaria...
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
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por alaminojunior »

Se você Rubens, já usa o F5 para abrir a rotina de pesquisa no seu DBEDIT, deve ser porque está usando uma função para controlar o dbedit(), creio eu.

Se for isso, tente o seguinte:
De qualquer forma vai precisar de uma tecla para disparar a função de pesquisa, porém, faça do seguinte modo:

ao invés de:

Código: Selecionar todos

case lastkey() = K_F5
      pesquisa()
tente:

Código: Selecionar todos

   ...
   case modo = 4
        do case
            case isalpha(Chr(lastkey())) .OR. lastkey() > 48 .AND. lastkey() < 58
                   if (lastkey() > 48 .AND. lastkey() < 58)
                      ordsetfocus("indcli01")
                      ord:= 1
                   else
                      ordsetfocus("indcli03")
                     ord:= 3
                  endif
                 Keyboard Upper(Chr(lastkey())) 
                 
Deste modo, como particularmente faço, ao se teclar qualquer tecla numérica, ou alfabética, vc já direciona o fluxo.
Se for numérica, abre o indice por código, se for alfabética, abre indice por descrição.
Em seguida, abre o get correspondente e tchau pardal !!! Fica quase que automático.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por vagucs »

So um detalhe que os amigos esqueceram, chr(-4) se torna um caractere sempre entre 0 e 255, logo, valores negativos ou maiores do que este são transformados em relativos dentro destes limites, as teclas de valores negativos nao podem ser simuladas apenas pela keyboard, para isto precisará de outras rotinas que façam este efeito.
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Re: Carregar Dbedit executando uma funcao !!!

Mensagem por rubens »

Alamino..

Na verdade pretento realmente fazer o que voce mencionou... criar a pesquisa sem que seja pressionada uma tecla qualquer para isso e coloca-la por letra a letra.. o negócio realmente é tempo.. nas pesquisas que fiz no forum antes de abrir o topico tem muitas instruções de como faze-lo.. Agora quanto ao que o Pablo postou vou fazer um teste sim e posto o resultado...Sobre o valores que o vagner comentou eu cheguei ao 252 porque fui depurando e coincidencia ou nao dentro do 0 ao 255 sempre me retornava 252...
Mas voces na acham intrigante que quando realmente pressiona F5 é reconhecido e quando vem via comando keyboard não...

Porque se fizer um teste usando o lastkey() vai resultar 252..

É ruim usar recursos porque "funcionou" e não porque a gente entendeu ou dominou o que aconteceu.. se precisar usar pra outra coisa voce não vai confiar 100% e isso te deixa na mão depois..
Já que o próprio NG informa que o número da tecla F5 é -4 e não 252...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Responder