Busqueda SOUNDEX

136 views
Skip to first unread message

Ruben Antunes

unread,
Jul 1, 2014, 9:28:03 PM7/1/14
to mundovis...@googlegroups.com

Buenas noches: una vez mas necesito de la ayuda del foro. Estoy tratando de realizar una rutina que me permita filtrar la existencia de un dato dentro de una tabla de personas. Leyendo, encuentro que la función SOUNDEX se puede aplicar a mi necesidad. Por lo que he leído permite buscar la información exacta o que por fonética sea similar a la buscada.

Esta función es aplicable a MYSQL+VFP, pero no logro hacerla funcionar. Alguien del foro tendrá algún ejemplo o información que me pueda brindar para ver si soluciono o logro realizar mi rutina de búsqueda?

 

La idea es que antes de dar de ALTA un legajo, me permita hacer la consulta de la información que se encuentra en la tabla y que sea igual o aproximada a la que busco.

 

Gracias

Ruben Antunes

Analyzer

unread,
Jul 1, 2014, 10:09:41 PM7/1/14
to mundovisualfoxpro
Que tipo de dato es el legajo?


Saludos!


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Carlos Miguel FARIAS

unread,
Jul 2, 2014, 4:05:39 AM7/2/14
to mundovisualfoxpro

Soundex convierte una cadena de texto en un código que "representa" su sonido, en el caso de fox 4 caracteres (1 letra y 3 números) y en mysql 8 caracteres en total.
En ambos casos es para la pronunciación en inglés.
Si la usas para buscar repetidos, va a darte gran cantidad de falsos positivos, o sea te va a decir "existe" cuando en realidad no lo es.
Funciona contra una palabra (1 nombre sólo)  pero si mal no recuerdo, Fernández y fernando dan igual valor y así muchos casos más.
En mysql puedes usar búsqueda con full texto que si te permite buscar con precisión palabras o conjunto ellas.
Legajo no es un tipo de datos, se denomina así al conjunto de datos que corresponden a una persona, y se usar comúnmente en RRHH.
Saludos: Miguel, La Pampa (RA)

Ruben Antunes

unread,
Jul 2, 2014, 8:00:20 AM7/2/14
to mundovis...@googlegroups.com

En si tengo que hacer lo siguiente:

1.       Para aceptar el ingreso del nuevo registro a la base de datos tengo que poder chequear el apellido y nombre, documento y fecha de nacimiento. Esto es porque la carga la hacen de diferentes estaciones, y por allí cuando cargan el documento el mismo no corresponde (ya sea por error de carga o error intencional de carga). Pero en si, los datos que tengo que buscar a excepción de la fecha son VARCHAR

 

Gracias por responder

Ruben Antunes

unread,
Jul 2, 2014, 8:02:24 AM7/2/14
to mundovis...@googlegroups.com

Gracias por responder. Al legajo lo tengo que dar de alta, luego de haber verificado que no exista el nombre y apellido de la persona que estoy cargando a la base de datos.

Saludos

 

De: mundovis...@googlegroups.com [mailto:mundovis...@googlegroups.com] En nombre de Carlos Miguel FARIAS
Enviado el: miércoles, 02 de julio de 2014 5:06
Para: mundovisualfoxpro
Asunto: Re: [Mundo Visual FoxPro] Busqueda SOUNDEX

 

Soundex convierte una cadena de texto en un código que "representa" su sonido, en el caso de fox 4 caracteres (1 letra y 3 números) y en mysql 8 caracteres en total.

Analyzer

unread,
Jul 2, 2014, 9:35:15 AM7/2/14
to mundovisualfoxpro
>Gracias por responder. Al legajo lo tengo que dar de alta, luego de haber verificado que no exista el nombre y apellido de la persona que estoy cargando a la base de datos.

Am.. Creo que no es muy recomendable hacer eso, ya que siempre habrá personas que se llamen igual con apellidos y todo.

Lo mejor es usar una clave. Por ahi se ha recomendado lo de generar esa clave al momento de grabar los registros, no al iniciar la alta.


Saludos!

Analyzer

unread,
Jul 2, 2014, 9:38:55 AM7/2/14
to mundovisualfoxpro
>Legajo no es un tipo de datos, se denomina así al conjunto de datos que corresponden a una persona, y se usar comúnmente en RRHH.

Por acá le llamamos legajo a un atado de papeles, como puede ser los papeles que componen una póliza de ingresos, por ejemplo.


Pensé que el amigo usaba una "clave" para diferenciar un registro de otro al hacer sus altas. ¿Qué tipo de dato es esa clave? Esa era mi pregunta.

Saludos!

Ruben Antunes

unread,
Jul 2, 2014, 10:06:44 AM7/2/14
to mundovis...@googlegroups.com

Paso a explicar que debo hacer:

El programa lo estoy desarrollando para la Entidad de Rugby (Casa Central), donde trabajo, debe permitir a los Clubes que pertenecen a la Union, cargar los legajos nuevos o jugadores. Pero como se ha empezado a automatizar esta tarea nos encontramos con que nos han estado metiendo jugadores repetidos (CAMBIAN una Letra del Apellido y Nombre, Agregar un numero al documento para que pase como alta ya que el control de existencia lo hago por documento, o nos mienten en la fecha de nacimiento del jugador para que pueda ser incluido en categorías que no corresponden, etc). Entonces la idea es que ellos den de alta al jugador, pero nosotros en la administración antes de darlo de alta controlemos si existe (ya sea porque el nombre ingresado se le parece o el mismo esta con otro documento –son algunos controles que estamos tratando de llevar a cabo). Si el SOUNDEX me soluciona el problema de búsqueda aproximada por alguno de los campos de la tabla (ya que por fonética podríamos llegar a encontrar nombre de jugadores similares) para poder verificar si damos o no de alta al jugador dentro de la base de datos, estaría genial. Lo que necesito es ver si me pueden pasar un ejemplo de cómo poder utilizar la función.

 

Tambien trate de filtrar información utilizando el comando LIKE, pero al momento de realizar o ejecutar la rutina me dice que no esta bien armada la sentencia: adjunto ejemplo

 

_apellido=’ABALLAY’

_BuscarDato= "like(?_apellido, t1.apellidos)=.T."

cMiSql="SELECT t1.id_persona,t1.apellidos,t1.nombres,t1.documento,t1.sexo,t1.fnacim,' ' AS Club, ' ' AS Categoria FROM personas t1 "+;

      "WHERE "+_BuscarDato

 

Pero tampoco me anduvo. A todo esto, la búsqueda o la información que he tratado de utilizar como prueba en la rutina es de tipo VARCHAR –como muestro en el ejemplo he querido utilizar el APELLIDO como prueba. Y hago referencia al LEGAJO (porque necesito grabar el conjunto de datos que conforman el LEGAJO).

Saludos

Ruben Antunes

 

De: mundovis...@googlegroups.com [mailto:mundovis...@googlegroups.com] En nombre de Analyzer
Enviado el: miércoles, 02 de julio de 2014 10:39
Para: mundovisualfoxpro
Asunto: Re: [Mundo Visual FoxPro] Busqueda SOUNDEX

 

>Legajo no es un tipo de datos, se denomina así al conjunto de datos que corresponden a una persona, y se usar comúnmente en RRHH.

Analyzer

unread,
Jul 2, 2014, 10:45:04 AM7/2/14
to mundovisualfoxpro
Creo que like '%Cadena a buscar%' solucionaría el problema.

Revisa esto por favor:

Cual es la sintaxis correcta del LIKE con MySql y VFP


Saludos!

Carlos Miguel FARIAS

unread,
Jul 2, 2014, 12:22:59 PM7/2/14
to mundovisualfoxpro
La solución tiene que ser pro-activa y no reactiva.
O sea, la dirigencia de la Unión, debe indicar que si se envían datos con error de documento, puede sancionar al emisor con perdida de puntos, u otras que se les ocurra, lo mismo para el dato de la fecha de nacimiento. O sea que el error lo generan porque no tienen castigo correspondiente.

Judicialmente no pueden reclamar nada, si un jugador dice ser Fulano doc 12345678 y lo incluyen en un partido, y el Fulano era 12365487, en el partido, en lugar de un jugador, es un intruso y cabe una sanción de un jugador mal incluido.

Los errores en apellido y nombre ya son más difíciles de evitar por el emisor (Perez y Peres son válidos, uno es de origen español, el otro judío, el que toma el dato, posiblemente ponga Perez en lugar de Peres y es un error normal).

Que controles se pueden hacer?

DOCUMENTO:
Que no exista primero, y luego que cierre con la fecha de nacimiento.
En la Argentina, en general, se puede establecer un paralelismo entre rangos de números de documentos y año de nacimiento, entonces, por ejemplo si el documento esta en el rango 34 millones, el fulano habría nacido en 1984, 1985 (eso lo podes chequear contra fechas de nacimiento fehacientes o preguntando en el registro civil o equivalente).

NOMBRES
Los nombres los pueden cargar en diferente orden, entonces, con comparación completa o soundex, van a estar diferentes.
Como dije antes, el soundex no te garantiza, solo que suene parecido.
Un Full text en mysql (vfp no lo tiene) te permite detectar si los nombres ya están incluidos, sin importar en que orden, porque te controla uno a uno.
Para evitar trampas con "errores" en los nombres, cada nombre, antes de mandarlo a la base de datos, chequear que exista en una lista de nombres válidos (lo podes bajar de Internet), si aparece un nombre no incluido, mandar una alerta y rechazar como error, si luego el nombre resultara "aceptable", se agrega al diccionario y listo, lo mismo con apellidos.
En tablas nativas, es más engorroso, tendrías que agregar a tu tabla un campo de "nombre ordenado", que es eso? un campo de cadena, donde colocas el nombre entrado en orden alfabético.
O sea si el dato entrado es: ZANOLA AGUIRRE, FABIAN AARON, eso lo dejas en el lugar de nombre (normal) y en nombre ordenado guardas AARON AGUIRRE FABIAN ZANOLA, entonces comparando así, podes detectar mejor los duplicados.
Pero insisto, las pruebas que he hecho con soundex, no te permiten un buena granularidad de clave (en si, el soundex es similar a un hash pero con menor cantidad de claves) vas a tener gran cantidad de falsos positivos.
Además los nombres repetidos no sería algo anormal
Recuerdo que en mi facultad, con menos de 300 docentes supo haber tres con igual nombre y apellido, y no eran ni parientes.

FECHA DE NACIMIENTO:
Solo se puede cruzar contra el número de documento, como indique previamente. Siguiendo el ejemplo si el Fulano dice ser clase 90 y tiene un #doc de un clase 89 o 91, podría ser aceptable (con alerta de verificación posterior).

En fin, esto es lo que se me ocurre.
Saludos: Miguel, La Pampa (RA) 

Ruben Antunes

unread,
Jul 2, 2014, 12:42:58 PM7/2/14
to mundovis...@googlegroups.com

Gracias Miguel: mas que aceptable y muy bien detallado lo que me has indicado. Entendi a la perfeccion todo lo que explicas. Ahora tendras:

1.        algún ejemplo del comando FULLTEXT al que haces referencia, que existe en MYSQL y no asi en VFP para probar varias variantes?

2.       Algún ejemplo aunque mas no sea para ver su funcionamiento del comando SOUNDEX?

3.       Existe alguna rutina que te permita determinar el rango de documentos dentro del rango de fecha de nacimiento?

 

De todas maneras te agradezco de corazón por tu explicación tan bien detallada.

Y por último, como ARGENTINO que somos. VAMOS CARAJO…. (tenia que decirlo, y desahogarme, ayer nos tuvieron con el corazón en la boca).

 

Un saludo a todos los presentes y quienes ayudan en este foro.

Abrazos

Ruben Antunes

Ruben Antunes

unread,
Jul 2, 2014, 12:44:06 PM7/2/14
to mundovis...@googlegroups.com

Gracias Analyzer, ya me quedo funcionando el comando LIKE

Analyzer

unread,
Jul 2, 2014, 12:52:41 PM7/2/14
to mundovisualfoxpro
Por nada. Gracias a ti por compartir la solución!


Saludos!

Víctor Hugo Espínola Domínguez

unread,
Jul 2, 2014, 2:49:32 PM7/2/14
to mundovis...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages