locked
Consulta - Busqueda de Patrones

    Question

  • Buenas a todos,

    hoy vengo con una duda creo yo que algo más complicado xD. Os explico más o menos el entorno para que os hagais una idea.

    Tengo dos tablas. Una es la de Ingresos y en ella guardo todos los ingresos que hacen a nuestras cuentas junto con su concepto, es decir, un ejemplo sería que un cliente hace un ingreso a una de las cuentas de la empresa y pone en el concepto "INGRESO DE JUAN MARTINEZ DNI 01.234.567-H".

    Por otro lado tengo otra tabla con todos los clientes de mi empresa cuyos campos son Id del cliente, nombre del cliente y CIF del cliente. Por ejemplo, Juan tendría el siguiente registros:

    Id-1 Nombre-Juan Martinez Duran   DNI - 01234567H

    Tengo que realizar una busqueda en la tabla de clientes que me de opciones de que cliente puede ser el que ha hecho ese ingreso. Para ello he creado un catalogo de texto, referenciando tanto al campo Nombre como al campo DNI del cliente. Una vez hecho esto he creado una consulta con FREETEXTTABLE de esta manera:

    SELECT Terceros.Id_Tercero
                                FROM Terceros
                                WHERE Terceros.Id_Tercero IN (SELECT TOP 6 Terceros2.Id_Tercero
                                                                FROM [sig_GestIngresos].[dbo].[Terceros] AS Terceros2
                                                                INNER JOIN FREETEXTTABLE([sig_GestIngresos].[dbo].[Terceros], Nombre_Tercero, 'INGRESO DE JUAN MARTINEZ DNI 01.234.567-H') AS KEY_TBL
                                                                ON Terceros2.Id_Tercero = KEY_TBL.[KEY]
                                                                ORDER BY Rank DESC)
                                OR Terceros.Id_Tercero IN (SELECT TOP 6 Terceros2.Id_Tercero
                                                                FROM [sig_GestIngresos].[dbo].[Terceros] AS Terceros2
                                                                INNER JOIN FREETEXTTABLE([sig_GestIngresos].[dbo].[Terceros], CIF_Tercero, 'INGRESO DE JUAN MARTINEZ DNI 01.234.567-H') AS KEY_TBL
                                                                ON Terceros2.Id_Tercero = KEY_TBL.[KEY]
                                                                ORDER BY Rank DESC)

    De esta manera consigo un registro posible de clientes buscando su nombre y su CIF dentro del concepto. El problema es que para el CIF, si no está exactamente escrito igual no me da ningún resultado, puesto que busca palabras completas, es decir si en vez de 01.234.567-H pusiese 01234567H me daría un resultado que sería el cliente, pero puesto así no me consigue ningun resultado para la busqueda por CIF.

    ¿Sabeis si existe alguna posibilidad de buscar el CIF o un patrón parecido? Se que es complicado pero me vendría realmente bien.

    Un saludo y gracias.
    Wednesday, February 17, 2010 9:28 AM

Answers

  • Si el formato del concepto es siempre el mismo, podrías hacer un campo calculado (e indexado) que buscara dónde aparece el DNI y eliminaras los caracteres que pueden molestar (el punto, el guión) para quedarte siempre con el formato correcto. Es decir, algo como

    DECLARE @t NVARCHAR(MAX)
    SET @t = 'INGRESO DE JUAN MARTINEZ DNI 01.234.567-H'
    
    SET @t = REPLACE(REPLACE(SUBSTRING(@t, CHARINDEX('DNI ', @t) + 4, LEN(@t)), '.', ''), '-', '')
    
    PRINT @t
    Creo que sería más eficiente que un índice de texto, además que te quitarías el problema que tienes ahora, claro
    Wednesday, February 17, 2010 9:38 AM
  • Lamentablemente el concepto no tiene ningún formato en concreto. De hecho es lo que el cliente pone cuando hace el ingreso, es decir, puede poner lo que le de la gana xD.
    Tal vez sea tarde para enmendarlo... pero la mejor solución sería que el ingreso no fuera de texto libre puramente, sino de una serie de valores predefinidos para lograr un ingreso más formateado. Y además el usuario va a agradecer tener que escribir menos texto libre.
    Gustavo Larriera Sosa, Microsoft MVP | ascii164.blogspot.com | /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    Wednesday, February 17, 2010 8:16 PM

All replies

  • Si el formato del concepto es siempre el mismo, podrías hacer un campo calculado (e indexado) que buscara dónde aparece el DNI y eliminaras los caracteres que pueden molestar (el punto, el guión) para quedarte siempre con el formato correcto. Es decir, algo como

    DECLARE @t NVARCHAR(MAX)
    SET @t = 'INGRESO DE JUAN MARTINEZ DNI 01.234.567-H'
    
    SET @t = REPLACE(REPLACE(SUBSTRING(@t, CHARINDEX('DNI ', @t) + 4, LEN(@t)), '.', ''), '-', '')
    
    PRINT @t
    Creo que sería más eficiente que un índice de texto, además que te quitarías el problema que tienes ahora, claro
    Wednesday, February 17, 2010 9:38 AM
  • Lamentablemente el concepto no tiene ningún formato en concreto. De hecho es lo que el cliente pone cuando hace el ingreso, es decir, puede poner lo que le de la gana xD. Estoy mirando que con Integration Services y Busquedas Aproximadas puedo hacer algo, asi que también voy a buscar por ahí. De todas formas gracias por la opción, pero lo dicho, al no ser un campo con un formato en concreto no se si viene o no el DNI, si viene al ppio, si viene al final, si se le ha olvidado poner la letra,etc...
    Wednesday, February 17, 2010 9:46 AM
  • Otra opción es crear un procedimiento almacenado CLR que use expresiones regulares para encontrar ese valor...

    En cualquier caso el usuario tendrá que poner el DNI en algún sitio para que puedas hacer el join con la otra tabla, no? Si el usuario no está obligado a nada en ese concepto, ¿qué ocurre si no introduce nada? ¿no hay otra forma de identificar el cliente? El titular de la cuenta de origen o algo más formal, porque si no, el fiarte de que el usuario ponga su DNI en el concepto es fiarse uno demasiado...

    Wednesday, February 17, 2010 10:06 AM
  • Hola Carlos, en efecto, en ocasiones el cliente puede poner su nombre, o su DNI o su número de contrato o nada de eso en absoluto. Por eso estamos intentando informatizarlo, porque el pobre contable que tiene que asignar ese ingreso se vuelve loco y tenemos que sacrificarle xD. De hecho, lo único que hacemos con esa consulta es darle un listado de posibles clientes pero nunca asignamos uno automaticamente.

    Buscare lo que me propones para ver si encontramos algo.

    Un saludo y gracias.
    Wednesday, February 17, 2010 10:42 AM
  • Lamentablemente el concepto no tiene ningún formato en concreto. De hecho es lo que el cliente pone cuando hace el ingreso, es decir, puede poner lo que le de la gana xD.
    Tal vez sea tarde para enmendarlo... pero la mejor solución sería que el ingreso no fuera de texto libre puramente, sino de una serie de valores predefinidos para lograr un ingreso más formateado. Y además el usuario va a agradecer tener que escribir menos texto libre.
    Gustavo Larriera Sosa, Microsoft MVP | ascii164.blogspot.com | /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    Wednesday, February 17, 2010 8:16 PM