Necesito ayuda de programación para mi aplicación en Delphi

Hola expertos.
Esta pregunta es más de programación y la pongo acá porque mi aplicación esta hecha en delphi. :)
El caso es el siguiente:
Tengo una Tabla T que tiene digamos 2 campos y uno de ellos es de un tipo cadena de 500 caracteres ( campo2: string[500])
El usuario introduce una cadena del mismo tamaño ( En realidad es una cadena generada randomicamente ) y yo quiero realizar una búsqueda en la base de datos y encontrar la cadena más similar a la que introdujo el usuario.
Parecería que con un ordenamiento y una búsqueda binaria funcionase, pero no es así, por ejemplo con los siguientes datos
C_Usuario: 11114589999934567
C_BD1: 11114489121232345
C_BD2: 11117947999934567
C_BD3: 11118789999934567
La búsqueda nos daría como resultado que el código aproximado al introducido por el usuario es el primero (C_BD1) pero en realidad el que se busca es el tercero (C_BD3) porque es el más parecido al introducido por el usuario.
Tampoco es efectivo una busqueda caracter por caracter, por ejemplo en el siguiente caso:
C_Usuario: 11114589999934567
C_BD1: 11114467121232345
C_BD2: 11117947999934567
C_BD3: 11118767999934567
C_BD4: 11114589999934511
C_BD5: 11114578999934556
La cadena más próxima a la introducida por el usuario es la quinta (C_BD5)... La C_BD4 es la más parecida pero por ubicación de los caracteres (Diferencia de los últimos dos caracteres)pero la C_BD5 es la más parecida porque toda la cadena es casi igual ( C_Usuario: 11114589999934567 - C_BD5: 11114578999934556, es parecida en el valor numérico de los caracteres y ESO ES LO QUE SE BUSCA)
Espero que me ayuden si alguna vez tuvieron un problema parecido, yo pienso que debe existir un algoritmo de búsqueda por aproximación en el que no se busca un elemento exactamente igual en una lista sino que se busca el elemento más parecido (y claro si es igual mucho mejor).
Gracias por la lectura, espero que me ayuden.

1 respuesta

Respuesta
1
A ver si entendí tu problema, si tu tienes query o un table donde te arroja esta información, y tu quieres buscar la cadena digamos PartialKey haces lo siguientes:
Suponiendo que tienes un TQuery
Query1.Locate('NombreCampo',Edit1.Text,[loCaseInsensitive,loPartialKey]);
Y listo si esta linea la pones en OnChange del Edit1 veras como te empieza a buscar y posicionar cada vez que tecles un carácter.
Gracias por tu ayuda pero yo no quiero hacer una búsqueda exacta sino que en caso contrario que no encuentre la cadena buscada (Caso que va ocurrir en el 100% de las veces en mi Aplicación, porque de eso se trata.) Devuelva como resultado la cadena más parecida a la que estoy buscando (Según los criterios que pongo en mi pregunta).
Si sabes como hacerlo espero que me ayudes, gracias.
Bueno mira, para empezar el código que te envíe de .Locate no es una búsqueda exacta, pero tampoco te busca en cualquier parte del texto, es decir lo que te envíe lo que hace es irte posicionando sobre la cadena que más se parece por ejemplo tienes un campo que se llama numero el cual tiene los siguientes regisros:
123
145
142
Cuanto tu tecles el numero 1 se posicionara sobre el primer registro que tiene 1 en este caso (123) luego si presionas 4 se posicionara en este caso en el registro (145) si me explico la búsqueda es parcial.
Ahora lo de buscar en cualquier parte del texto no se puede hacer tan sencillo, pero ahí te va un tip:
Son dos maneras posibles:
1.-Búsqueda con un Filtro los filtros a aun query en delphi pueden llevar comodines de búsqueda si tu pones por ejemplo '%AAA' esto te buscara 3 A en cualquier parte del texto sin contar con la primera letra, lo menejas igual que el *.exe por ejemplo si me explico
La sintaxis es Query.Filter := '%asd';
Ahora hay una restricción aparentemente solo funciona para tipos String.
2.- La otra manera seria con SQL, es decir tu tienes tu query, y debes tener igual es decir igual que te traiga los mismos registro pero este ultimo debe tener una clausula where donde hagas la búsqueda y la harás con LIKE 'sss%' entonces cuando localices un registro agarras el ID de ese registro y haces un locate a tu query que te esta mostrando la información la sintaxis para tu SQL es la siguiente:
select * from Personas
where Nombre like :Parametro
Ahora si no quieres quebrarte la cabeza busca unos componentes llamados InfoPower estos traen un componentes de búsqueda, donde solo los conectas a tu Query o DataSet y listo ya el componente te opciones de buscar algo directo, parcial y buscar en cualquier parte del campo, también buscar por rangos cuando sean números etc... muchas más.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas