Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Busquedas por cualquier criterio, sin especificar ninguno (https://www.clubdelphi.com/foros/showthread.php?t=41122)

Wonni 07-03-2007 23:13:24

Busquedas por cualquier criterio, sin especificar ninguno
 
Hola;

Vereis, es que estaba pensando como poder hacer busquedas al estilo de Windows Media 11. Si buscas en la biblioteca de medios, en un campo escribes algo, y conforme escribes va filtrando. Pero esque va super-rapido.

Esto lo haria en el evento OnChange, si, pero ¿como hacer para buscar por cualquier criterio, sin especificar dicho crieterio?

En un programa Tpv que tengo en unas tiendas de ropa, ya hice algo parecido, pero no se si se podra hacer de otra forma. En el Tpv tengo un Edit en el cual el usuario puede introducir directamente Ean, Referencia o Codigo propio sin especificar nada. El programa hace una busqueda en una tabla que cree para ello donde se almacenan 2 datos: El string para la busqueda (ean, ref o id) y el id del articulo. Pero, no se como hacer para que por ejemplo en el caso de tratarse de libros, que buscara editorial. Y es que las editoriales ( los nombres ) no estan en la tabla de libros, si no el codigo.

La busqueda en Windows Media 11, me gusta mucho. Escribes por ejemplo: "Bad" y te muestra las canciones que contengan la palabra Bad, pero ademas si un album se llama asi, muestra tambien el album entero. Si escribes una fecha muestra los albumes con dicha fecha y si algun titulo de album o cancion contiene ese numero, pues tambien. Y si escribo "Bad smoth criminal" muestra el tema smoth criminal que esta dentro del disco Bad.

Esque si utilizo la misma formula que tengo en el T.p.v. para los libros, me da que seria demasiado. Se crearia una tabla inmensa. Por que por ejemplo para los titulos de los libros, cada palabra deberia de almacenarla y referenciarla al id del libro. Y lo pero que veo es el tema de campos que son codigos, como la editorial.

Alguna idea. ¿Alguien utiliza una tabla de esta manera para busquedas?

basti 08-03-2007 12:50:11

Se me ocurre algo así:

Código SQL [-]
  select * from Libros 
  left outer join Editoriales on (Libros.Editorial = Editoriales.Codigo) 
  where Libros.Titulo like :Busqueda or Editoriales.Nombre like :Busqueda

luego en delphi:
Código Delphi [-]
  Query.ParamByName('Busqueda').AsString := Edit1.Text + '%';
  Query.Open;

Wonni 08-03-2007 17:58:58

Gracias basti;

Pero me da el siguiente error:

"Type mismatch in expression"

Las tablas son dBase. Perdon, he debido decirlo antes.

vtdeleon 08-03-2007 18:04:29

Cuando te dá ese error es proque estas tratando de involucrar dos tipos de datos distintos. Asegurate que si un campo es de tipo Varchar, String, Integer, Numeric,...etc, estos coincidad el valor que le enviaras por medio del Parametro (AsString, AsInteger, AsFloat,...)

Saludo

Wonni 08-03-2007 18:59:42

Gracias vtdeleon;

Efectivamente ese era el error.

Ahora funciona, pero me pregunto yo si sera posible hacer lo siguiente:

Dados estos 3 titulos, por ejemplo:

DELPHI MOLA ! ( EDIT: ANAYA )
MOLA DELPHI ! ( EDIT: ANAYA )
BIBLIA DE DELPHI ( EDIT: EVEREST ).

Si escribo en el edit de busqueda: "ANAYA" muesta los 3. Si escribo EVEREST, muestra el ultimo. Pero si escribo: "DELPHI MOLA", aparace solamente el primero. Y yo lo que quisiera conseguir es que mostrara DELPHI MOLA Y MOLA DELPHI.
Y otro caso es si escribo: "ANAYA DELPHI", que me mostrara los dos de ANAYA en cuyo titulo aparece la palabra DELPHI.

Volviendo al Windows Media y las busquedas en la biblioteca:

Hay 3 Albumes donde hay canciones que tienen la palabra "Bad". 2 son de Scorpions y 1 de Michael Jackson. Pues bien, en el campo de busqueda, yo escribo "bad" y muestra:
El disco de Michael que se llama Bad ( este lo muestra completo ) y las 2 canciones de los 2 discos de Scorpions ( solo cada cancion, no el disco. puesto que el disco no se llama Bad).
Si sigo escribiendo: "bad smooth criminal" entonces, muestra la cancion smooth criminal del disco bad.
Fijaros, que no hay ningun disco que se llame "bad smooth criminal" ni ninguna cancion que se llame a si. Osea, que busca por palabras separadas, no la cadena.

Si escribo "Anaya Delphi", claro, no sale nada. No existe ninguna editorial llamada "Anaya Delphi" ni ningun titulo.

Con el codigo de Basti, funciona, pero toda la cadena. Le he añadido '%' antes del Edit para buscar la cadena en cualquier posicion.

No se si me he expliado bien con tanto Bad y Smooth :D pero para entenderlo mejor, podeis mirar aqui

vtdeleon 08-03-2007 22:56:46

Saludos

Una vez hice una chorrada de código para hacer búsquedas parecidas a como lo hace Winamp con los mp3. Mira a ver si te funciona, aunque te advierto que no está muy optimizado ni nada, y que creo que se podría mejorar, pero ahí tienes un avance.

http://www.clubdelphi.com/foros/show...ghlight=winamp
http://www.clubdelphi.com/foros/show...ghlight=winamp

aledieb 09-03-2007 13:54:26

tenes que agregar un % mas

Ejemplo:

Código Delphi [-]
Query.ParamByName('Busqueda').AsString := '%' + Edit1.Text + '%';

incluso agregaria:

Código Delphi [-]
Query.ParamByName('Busqueda').AsString := '%' + trim( Edit1.Text ) + '%';

fjcg02 10-03-2007 00:10:34

Creo que necesitas mirar el proyecto MUTIS de mamcx.
Si no recuerdo mal, así como por encima, es un motor de busquedas.

Suerte.

Wonni 12-03-2007 23:40:01

Cita:

Empezado por vtdeleon
Saludos

Una vez hice una chorrada de código para hacer búsquedas parecidas a como lo hace Winamp con los mp3. Mira a ver si te funciona, aunque te advierto que no está muy optimizado ni nada, y que creo que se podría mejorar, pero ahí tienes un avance.

http://www.clubdelphi.com/foros/show...ghlight=winamp
http://www.clubdelphi.com/foros/show...ghlight=winamp

He probado ese codigo y me muestra el siguiente error:

"Capability Not Supported"

Wonni 12-03-2007 23:59:41

1 Archivos Adjunto(s)
un pequeño .dpr con el codigo:

vtdeleon 13-03-2007 00:02:17

Dónde te da el error?

Saludo

Wonni 13-03-2007 01:13:20

Al escribir en el Edit

vtdeleon 13-03-2007 02:04:59

Que base de datos usas?

Creo que yo lo habia hecho para interbase.

Wonni 13-03-2007 17:05:41

Cita:

Empezado por Wonni
Las tablas son dBase. Perdon, he debido decirlo antes.

Esque el programa donde me interesa implementar esta busqueda lo tengo hecho con dBase.

Hoy ya no me da tiempo, pero mañana lo pruebo con interbase.

Wonni 14-03-2007 17:02:53

Lo estoy probando con Interbase y al escribir en el Edit me da este error:

List index out of bounds(2)

vtdeleon 14-03-2007 19:30:13

Vaya, :( como había dicho antes "es una chorrada de codigo".

El error viene del TStringList. Pero la idea que tenia en ese momento era usar containing para la búsqueda, en vez de Like.

Delimitar el Stringlist por espacio, asi la cadena dada por el edit estará separada por palabra. Entonces por cada palabra que haya, agregar una linea de búsqueda.


La franja horaria es GMT +2. Ahora son las 07:54:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi