FoxPro/Visual FoxPro - BUSQUEDA INCREMENTAL.

   
Vista:

BUSQUEDA INCREMENTAL.

Publicado por DALSOM (609 intervenciones) el 15/05/2008 22:14:48
HOLA A TODOS NUEVAMENTE.

ESTOY TRATANDO DE HACER UNA BUSQUEDA DENTRO DE UN TEXTBOX, QUE FUNCIONE DE LA SIGUIENTE MANERA :

DIGAMOS QUE TENEMOS EN UNA TABLA (SQL), LOS VALORES :

DALSOM
DALTOM
DAVID
DARIO
DARIEN

CON SUS RESPECTIVOS IDENTITY.

EN MI TEXBOX, AL DIGITAR CADA LETRA, DEBERA BUSCAR Y PRESENTAR EL NOMBRE COMPLETO, PERO EL SELSTART, O EL CURSOR, DEBERA ESTAR INMEDIATAMENTE DESPUES DE LA ULTIMA LETRA DIGITADA.

POR EJEMPLO, SI DIGITAMOS COMO PRIMERA ENTRADA UNA "D", DEBERA PRESENTAR EN EL TEXTBOX, LA PRIMERA OCURRENCIA DE LOS DATOS QUE COINCIDAN CON EL CRITERIO, O SEA, "DALSOM", Y EL SELSTART, DEBERA ESTAR DESPUES DE LA "D", PARA QUE CUANDO DIGITEMOS, LA SECUENCIA "AR", CAMBIE A "DARIEN", SIN DISTORCIONAR EL VALOR PRESENTADO EN EL TEXTBOX, PARA QUE PUEDA SER LEGIBLE POR EL USUARIO.

HE HECHO VARIOS INTENTOS, PERO NO HE PODIDO LOGRAR MAS ACIERTOS APROXIMADOS, YA QUE SIEMPRE SE ME REPITE UN CARACTER, EL ULTIMO DIGITADO POR MI, DUPLICANDOSE, Y DISTORCIONANDO EL RESULTADO MOSTRADO AL USUARIO.

DIGAMOS ASI, "DDALSOM" , "DALLSOM" O "DALSSOM"

Y NO HE PODIDO ACERCARME MAS AL RESULTADO DESEADO. POR CIERTO, TODO ESTO, PASA EN EL EVENTO KEYPRESSED DEL TEXTBOX .

PODRIAN DECIRME QUE ME FALTA PARA LLEGAR A LA SOLUCION ESPERADA?

GRACIAS DE ANTEMANO.
SALUDOS,
DALSOM.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:BUSQUEDA INCREMENTAL.

Publicado por Pancho (3 intervenciones) el 15/05/2008 22:53:31
Hace lo mismo pero en el interactivechange.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por HELDER MARTINEZ (710 intervenciones) el 15/05/2008 22:55:33
PERO A DONDE MOSTRARAS LOS DATOS QUE BUSQUES CON EL TXTBOX??

YO BUSCO EN UN TXT Y LOS RESULTADOS DE LA BUSQUEDA LOS MUESTRO EN UN GRID ASI;

ESCRIBO ESTE CODIGO EN EL VENTO INTERACTIVE CHANGE....

PUBLIC cBuscar, nBusqueda
cBuscar=ALLTRIM(thisform.pagfClientes.page3.txtBuscar.Value)
nBusqueda=thisform.pagfClientes.page3.opgBuscar.Value

****Busqueda de Inicio o arranque***
SELECT clientes
set filter to
SET FILTER TO UPPER(ALLTRIM(cBuscar))$UPPER(identidad)
GO TOP
thisform.pagfClientes.page3.grdClientes.RecordSource ="Clientes"
thisform.pagfClientes.page3.grdClientes.column1.ControlSource ="clientes.identidad"
thisform.pagfClientes.page3.grdClientes.column2.ControlSource ="clientes.nom_cliente"

YO LO HAGO ASI, TAMBIEN TENGO OTRA FORMA, ME AVISAS SI TE FUNCIONA ESTA.

SALUDES
HELDER MARTINEZ
HONDURAS C.A
YORO YORO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por DALSOM (609 intervenciones) el 15/05/2008 23:08:50
EN EL MISMO TEXTBOX, POR SUPUESTO.

EN EL TEXTBOX, TENGO EL CRITERIO DE BUSQUEDA, Y EL VALOR BUSCADO.

DIGAMOS QUE, A CADA CARACTER AGREGADO O RETIRADO DEL CRITERIO DE BUSQUEDA, VAN APARECIENDO LOS VALORES COINCIDENTES CON MI CRITERIO.

EN EL CASO DEL GRID, FIJATE QUE EL GRID TE DESPLIEGA TODOS LOS VALORES COINCIDENTES CON TU FILTRO DE DATOS, EN MI CASO, SOLO ME INTERESA EL PRIMER VALOR, QUE ES EL QUE DEBO DESPLEGAR EN EL TEXTBOX. SI DIGITO OTRO CARACTER, VUELVE A FILTRARSE NUEVAMENTE, Y A DESPLEGARME NUEVAMENTE UN NUEVO RESULTADO. O EL PRIMER VALOR DE LA LISTA FILTRADA.

GRACIAS POR RESPONDERME,
PERO AUN NO SOLUCIONA EL PROBLEMA.

SALUDOS,
DALSOM.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por DALSOM (609 intervenciones) el 15/05/2008 23:15:58
DE LA FORMA EN QUE LO HACES HELDER, SOLO RES RECOMENDABLE PARA NO MUCHOS DATOS, O CON TABLAS LIBRES, YA QUE CON MUCHOS DATOS, TENDRIAS TEMPORALES MUY GRANDES. NO SE EN TU PAIS, PERO EN EL MIO, ES MUY COMUN QUE LOS CLIENTES, UTILIZEN UN PIII A 500 MHZ O UN P1 A 133 O 150, U OTROS PII A 400 O 450 MHZ, COMO MAQUINA TERMINAL, CON UN WINDOWS XP QUE OCUPA MAS DE LA MITAD DEL DISCO DURO, QUE GENERALMENTE ES DE UNOS 15GB O 20GB COMO MUCHO, Y ADEMAS LE PONEN OFFICE 2003, XP O 2007 EN ALGUNOS CASOS, MAS TU SISTEMA, QUE TAMBIEN NECESITARA ALGO DE ESPACIO.
CON TODOS ESOS INCONVENIENTES, NO ES BUENO UTILIZAR MUCHO ESPACIO DEL DISCO DE LAS TERMINALES.

YO NO RECOMENDARIA UTILIZAR UN SET FILTER, MAS BIEN RECOMENDARIA, UTILIZAR UNA SENTENCIA SELECT. EN MI CASO, UTILIZO SQL Y PATHTRUE.

GRACIAS POR INTENTAR AYUDARME.
DALSOM.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por HELDER MARTINEZ  (710 intervenciones) el 15/05/2008 23:35:25
ESTE CODIGO ME LO ENVIO UN AMIGO AQUI DEL FORO

TAMBIEN LO HAGO POR MEDIO DE UN COMBO

EN EL EVENTO INTERACTIVE CHANGE DEL COMBO ESCRIBO ESTO;

PUBLIC nUltimaTecla, nMostrarValor, nUltimoValorMostrado,;
nUltimaSeleccion, nSeleccionados, cCod_prove

SELECT CLIENTES
lnUltimaTecla = LASTKEY()
lcUltimoValorMostrado = ""
lnUltimaSeleccion = 0
lnSeleccionados = 0

IF (lnUltimaTecla >= 32 AND lnUltimaTecla <= 126)
IF THIS.SELSTART >= 1
lcMostrarValor = SUBSTR(THIS.DISPLAYVALUE,1,THIS.SELSTART-1)+(CHR(lnUltimaTecla))
ELSE
lcMostrarValor = (CHR(lnUltimaTecla))+ALLT(THIS.DISPLAYVALUE)
ENDIF
IF EMPTY(lcMostrarValor)
lcMostrarValor = ALLT(CHR(lnUltimaTecla))
ENDIF
FOR i = 1 TO THIS.LISTCOUNT
IF UPPER(lcMostrarValor) = UPPER(SUBSTR(THIS.LIST(i),1,LEN(lcMostrarValor)))
THIS.DISPLAYVALUE = THIS.LIST(i)
IF LEN(ALLT(THIS.DISPLAYVALUE)) > LEN(lcMostrarValor)
THIS.SELSTART = LEN(lcMostrarValor)
THIS.SELLENGTH = LEN(ALLT(THIS.DISPLAYVALUE))-LEN(lcMostrarValor)
ENDIF



lcUltimoValorMostrado = THIS.DISPLAYVALUE
lnUltimaSeleccion = THIS.SELSTART
lnSeleccionados = THIS.SELLENGTH
RETURN
ENDIF
ENDFOR

ESPERO AYUDARTE
HELDER
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por DALSOM (609 intervenciones) el 16/05/2008 00:45:17
GRACIAS HELDER.

HE TRATADO DE IMITAR EL COMPORTAMIENTO DEL COMBO BOX EN MAS DE 4 HORAS, PARA PODER UTILIZAR ESTE CODIGO QUE ME DISTE, Y HE TRATADO DE ANALIZAR BIEN A FONDO LA PARTE DEL SelStart Y EL SelLenght DEL TEXTBOX, PERO POR NINGUN MOTIVO, ME HA QUERIDO DAR EL VALOR DE DISPLAY CORRECTO, QUE PARA EL TEXTBOX, ES EL MISMO VALUE.

CREO QUE PARA SALIR DEL PROBLEMA TENDRE QUE TOMARLO POR OTRO ENFOQUE, HASTA QUE PUEDA TENER MAS TIEMPO PARA DEDICARLO A INVESTIGAR QUE ESTA PASANDO EN MI CODIGO.

SEGUN VEO, ES UN PROBLEMA DEL SelStart Y EL SelLenght DEL TEXTBOX.

PERO LO QUE SI HARE, Y SE QUE FUNCIONA PERFECTAMENTE, ES UN MIXED CODE DE TU PRIMERA RECOMENDACION, UN TEXTBOX Y UN GRID PARA DESPLEGAR LOS RESULTADOS.

SEGUIRE INDAGANDO Y HACIENDO PRUEBAS HASTA DAR CON EL PROBLEMA.

GRACIAS POR AYUDARME .

SALUDOS,
DALSOM.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por HELDER (710 intervenciones) el 16/05/2008 17:18:53
SI TE RESULTA BIEN, LO COMPARTES AQUI CON LA COMUNIDAD

SALUDES
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por HELDER (710 intervenciones) el 16/05/2008 17:19:11
SI TE RESULTA BIEN, LO COMPARTES AQUI CON LA COMUNIDAD

SALUDES
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BUSQUEDA INCREMENTAL.

Publicado por Gabriel Sánchez (112 intervenciones) el 17/05/2008 19:41:08
Hola: espero esto te sirva:

SET EXACT OFF
SET NEAR ON
SELECT cCursor

vBusca = ALLTRIM(this.Value)
vLen = LEN(ALLTRIM(vBusca)) && ancho de la cadena ingresada

IF !EMPTY(vBusca)
IF SEEK(vBusca)
lcExpFind = ALLTRIM(cCursor.Campo) && 1er dato encontrado

This.Value = lcExpFind && Almacenamos lo encontrado
this.SelStart = vLen && Posicionamos al cursor al final de lo digitado
This.SelLength = LEN(lcExpFind) && Seleccionamos hasta el final
ELSE
MESSAGEBOX('No existen datos coincidentes',48,thisform.Caption)
this.SelStart = vLen - 1
this.SelLength = 1
ENDIF
ENDIF
SET NEAR OFF
SET EXACT ON

Esto en el intercativechange con algunas observaciones.
quizá puede funcionar en el KeyPress.

Suerte.
Gabriel.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar