none
Filtrar un datagridView omitir tildes

    Pregunta

  • Buenos dias como se hace para que al buscar omita las tildes si algunas palabras lo contiene ya que un mismo valor existe con tilde y sin tilde entonces al hacer filtro sin tilde muestra esos y no lo otros como puedo hacer para omitir el filtro que hago es el de siempre '% el textbox y todo eso segun la columna.

    Espero algun ejemplo para adecuar y probar gracias.

    miércoles, 11 de julio de 2018 14:45

Respuestas

  • Sí, es el primero de los casos que yo mencionaba, es decir, estás haciendo la búsqueda desde el lado servidor usando una sentencia SQL. En consecuencia, procede solucionarlo aplicando el método del "collate" que yo te mencionaba en la primera respuesta. Más o menos es como te pongo a continuación, pero está escrito de memoria (sin probar) por lo que puede tener algún errorcito. Si es así, busca en el manual de SQL Server la cláusula COLLATE y ajusta la sentencia en consecuencia.

                    If txtFiltro.Text <> "" Then
                        Me.oDataAdapter = New SqlDataAdapter("Select Codigo,NumKardex,Fecha,NLote,Descripcion,Stock from Productos$ where Descripcion COLLATE SQL_Latin1_General_CP1_CI_AI like '%" & txtFiltro.Text & "%'", cnx)
                    Else
                        Me.oDataAdapter = New SqlDataAdapter("Select Codigo,NumKardex,Fecha,NLote,Descripcion,Stock from Productos$", cnx)
                    End If

    La intercalación que te he puesto es SQL_Latin1_General_CP1, pero si tu base de datos usa otra, pon la que realmente estés utilizando. Lo importante es el _AI que va al final, que significa "Accent Insensitive" y es lo que hace que la consulta no sea sensible a las tildes.

    Hago la observación habitual que siempre hacemos cuando alguien muestra un código como este, en el sentido de que es inseguro porque concatena en la sentencia texto introducido por el usuario, lo cual la hace vulnerable ante ataques de inyección de SQL. En lugar de concatenar se debe parametrizar. Pero esto no tiene nada que ver con lo del COLLATE, que funciona igual de todas maneras.


    jueves, 12 de julio de 2018 18:24

Todas las respuestas

  • ¿Cómo estás filtrando? ¿En lado cliente o con una consulta a base de datos? Si es en base de datos, y la base de datos es SQL Server, puedes añadir un "collate" al final de la sentencia para que sea "accent-insensitive" (una de las intercalaciones que contiene _AI_). Pero si es en lado cliente, depende del código que uses. Se pueden convertir el dato que se busca y los valores entre los que se busca pasándolos por una subrutina que omita todas las tildes. O se puede usar un IComparer que haga una conversión insensible. Habría que ver exactamente cómo estás filtrando para poder recomendar el mejor método.
    miércoles, 11 de julio de 2018 16:02
  • Hola disculpa por contestar tarde; resulta que el cliente registra un producto supongamos Lapiz 2b y en otro pone Lápiz 4b y cuando pone lapiz solo le sale los q no tiene acento y piensa q el anterior no existe y vuelve a generar otro entonces se confunde la idea e sque al poner lapiz filtre con o sin acento.

    Es en lado cliente en el formulario parte del código de boton es:

    Private Sub btnFiltro_Click(sender As Object, e As EventArgs) Handles btnFiltro.Click
            Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
                Try
                    Me.oDataTable.Clear()
                    If txtFiltro.Text <> "" Then
                        Me.oDataAdapter = New SqlDataAdapter("Select Codigo,NumKardex,Fecha,NLote,Descripcion,Stock from Productos$ where Descripcion like '%" & txtFiltro.Text & "%'", cnx)
                    Else
                        Me.oDataAdapter = New SqlDataAdapter("Select Codigo,NumKardex,Fecha,NLote,Descripcion,Stock from Productos$", cnx)
                    End If
                    Me.oDataAdapter.Fill(Me.oDataTable)
    
    
    .....
    

    Saludos


    jueves, 12 de julio de 2018 17:41
  • Sí, es el primero de los casos que yo mencionaba, es decir, estás haciendo la búsqueda desde el lado servidor usando una sentencia SQL. En consecuencia, procede solucionarlo aplicando el método del "collate" que yo te mencionaba en la primera respuesta. Más o menos es como te pongo a continuación, pero está escrito de memoria (sin probar) por lo que puede tener algún errorcito. Si es así, busca en el manual de SQL Server la cláusula COLLATE y ajusta la sentencia en consecuencia.

                    If txtFiltro.Text <> "" Then
                        Me.oDataAdapter = New SqlDataAdapter("Select Codigo,NumKardex,Fecha,NLote,Descripcion,Stock from Productos$ where Descripcion COLLATE SQL_Latin1_General_CP1_CI_AI like '%" & txtFiltro.Text & "%'", cnx)
                    Else
                        Me.oDataAdapter = New SqlDataAdapter("Select Codigo,NumKardex,Fecha,NLote,Descripcion,Stock from Productos$", cnx)
                    End If

    La intercalación que te he puesto es SQL_Latin1_General_CP1, pero si tu base de datos usa otra, pon la que realmente estés utilizando. Lo importante es el _AI que va al final, que significa "Accent Insensitive" y es lo que hace que la consulta no sea sensible a las tildes.

    Hago la observación habitual que siempre hacemos cuando alguien muestra un código como este, en el sentido de que es inseguro porque concatena en la sentencia texto introducido por el usuario, lo cual la hace vulnerable ante ataques de inyección de SQL. En lugar de concatenar se debe parametrizar. Pero esto no tiene nada que ver con lo del COLLATE, que funciona igual de todas maneras.


    jueves, 12 de julio de 2018 18:24