none
Filtros en visual RRS feed

  • Pregunta

  • Buenas ,  una consulta amigos ya que no he podido con este problemas 

    Tengo un datagriview el cual muestra los datos de mi base datos , lo que quiero es que como tengo un campo descripcion el cual contiene muchas lineas de texto se ouedan hacer filtron ejemplo

    Digamos que esta es mi descripcion 

    SONAR ECOSONDA MULTIBEAM DE BANDA ANCHA QUE OPERE A FRECUENCIAS DE 60 KHZ: CON BARRIDO EN UN ANCHO DE 10° A 160° QUE PERMITA UNA ALTA RESOLUCIÓN. DEBE GENERAR PINGS EQUIDISTANTES, QUE PERMITA EL LEVANTAMIENTO AL ÁREAS AMPLIAS PARA EL MAPEO DE LECHO MARINO, COMO EL LEVANTAMIENTO A DETALLE DE SUBESTRUCTURAS Y LÍNEAS, CON UNA TOLERANCIA DE +/- 3 CM.

    quiero tener  3 texbox en el cual se pueda poner las palabras a buscar Digamos que el usuario pones Ecosona entonces filtraria los que tienen esa palabra en el otro digamos que pone Levantamiento entonces filtra los que tienen ecosona y levantamiento

    espero pueda explicarme y me puedan ayudar

    • Cambiado Enrique M. Montejo lunes, 27 de noviembre de 2017 12:28 Pregunta relacionada con el acceso a datos con SQLite.
    viernes, 24 de noviembre de 2017 5:06

Respuestas

  • Puedes definir una expresión de filtro mediante el predicado BETWEEN, por ejemplo:

    - Consulta sql de selección:

    SELECT * FROM dbo.TableName
    WHERE 
        Descripcion LIKE '%' + @Param1 + '%' 
        AND Descripcion LIKE '%' + @Param2 + '%' 
        AND Descripcion LIKE '%' + @Param3 + '%';
    GO

    - Ejecutar la consulta

    Dim Command As New SqlCommand("Query...", Conn)
    
    Command.Parameters.AddWithValue("@Param1", TextBox1.Text)
    Command.Parameters.AddWithValue("@Param2", TextBox2.Text)
    Command.Parameters.AddWithValue("@Param3", TextBox3.Text)
    
    Command.ExecuteNonQuery()

    No mencionas el gestor de base de datos que ocupas, en caso sea SQL Server y los tiempos de respuesta de la consulta no sean los adecuados considera el uso de Full-Text Search

    viernes, 24 de noviembre de 2017 6:13
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private Sub btnParametro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnParametro.Click
            Dim lsQuery As String
            Dim mListaParametros As New List(Of Parametro)
            Dim loParametro As Parametro
            lsQuery = "Select APELLIDO1, NOMBRE From USUARIO Where ((@Apellido1 IS NULL) OR ( APELLIDO1 Like '%'+@Apellido1+'%')) And ((@Nombre IS NULL) OR (NOMBRE Like '%'+@Nombre+'%'))  Order By APELLIDO1"
            loParametro = New Parametro("@Apellido1", Me.txtApellido1.Text)
            mListaParametros.Add(loParametro)
            loParametro = New Parametro("@Nombre", Me.txtNombre.Text)
            mListaParametros.Add(loParametro)
            Me.DataGridView1.DataSource = lF_dtActualizaGridParametro(lsQuery, mListaParametros)
        End Sub

        Private Function lF_dtActualizaGridParametro(ByVal vsQuery As String, ByVal vlLista As IList(Of Parametro)) As DataTable
            If (vsQuery = String.Empty) Then
                Return Nothing
            End If
            Try
                Dim loDataTable As New DataTable
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        'Añadir parametros al comando
                        For Each loParametro As Parametro In vlLista
                            loComando.Parameters.AddWithValue(loParametro.Nombre, IIf(IsNothing(loParametro.Valor), DirectCast(DBNull.Value, Object), loParametro.Valor))
                        Next
                        Using loDataAdapter As New SqlDataAdapter(loComando)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                End Using
                Return loDataTable
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_dtActualizaGridParametro", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return Nothing
            End Try
        End Function
    End Class

    Añade una clase con el siguiente código

    Option Explicit On
    Option Strict On

    Public Class Parametro
        Public Property Nombre As String
        Public Property Valor As Object
        Public Sub New(ByVal strNombre As String, ByVal objValor As Object)
            Me.Nombre = strNombre
            Me.Valor = objValor
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Darwin123456 viernes, 24 de noviembre de 2017 13:37
    • Desmarcado como respuesta Darwin123456 viernes, 24 de noviembre de 2017 13:37
    • Marcado como respuesta Enrique M. Montejo lunes, 27 de noviembre de 2017 12:27
    viernes, 24 de noviembre de 2017 6:13
  • Hola:
    Prueba algo como esto

      lsQuery = "Select TU_CAMPO From TU_TABLA Where ((@Parametro1 IS NULL) OR ( TU_CAMPO Like '%'+@Parametro1+'%')) And ((@Parametro2 IS NULL) OR (TU_CAMPO Like '%'+@Parametro2+'%'))  Order By TU_CAMPO"
            loParametro = New Parametro("@Parametro1", Me.TextBox1.Text)
            mListaParametros.Add(loParametro)
            loParametro = New Parametro("@Parametro2", Me.TextBox2.Text)
            mListaParametros.Add(loParametro)   

    Un saludo desde Bilbo
    Carlos

    viernes, 24 de noviembre de 2017 20:55

Todas las respuestas

  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private Sub btnParametro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnParametro.Click
            Dim lsQuery As String
            Dim mListaParametros As New List(Of Parametro)
            Dim loParametro As Parametro
            lsQuery = "Select APELLIDO1, NOMBRE From USUARIO Where ((@Apellido1 IS NULL) OR ( APELLIDO1 Like '%'+@Apellido1+'%')) And ((@Nombre IS NULL) OR (NOMBRE Like '%'+@Nombre+'%'))  Order By APELLIDO1"
            loParametro = New Parametro("@Apellido1", Me.txtApellido1.Text)
            mListaParametros.Add(loParametro)
            loParametro = New Parametro("@Nombre", Me.txtNombre.Text)
            mListaParametros.Add(loParametro)
            Me.DataGridView1.DataSource = lF_dtActualizaGridParametro(lsQuery, mListaParametros)
        End Sub

        Private Function lF_dtActualizaGridParametro(ByVal vsQuery As String, ByVal vlLista As IList(Of Parametro)) As DataTable
            If (vsQuery = String.Empty) Then
                Return Nothing
            End If
            Try
                Dim loDataTable As New DataTable
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        'Añadir parametros al comando
                        For Each loParametro As Parametro In vlLista
                            loComando.Parameters.AddWithValue(loParametro.Nombre, IIf(IsNothing(loParametro.Valor), DirectCast(DBNull.Value, Object), loParametro.Valor))
                        Next
                        Using loDataAdapter As New SqlDataAdapter(loComando)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                End Using
                Return loDataTable
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_dtActualizaGridParametro", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return Nothing
            End Try
        End Function
    End Class

    Añade una clase con el siguiente código

    Option Explicit On
    Option Strict On

    Public Class Parametro
        Public Property Nombre As String
        Public Property Valor As Object
        Public Sub New(ByVal strNombre As String, ByVal objValor As Object)
            Me.Nombre = strNombre
            Me.Valor = objValor
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Darwin123456 viernes, 24 de noviembre de 2017 13:37
    • Desmarcado como respuesta Darwin123456 viernes, 24 de noviembre de 2017 13:37
    • Marcado como respuesta Enrique M. Montejo lunes, 27 de noviembre de 2017 12:27
    viernes, 24 de noviembre de 2017 6:13
  • Puedes definir una expresión de filtro mediante el predicado BETWEEN, por ejemplo:

    - Consulta sql de selección:

    SELECT * FROM dbo.TableName
    WHERE 
        Descripcion LIKE '%' + @Param1 + '%' 
        AND Descripcion LIKE '%' + @Param2 + '%' 
        AND Descripcion LIKE '%' + @Param3 + '%';
    GO

    - Ejecutar la consulta

    Dim Command As New SqlCommand("Query...", Conn)
    
    Command.Parameters.AddWithValue("@Param1", TextBox1.Text)
    Command.Parameters.AddWithValue("@Param2", TextBox2.Text)
    Command.Parameters.AddWithValue("@Param3", TextBox3.Text)
    
    Command.ExecuteNonQuery()

    No mencionas el gestor de base de datos que ocupas, en caso sea SQL Server y los tiempos de respuesta de la consulta no sean los adecuados considera el uso de Full-Text Search

    viernes, 24 de noviembre de 2017 6:13
  • Muy bien amigo , pero lo que deso hacer 2 busquedas en un solo campo no por separado , lo que deseo es localizer las palabras en ese campo espero puedas ayudarme

    viernes, 24 de noviembre de 2017 14:37
  • Y ya con esto puedo realizer la busqueda en un mismo campo ?
    viernes, 24 de noviembre de 2017 14:38
  • ...Y ya con esto puedo realizar la búsqueda en un mismo campo?

    Claro, ¿tienes alguna duda al respecto?

    Ahora, si quieres ser mas estricto en la consulta sql que se genera puedes condicionar la creación de la expresión según el valor contenido en la propiedad Text de cada caja de texto.

    viernes, 24 de noviembre de 2017 16:47
  • Si estoy trabajando en una base de dato SQLite la cual no permite ese tipo de ejecucion , alguna otra opcion
    viernes, 24 de noviembre de 2017 17:36
  • SQLite permite realizar consultas basadas en el operador LIKE, ello no es una restricción.

    SQLite Like: Querying Data Based On Pattern Matching

    En tu aplicación debes ocupar las clases SQLiteConnection, SQLiteCommand, etc. que pertenecen al espacio de nombres System.Data.SQLite

    News for System.Data.SQLite

    viernes, 24 de noviembre de 2017 18:55
  • Hola:
    Prueba algo como esto

      lsQuery = "Select TU_CAMPO From TU_TABLA Where ((@Parametro1 IS NULL) OR ( TU_CAMPO Like '%'+@Parametro1+'%')) And ((@Parametro2 IS NULL) OR (TU_CAMPO Like '%'+@Parametro2+'%'))  Order By TU_CAMPO"
            loParametro = New Parametro("@Parametro1", Me.TextBox1.Text)
            mListaParametros.Add(loParametro)
            loParametro = New Parametro("@Parametro2", Me.TextBox2.Text)
            mListaParametros.Add(loParametro)   

    Un saludo desde Bilbo
    Carlos

    viernes, 24 de noviembre de 2017 20:55
  • Gracias por tu ayuda pero sigo sin lograre hacerlo
    lunes, 27 de noviembre de 2017 16:35
  • gracias por tui ayuda pero sigo sin logralo amigo
    lunes, 27 de noviembre de 2017 16:36
  • [10:36:40] Error while executing SQL query on database 'Sistema': Error while preparing statement: could not bind parameter @Param1

    ME SALE ESTE ERRO AL HACER LA CONSULTA AMIGO

    lunes, 27 de noviembre de 2017 16:40
  • Hola:
    En un Form como el de la imagen


    Copia y pega el siguiente código

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private Sub btnParametro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnParametro.Click
            Dim lsQuery As String
            Dim mListaParametros As New List(Of Parametro)
            Dim loParametro As Parametro
            lsQuery = "Select APELLIDO1 From USUARIO Where ((@Parametro1 IS NULL) OR ( APELLIDO1 Like '%'+@Parametro1+'%')) Or ((@Parametro2 IS NULL) OR (APELLIDO1 Like '%'+@Parametro2+'%'))  Order By APELLIDO1"
            loParametro = New Parametro("@Parametro1", Me.TextBox1.Text)
            mListaParametros.Add(loParametro)
            loParametro = New Parametro("@Parametro2", Me.TextBox2.Text)
            mListaParametros.Add(loParametro)
            Me.DataGridView1.DataSource = lF_dtActualizaGridParametro(lsQuery, mListaParametros)
        End Sub
        Private Function lF_dtActualizaGridParametro(ByVal vsQuery As String, ByVal vlLista As IList(Of Parametro)) As DataTable
            If (vsQuery = String.Empty) Then
                Return Nothing
            End If
            Try
                Dim loDataTable As New DataTable
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        'Añadir parametros al comando
                        For Each loParametro As Parametro In vlLista
                            loComando.Parameters.AddWithValue(loParametro.Nombre, IIf(IsNothing(loParametro.Valor), DirectCast(DBNull.Value, Object), loParametro.Valor))
                        Next
                        Using loDataAdapter As New SqlDataAdapter(loComando)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                End Using
                Return loDataTable
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_dtActualizaGridParametro", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return Nothing
            End Try
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos

    lunes, 27 de noviembre de 2017 21:50
  • Amigo me sale un error Error El tipo 'Parametro' no está definido.  jajaja ya me estrese jajaja no logro que busque las palabras sobre la misma descripcion..
    martes, 28 de noviembre de 2017 2:22
  • Al fin lo logre con algo a si jajaja espero le sirva a alguien mas

    SubBtnFiltrar_Click(sender AsObject, e AsEventArgs) HandlesBtnFiltrar.Click       

    DimlbHayFiltro AsBoolean= False

    DimlsQuery AsString= ""


    IfMe.CbMateriales.Text.Length > 0 Then


                lsQuery &=

    "DescripcionDelmaterial Like '%"& Me.CbMateriales.Text & "%'"


                lbHayFiltro =

    True


           

    EndIf


           

    IfMe.TxtClasificacion.Text.Length > 0 Then


               

    IflbHayFiltro = TrueThen


                    lsQuery &=

    " And "


               

    EndIf


                lsQuery &=

    "DescripcionDelmaterial Like '%"& Me.TxtClasificacion.Text & "%'"


                lbHayFiltro =

    True


           

    EndIf


           

    IfMe.TxtDiametro.Text.Length > 0 Then


               

    IflbHayFiltro = TrueThen


                    lsQuery &=

    " And "


               

    EndIf


                lsQuery &=

    " DescripcionDelmaterial Like '%"& Me.TxtDiametro.Text & "%'"


           

    EndIf

    martes, 28 de noviembre de 2017 19:37
  • Hola:
    ¿ Has hecho caso a esto ?

    Añade una clase con el siguiente código
    Option Explicit On
    Option Strict On
    Public Class Parametro
        Public Property Nombre As String
        Public Property Valor As Object
        Public Sub New(ByVal strNombre As String, ByVal objValor As Object)
            Me.Nombre = strNombre
            Me.Valor = objValor
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    martes, 28 de noviembre de 2017 20:27