
Componente Buscar y Mostrar mientras escribres
#1
Escrito 12 noviembre 2009 - 12:07
Con la finalidad de hacer seleccion de registro mas amigable a los usuarios, busco un componente que me ayude a mostrar codigos de productos mientras el usuario escribe.
Tengo una tabla con mas de 8,500 productos. Para muchos procesos el usuario debe escribir la clave del producto en un TEdit posteriormente tiene que precionar ENTER (Intro) para que la aplicacion haga la busqueda del mismo.
En algunos programas he visto que mientras se escribe la clave se muestra una ventanita tipo ComboBox que se acerca a registros que comienzan las las letras capturadas.
Si alguien puede darme la idea de que debo utilizar o si Delphi 2007 ya cuenta con algun componente que pueda hacer esto, estare muy agradecido.
Actualmente utilizo TDBLookupComboBox, pero no he podido hacer lo descrito anterirmente.
Saludos
#2
Escrito 12 noviembre 2009 - 12:16
El truco de escribir y darle enter es precisamente para filtrar los resultados y no extraer todos los registros de la BD.
En verdad es mas practico y funcional desde cualquier punto de vista traer los registros ya filtrados.
Pero si aun insistes puedes utilizar el combobox que ya trae ese comportamiento.
#3
Escrito 12 noviembre 2009 - 12:22
Normalmente se una un edit para buscar y un dbgrid para mostrar.
Esto es muy sencillo no se necesita ningun componente, solo se hace con SQL.
Saludos
#4
Escrito 12 noviembre 2009 - 12:37
Gracias por sus comentarios
#5
Escrito 12 noviembre 2009 - 12:42
No es necesario que te dirijas a alguien en particular

Como te comentó Eduarcol, no es muy práctico y deseable traer los miles de registros.
En todo caso se aconseja traer los datos ya filtrados, mediante una consulta SQL.
SELECT ... FROM .... WHERE ....
Al añadir la cláusula where se consigue filtrar los datos.
Luego, si deseas refinar aún más la búsqueda dentro de los resultados puede aplicar un segundo filtrado. Quizá, ya empleando las propiedad Filter y Filtered que poseen todos los datasets.
En resumen:
1. Lanzar una SQL con los datos ya filtrados
2. Para la búsqueda incremental, aprovechar la propiedad Filter y Filtered
Espero que se me entienda.
Saludos,
#6
Escrito 12 noviembre 2009 - 12:46
Como comenta Caral, yo lo pensaría con un DBGrid y una consulta SQL, como te comenté, en el evento OnChange de tu TEdit. Puedes hacer una prueba y medir el rendimiento de esta solución y ver si es lo que necesitas y qué tanto te afecta el hacerlo así...
Saludox !

#7
Escrito 12 noviembre 2009 - 12:50
He colocado en la zona de descargas un ejemplo de como hacer diferentes tipos de filtro, ademas de presentarlos en diferentes componentes.
AQUI esta el ejemplo, la BD es mi querida Access como siempre


Espero te sirva, si tienes alguna duda nos lo comentas y con gusto te ayudamos.
Saludos
#8
Escrito 12 noviembre 2009 - 01:30
Muchas gracias
#9
Escrito 12 noviembre 2009 - 03:51
Usa un Edit para ingresar la búsqueda y en el evento OnChange esto:
procedure TForm1.Edit1Change(Sender: TObject); begin With ADOQuery do begin Close; SQL.Clear; SQL.Add('select * from tabla where campo like '+ QuotedStr('%' + Edit1.Text) Open; end; end;
Espero te sirva,
Saludos!
#10
Escrito 12 noviembre 2009 - 04:53
:Pasos
- Agregar un Form cuyo formStyle sea StayOnTop.
- Sobre el form un DBGrid alineado alClient, apuntando a la consulta en cuestión.
- En la llamada al form debes pasarle las coordenadas del TEdit desde donde lanzas la búsqueda para que este aparezca justo debajo y devolver el foco al TEdit para que puedas seguir escribiendo.
- Lanzar la consulta en el evento OnChange del TEdit (podrías hacer que aparezca solo si la consulta devuelve algún registro, igual podrías limitarla a que aparezca cuando el Length del texto del TEdit sea mayor que 3 o 4 letras).
- Capturar el evento OnClick del grid para pasar el registro escogido al dataset con el que estás trabajando.
- Capturar el evento OnKeyDown del TEdit para que con las teclas arriba , abajo te desplaces por los registros del grid (Consulta.Next, Consulta.Prior).
- Capturar el evento OnKeyPress del TEDit para que al hacer Enter traiga el registro deseado y cierre el form que contiene el grid.
- Recuerda siempre devolver el foco al TEdit.
Arranca a hacerle, y no dudes en preguntar.
Saludos
#11
Escrito 12 noviembre 2009 - 05:15

Ojalá le sirvan las ideas a sysmar...
Saludox !

#12
Escrito 16 noviembre 2009 - 08:44

Por ejemplo si la consulta SQL se hace en el evento OnChange ¿Se pueden imaginar cuantas veces se esta haciendo la consulta al servidor?

Por tal motivo creo que debemos ver la mejor alternativa de como deberia hacerse este proceso de busqueda teniendo en cuenta lo anterior.
Como bien les he dicho antes cada uno tiene su propio mecanismo de solucion y no pretendo decir que mi forma de trabajo es la mejor, al contrario creo que viendo las otras alternativas entre todos podemos aprender.

En lo personal hago uso de las herramientas que el propio Delphi me brinda, para resolver este tipo de problema; yo en este caso utilizaria un ComboBox o un DBComboBox ya que estos componentes poseen las propiedades AutoDropDown y AutoComplete que deberiamos ponerlas en true;esto nos permite que cuando escribamos ALGO, el propio componente desplegara sus item y selecionara uno que coincida con lo escrito, selecionando con azul la parte no coincidente;

Desde luego que deberiamos haber cargado los item con anterioridad ,pero en este caso solo hacemos una sola consulta SQL trayendo los datos y lo añadimos alos item de nuestro ComboBox o un DBComboBox.
Como podran ver de esta manera no estamos saturando ni a la red ni al servidor, ya que se hace una sola consulta SQL.

Desde luego pueden existir otras alternativas que quisas puedan optimizar aun mas la busqueda.

Saludos..a todos... ©

#13
Escrito 18 noviembre 2009 - 01:39
Salud.
#14
Escrito 20 noviembre 2009 - 09:10
