Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Busqueda Similar?? (https://www.clubdelphi.com/foros/showthread.php?t=52842)

farrop 01-02-2008 14:00:21

Busqueda Similar??
 
Hola a todos.
Estoy haciendo un ABM Cliente con PostgreSQL 8.2, sencilo verdad, pero lo que quiero hacer es que no me permita cargar clientes con nombres iguales (tambien facil) o parecidos (ahi el problema).
Por ejemplo, si cargo
Código:

"Manuel Gonzalez Espinosa"
, y vieno otro y quiere cargar
Código:

"Manuel Gonzalez Espinoza" (con z al final)
que me avise que ya hay cargado uno muy parecido, y q verifique si no se trata de la misma persona, pues la diferencia es solo una letra y eso ya hace la diferencia si comparo campos iguales, lo mismo si cargo
Código:

"Gonzalez Espinosa, Manuel"
la unica diferencia en la disposicion de nombres.
Intente hacer con un like, pero, me aparecen todos los que se llaman Manuel, sim importar el apellido, o no me encuntra las diferencias como la s por la z o vocales con acentos.
Si hay forma de resolverlo, me gustaria q me ayudaran.
Saludos
Farrop;)

Delphius 01-02-2008 15:05:29

Cita:

Empezado por farrop (Mensaje 262621)
Hola a todos.
Estoy haciendo un ABM Cliente con PostgreSQL 8.2, sencilo verdad, pero lo que quiero hacer es que no me permita cargar clientes con nombres iguales (tambien facil) o parecidos (ahi el problema).
Por ejemplo, si cargo
Código:

"Manuel Gonzalez Espinosa"
, y vieno otro y quiere cargar
Código:

"Manuel Gonzalez Espinoza" (con z al final)
que me avise que ya hay cargado uno muy parecido, y q verifique si no se trata de la misma persona, pues la diferencia es solo una letra y eso ya hace la diferencia si comparo campos iguales, lo mismo si cargo
Código:

"Gonzalez Espinosa, Manuel"
la unica diferencia en la disposicion de nombres.
Intente hacer con un like, pero, me aparecen todos los que se llaman Manuel, sim importar el apellido, o no me encuntra las diferencias como la s por la z o vocales con acentos.
Si hay forma de resolverlo, me gustaria q me ayudaran.
Saludos
Farrop;)

Hola farrop,
Un tema bastante similar fue tratado en los foros. No recuerdo bien como se ha llegado a la solución, no te sabría decir si emplear LIKE es una buena opción.
Yo recomendaría que no sea el motor de base de datos quien asuma esta responsabilidad. Déjala que la asuma tu aplicación.

Parte de tu problema/solución se puede conseguir con esto.

Saludos,

hecospina 01-02-2008 15:19:19

Hola

No crees que es mas facil hacer la validacion por una llave primaria o unica, como un codigo ?

Por ejemplo la identificacion personal

En Colombia usamos el documento que es la cedula de ciudadania, unica para cada uno de nosotros, en otros lugares el el numero del seguro social, o la licencia de conduccion

Si se adiciona primero este codigo sera mas facil controlar que no esten duplicados

Delphius 01-02-2008 15:33:06

hecospina, tienes razón. Si se emplea el DNI o algún codigo como ese que es único basta y sobra...

Pero quien sabe... puede que por algún motivo no se le permita tener registrado el DNI, NIF, etc. En este caso se podría crear una clave para persona con algún algoritmo Hash.

Saludos,

juanelo 01-02-2008 15:47:00

Que tal,
Miral lo yo hago para cuando quiero hacer esto o algo parecido es colocar en el edit del nombre una funcionalidad que lo que hace es filtrando los nombres de los clientes a medida que se va tecleando, de esta manera el usario visualmente se va dando cuenta si existe un(os) nombre(s) parecido.

Coloco hasta abajo un Grid (en realidad manejo el cxGrid de devExpress) y ahi voy "recortando" la informacion a medida que se teclea.

Ventaja de este metodo, es que de manera "intuitiva" el usuario se da cuenta.
Desventaja, es que hay que cargar con todos los registros de la tabla en este caso de clientes, pero normalmente (al menos en mis aplicaciones) los clientes no pasan de por lo regular de unos 20,000 lo que con firebird y devExpress no representa mayor problema.

Saludos

farrop 01-02-2008 18:04:31

Busqueda Similar
 
Hola otra vez.
Como clave principal uso un ID numerico, podria usar algo como el DNI, aca es el RUC, pero hay varias personas que utilizan dos o mas veces su RUC (para hacer compras) para tener detallado en que concepto lo usan, pero eso no va al caso.
El tema es que cuando viene un cliente no ocacional, el usuario busca si esta cargado, y no revisa con atencion y como no encontro a simple vista, ya carga otro cliente, produciendose asi muchos clientes repetidos,pero con solo una letra distinta, teniendo asi:

Código:

Manuel Gonzalez Espinoza
Manuel Gonzalez Espinosa
Gonzalez Espinosa, Manuel
Manuel González Espinoza

Es por eso que quiero que al dar de alta a un cliente nuevo, busque si hay parecidos para no duplicarlo.

Me gusta mucho el metodo de "Delphius", lo voy a probar, y tambien el de "juanelo", y veo cual es mas efectivo.

¿¿Lo que aun me gustaria saber es si hay forma de hacer la Distancia entre palabras (Algoritmo de Levenshtein) mediante SQL solamamente?? o algo similar

Muchas gracias por su ayuda.:)

Héctor Randolph 01-02-2008 20:57:20

Cita:

Empezado por farrop
¿¿Lo que aun me gustaria saber es si hay forma de hacer la Distancia entre palabras (Algoritmo de Levenshtein) mediante SQL solamamente?? o algo similar

Puedes implementar la función en PL/SQL dentro de la B.D. Te dejo este enlace http://www.clubdelphi.com/foros/showthread.php?t=50441

Trabajé con una B.D. de Oracle con más de 100,000 personas registradas, elaboré una búsqueda por aproximación con el Algoritmo de Levenshtein.

Al principio resultó muy lento, pero fui refinando la búsqueda. Construí tres tablas auxiliares para el nombre y los apellidos. Estas tablas funcionan como índices sobre los cuáles hago la búsqueda.

Finalmente el resultado fue aceptable, la búsqueda en el peor de los casos tarda alrededor de 5 segundos.

No descartes la idea del algoritmo de Levenshtein, pero advierto que es necesario algo de trabajo para obtener buenos resultados.

Saludos


La franja horaria es GMT +2. Ahora son las 20:49:31.

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