Ir al contenido


Foto

Componente Buscar y Mostrar mientras escribres


  • Por favor identifícate para responder
13 respuestas en este tema

#1 sysmar

sysmar

    Member

  • Miembros
  • PipPip
  • 11 mensajes
  • LocationMéxico

Escrito 12 noviembre 2009 - 12:07

Hola Delphius,

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

  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 noviembre 2009 - 12:16

Para que te salga exactamente como lo quieres debes es cargar un ComboBox, pero no es recomendado.  La cantidad de registros que manejas es incomodo.

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.
  • 0

#3 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 12 noviembre 2009 - 12:22

Hola
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
  • 0

#4 sysmar

sysmar

    Member

  • Miembros
  • PipPip
  • 11 mensajes
  • LocationMéxico

Escrito 12 noviembre 2009 - 12:37

Lo que sucede en mi caso, es que existen muchos productos que se repiten en sus primeras 4  o 5 letras, y varian en sus restantes 4 o 5 caracteres (codigos con un maximo de 10 caracteres).  El usuario desea que al poner las 4 o 5 letras el sistema Filtre los productos con lo escrito y asi ellos seleccionar mas rapido el producto deseado, actualmente tienen que escribir todo el codigo completo para hacer la busqueda del mismo.

Gracias por sus comentarios
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 noviembre 2009 - 12:42

Hola sysmar,
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.


sql
  1. SELECT ...
  2. FROM ....
  3. 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,

  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 12 noviembre 2009 - 12:46

Pues podrías ir ejecutando la búsqueda en el evento OnChange del TEdit, de ésta manera podrás "filtrar" aquellos registros que tengan coincidencia con lo que escribes...

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 ! :D
  • 0

#7 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 12 noviembre 2009 - 12:50

Hola
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  :D :p.
Espero te sirva, si tienes alguna duda nos lo comentas y con gusto te ayudamos.
Saludos
  • 0

#8 sysmar

sysmar

    Member

  • Miembros
  • PipPip
  • 11 mensajes
  • LocationMéxico

Escrito 12 noviembre 2009 - 01:30

Voy hacer pruebas con sus soluciones.

Muchas gracias
  • 0

#9 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 12 noviembre 2009 - 03:51

Ejemplo con ADO
Usa un Edit para ingresar la búsqueda y en el evento OnChange esto:



delphi
  1. procedure TForm1.Edit1Change(Sender: TObject);
  2. begin
  3.   With ADOQuery do
  4.     begin
  5.       Close;
  6.       SQL.Clear;
  7.       SQL.Add('select * from tabla where campo like '+ QuotedStr('%' + Edit1.Text)
  8.       Open;
  9.     end;
  10. end;



Espero te sirva,

Saludos!
  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 noviembre 2009 - 04:53

Yo desarrollé algo parecido al IntelliSense o code completion de delphi que cuando empiezas a escribir código el te da las opciones que mas se acercan.

: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
  • 0

#11 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 12 noviembre 2009 - 05:15

Interesante Wilson !, yo lo hacía de manera rudimentaria, mostrando y escondiendo un DBGrid posicionado justo debajo del TEdit y que contenía el resultado de un Query (como el que ha publicado Felipe), pero de tu manera suena muy interesante (y)

Ojalá le sirvan las ideas a sysmar...

Saludox ! :D
  • 0

#12 rgstuamigo

rgstuamigo

    Member

  • Miembros
  • PipPip
  • 33 mensajes
  • LocationSanta Cruz-Bolivia

Escrito 16 noviembre 2009 - 08:44

Bueno *-) cada uno tiene su propia forma y su manera de trabajar y resolver su problema en cuestion ,pero creo que deberiamos ver lo bueno y lo malo de cada opcion que algunos han propuesto.
Por ejemplo si la consulta SQL se hace en el evento OnChange ¿Se pueden imaginar cuantas veces se esta haciendo la consulta al servidor? |-) y a eso agrengenle si su aplicacion esta siendo usada por muchos usarios y mucho peor si el servidor se encuentra en un lugar lejano, esto puede llegar a provocar saturacion en la red,un cuello de botella y en algunos casos lentitud.
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. :wink:
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. 8-|
Saludos..a todos...  © (y)



  • 0

#13 cannabis

cannabis

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 257 mensajes
  • LocationMéxico

Escrito 18 noviembre 2009 - 01:39

En las RxLib existe el componente TRxDBLookupCombo. Hace exactamente lo que quieres y lo hace bastante rápido. Lo he probado con queries de poco más de 300,000 registros.


Salud.

  • 0

#14 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 20 noviembre 2009 - 09:10

Coincido con rgstuamigo, lo ideal son los ComboBox o DBComboBox, lo unico que le falto es el posicionarse en la BD cuando seleccione el item deseado, y para eso pueden usar el Locate de delphi (y)
  • 0




IP.Board spam blocked by CleanTalk.