Hola otra vez al foro... Quiero realizar una busqueda indexada por nombre en un fichero de clientes. Lo he realizado a traves de un get, cada vez que pulsas una letra hago una llamada a una funcion donde selecciono el fichero y hago un dbseek por medio de ON CHANGE LOCALIZA(OTBR,CTEXTO) en el get. Mi problema es que cuando el metodo ON CHANGE se activa no entra el ultimo caracter del get ¿Hay algun otro metodo, que me reconozca cada entrada de caracter y lo pueda mandar a LOCALIZA(OTBR,CTEXTO)?.
MUCHAS GRACIAS.
/*
Programa := Zpda.prg
Autor := Juan Zapata
Fecha := 19/07/2006
Descripcion := Aplicacion para comerciales de autoventa y reparaciones.
*/
#include "FWCE.ch"
#DEFINE DBF_LON 10
#DEFINE DBF_CLIENTES 1
#DEFINE DBF_ARTICULOS 1
#DEFINE DBF_FAMILIAS 1
STATIC OWND, ADBF, ORAD, CTEXTO, NRECNO, OGET1
*--------------
FUNCTION Main()
*--------------
LOCAL OBMP
CONFIG()
ABRIR_FICHEROS()
DEFINE BITMAP OBMP NAME 'SUMASOL'
DEFINE WINDOW OWND TITLE "Z MAXPOWER PDA"
ACTIVATE WINDOW OWND;
ON PAINT OWND:SAYBITMAP (0,0,OBMP);
ON INIT CONTROL()
DBCLOSEALL()
OBMP:END()
RETURN 0
*-----------------------
FUNCTION Config()
*-----------------------
HB_LANGSELECT( "ESWIN" )
SET DELETED ON
SET DATE TO ITALIAN
SET SOFTSEEK ON
SET CENTURY ON
SET EPOCH TO 2000
Hb_SetCodePage ('ESWIN')
RETURN NIL
*-----------------------
FUNCTION CONTROL()
*-----------------------
LOCAL ODUMMY
* shfullscreen(ownd:hwnd,shfs_showsipbutton)
@ 0,0 BTNBMP NAME "EXIT" SIZE 40,40 OF OWND;
ACTION IF(MSGYESNO('Desea salir ?', 'Sistema'), OWND:END(),)
@ 0,40 BTNBMP NAME "CLIENT" SIZE 40,40 OF OWND;
ACTION SEL_CLIENT()
@ 0,200 BTNBMP NAME "INFO" SIZE 40,40 OF OWND
@ 0,0 BTNBMP ODUMMY NAME "" SIZE 240,40 OF OWND
ODUMMY:DISABLE()
RETURN NIL
*---------------------------
FUNCTION SEL_CLIENT()
*---------------------------
LOCAL ODLG, OFONT, OTBR
SELECT CLIENTES
SET ORDER TO 0
HIDEKEYBOARD()
ORDEN_BUSQUEDA(OTBR)
DEFINE FONT OFONT NAME 'ARIAL' SIZE 0, -10
DEFINE DIALOG ODLG RESOURCE "SELEC_CLI"
REDEFINE LISTBOX Otbr FIELDS CLIENTES->CCODCLI, CLIENTES->CNOMCLI, CLIENTES->CPOBCLI, CLIENTES->CTFO1CLI, CLIENTES->CTFO2CLI;
HEADERS "CODIGO", "NOMBRE","POBLACION","TELEFONO 1", "TELEFONO 2";
COLSIZES 50,180,140,100,100;
ID 130 OF ODLG
OTBR:BCHANGE:={|| (NRECNO := CLIENTES->(RECNO() ))}
OTBR:NCLRPANE := {|| IIF ( CLIENTES->(ORDKEYNO()) % 2 == 0 ,RGB(193,221,255),RGB(221,245,255) )}
REDEFINE BUTTON ID 110 OF ODLG ACTION ODLG:END()
REDEFINE BUTTON ID 120 OF ODLG;
ACTION (NRECNO:=CLIENTES->(RECNO()), ODLG:END())
REDEFINE RADIO ORAD;
ON CHANGE ORDEN_BUSQUEDA(OTBR);
ID 140,150 OF ODLG
REDEFINE GET OGET1 VAR CTEXTO;
ID 170 OF ODLG;
ON CHANGE LOCALIZA(OTBR,CTEXTO)
ACTIVATE DIALOG ODLG CENTERED
RETURN NRECNO
*---------------------------
FUNCTION ORDEN_BUSQUEDA(OTBR)
*---------------------------
* COMPROBANDO RADIO BOTON Y ASIGNANDO BUSQUEDA INDEXADA A CLIENTES*****
IF ORAD=1
SELECT CLIENTES
SET FILTER TO
SET ORDER TO 2
OTBR:REFRESH()
ENDIF
IF ORAD=2
SELECT CLIENTES
SET FILTER TO
SET ORDER TO 1
OTBR:REFRESH()
ENDIF
RETURN NIl
*---------------------------
FUNCTION LOCALIZA(OTBR,CTEXTO)
*---------------------------
SELECT CLIENTES
SET FILTER TO
SET ORDER TO 1
DBSEEK (CTEXTO)
OTBR:REFRESH()
RETURN NIL
*---------------------------
FUNCTION ABRIR_FICHEROS
*---------------------------
IF .NOT. USED("CLIENTES")
USE (CURDIR()+"\CLIENTES.DBF") NEW
ENDIF
INDEX ON CLIENTES->CCODCLI TO("CLIENTES.CDX")
INDEX ON CLIENTES->CNOMCLI TO ("CLIENTES.CDX")
RETURN 0
PROBLEMAS CON UN GET!
-
- Posts: 287
- Joined: Fri Apr 14, 2006 5:52 pm
- Location: Córdoba (España)
Voy a comprobar una cosa!!
Hola jhony
En fivewin for harbour pasaba lo mismo, alguien puso un post solucionando el tema, lo que pasa es que usa una función que no se si funcionará en fwppc, de todas maneras te escribo el nombre de la funcion de como quedaria tu funcion LOCALIZA:
Function Localiza(cKey,oTbr,nKey)
Local nSeekrec:=0,xTbr
xTbr:=oTbr
nSeekec:=recno()
if GetASyncKey(VK_BACK) --> Esta es la funcion
cKey:=substr(cKey,1,Len(cKey)-1)
end if
seek upper(cKey) softseek
if !found()
go nSeekRec
end if
xTbr:Refresh()
return
El método ON CHANGE de tu get quedaría asi:
ON CHANGE (Self:Assign(),Localiza(""+substr(oGet1:cText,1,Self:nPos-1) + upper(chr(nKey)),oTbr,nKey))
Revisa parentesis
Si tienes algun problema me lo comentas
En fivewin for harbour pasaba lo mismo, alguien puso un post solucionando el tema, lo que pasa es que usa una función que no se si funcionará en fwppc, de todas maneras te escribo el nombre de la funcion de como quedaria tu funcion LOCALIZA:
Function Localiza(cKey,oTbr,nKey)
Local nSeekrec:=0,xTbr
xTbr:=oTbr
nSeekec:=recno()
if GetASyncKey(VK_BACK) --> Esta es la funcion
cKey:=substr(cKey,1,Len(cKey)-1)
end if
seek upper(cKey) softseek
if !found()
go nSeekRec
end if
xTbr:Refresh()
return
El método ON CHANGE de tu get quedaría asi:
ON CHANGE (Self:Assign(),Localiza(""+substr(oGet1:cText,1,Self:nPos-1) + upper(chr(nKey)),oTbr,nKey))
Revisa parentesis
Si tienes algun problema me lo comentas
Hola Mike, muchas gracias otra vez. He probado la funcion que me dices y a cambiar LOCALIZA, pero me da un error. Me dice que no existe la variable VK_BACK...Donde me he perdido?. o esque no funcionara en fwppc.
De todas formas Mike, mi codigo funciona para hacer la busqueda, lo unico que sucede es que el evento ON CHANGE cuando se produce, la variable CTEXTO no to toma el ultimo valor introducido. Esto en Delphi, estaria tirao! con un evento ON KEYPRESS, Pero aqui no puede ser así, por lo que veo...Seguire dandole vueltas...
De todas formas Mike, mi codigo funciona para hacer la busqueda, lo unico que sucede es que el evento ON CHANGE cuando se produce, la variable CTEXTO no to toma el ultimo valor introducido. Esto en Delphi, estaria tirao! con un evento ON KEYPRESS, Pero aqui no puede ser así, por lo que veo...Seguire dandole vueltas...
- Biel EA6DD
- Posts: 680
- Joined: Tue Feb 14, 2006 9:48 am
- Location: Mallorca
- Contact:
VK_BACK es un define.
O bien incluyes vkey.ch, o haces el define
O bien incluyes vkey.ch, o haces el define
Code: Select all
#define VK_BACK 8