none
como Filtrar registros de un datagridview por varios parametros, utilizando un sp de sql. RRS feed

  • Pregunta

  • Saludos comunidad VB,NET, tengo la siguiente consulta: como  filtrar registros de un datagridview por varios parametros, por ejemplo seleccionar un dato de un combobox y filtrar por ese dato, utilizando un procedimiento almacenado desde sql.

    Hasta el momento, tengo este procedimiento para filtrar por Nombre_Auto, sin embargo es de manera directa sin utilizar el combobox.

    CREATE PROCEDEURE sp_buscarAuto
    @FiltroNombre varchar(90)
    AS
    
    SELECT AUTOS.Codigo_Auto,
                AUTOS.Nombre_Auto,
                AUTOS.Marca_Auto
    
    FROM   AUTOS
    
    WHERE  Nombre_Auto like '%'+@FiltroNombre +'%'
    GO
    Sus respuestas serian de gran utilidad.

    • Editado Jose Alrey sábado, 10 de septiembre de 2016 23:54
    sábado, 10 de septiembre de 2016 23:39

Respuestas

  • Jose Alrey,

    Sí sólo presentas 3 posibles argumentos de filtro basado en tres columnas de tabla entonces lo más simple es buscar la coincidencia del argumento de búsqueda dentro de una cadena conteniendo el valor de las 3 columnas, con ello evitas el desplegable y tiempo en la búsqueda (usuario):

    CREATE PROCEDURE dbo.sp_buscarAuto
        @Expresion nvarchar(4000)
    AS
    BEGIN
        SELECT 
    	   a.Codigo_Auto,
    	   CONCAT(a.Nombres, ' ', a.apellido1, ' ', a.apellido2) AS 'Nombre_Propietario',
    	   a.Marca_Auto
        FROM   
    	   AUTOS a
        WHERE  
    	   CONCAT(
    		  a.Codigo_Auto, ' ',
    		  CONCAT(a.Nombres, ' ', a.apellido1, ' ', a.apellido2), ' ',
    		  a.Marca_Auto
    	   ) LIKE '%' + @Expresion + '%'
    END
    GO

    Fíjate que la consulta buscará la coincidencia del valor del parámetro en cualquiera de las columnas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Jose Alrey domingo, 11 de septiembre de 2016 19:46
    domingo, 11 de septiembre de 2016 7:07
  • Jose Alrey,

    Entendiendo que las columnas se crean automáticamente según el origen de datos vinculado, puedes quitar todas las columnas de la colección antes de realizar el "binding":

    Dim objCapaNegocio As New CNAutos
    
    dt = objCapaNegocio.FiltrarRegistros(txtBuscar.Text)
    
    DatagridAutos.AutoGenerateColumns = True
    DatagridAutos.Columns.Clear()
    
    DatagridAutos.DataSource = dt
    
    'Agrego la columna detalle



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jose Alrey domingo, 11 de septiembre de 2016 21:48
    domingo, 11 de septiembre de 2016 21:35

Todas las respuestas

  • Hola Jose Alrey,

    Yo creo que deberías tener dos parámetros en tu StoredProcedure :

    1).- Para almacenar el nombre del campo donde se hará el filtro.

    2).- El valor por el cual se hará el filtro (esto tendrá que ser usado en el LIKE ).

    Además si selecciona 'Todos los criterios', la consulta sería algo así ?

    WHERE ( Codigo_Auto like '%' + @FiltroNombre + '%' AND 
            Nombre_Auto like '%' + @FiltroNombre + '%' AND 
            Marca_Auto like '%' + @FiltroNombre + '%')
    GO


    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 11 de septiembre de 2016 1:35
  • Hola Joel, me sirvio tu metodo, pero si quisiera utilizar el combobox para  escoger el campo a buscar? ejemplo:

    1-dentro del combo tengo:Codigo_Auto,Nombre_Propietario y Marca_Auto
    y si selecciono Nombre_Propietario que al momento de escribir en el textbox  me busque por el nombre del propietario del auto.

    2- me gustaria que al buscar por el nombre del propietario me busque tanto nombres como apellidos ya que el "Nombre_Propíetario es una concatenacion de campos(nombres,apellido1,apellido2) lo e intentado asi, pero no reconoce el alias

    Nombre_Propietario like '%' + @FiltroNombre + '%'

    SELECT

    AUTOS.Codigo_Auto,

    AUTOS.Nombres + ' ' + AUTOS.apellido1 +' '+ AUTOS.apellido2  AS 'Nombre_Propietario',

    AUTOS.Marca_Auto FROM AUTOS WHERE ( Codigo_Auto like '%' + @FiltroCodigo + '%' AND Nombre_Propietario like '%' + @FiltroNombre + '%' AND Marca_Auto like '%' + @FiltroMarca + '%') GO




    • Editado Jose Alrey domingo, 11 de septiembre de 2016 3:56
    domingo, 11 de septiembre de 2016 3:41
  • Jose Alrey,

    Sí sólo presentas 3 posibles argumentos de filtro basado en tres columnas de tabla entonces lo más simple es buscar la coincidencia del argumento de búsqueda dentro de una cadena conteniendo el valor de las 3 columnas, con ello evitas el desplegable y tiempo en la búsqueda (usuario):

    CREATE PROCEDURE dbo.sp_buscarAuto
        @Expresion nvarchar(4000)
    AS
    BEGIN
        SELECT 
    	   a.Codigo_Auto,
    	   CONCAT(a.Nombres, ' ', a.apellido1, ' ', a.apellido2) AS 'Nombre_Propietario',
    	   a.Marca_Auto
        FROM   
    	   AUTOS a
        WHERE  
    	   CONCAT(
    		  a.Codigo_Auto, ' ',
    		  CONCAT(a.Nombres, ' ', a.apellido1, ' ', a.apellido2), ' ',
    		  a.Marca_Auto
    	   ) LIKE '%' + @Expresion + '%'
    END
    GO

    Fíjate que la consulta buscará la coincidencia del valor del parámetro en cualquiera de las columnas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Jose Alrey domingo, 11 de septiembre de 2016 19:46
    domingo, 11 de septiembre de 2016 7:07
  • Muchas gracias Williams me a servido mucho, ya los datos se filtran de manera excelente, sabes como puedo integrar una nueva columna en un datagridview, es decir el poder crearla si lo eh logrado , el problema que tengo es que cada vez que oprimo el boton buscar se repite la columna " Detalle" como podria evitar esta duplicacion, saludos.

    el codigo implementado es el siguiente:

    Dim dt as new Datatable
    
    Sub Filtrado()
    
            Dim objCapaNegocio As New CNAutos
    
            dt = objCapaNegocio.FiltrarRegistros(txtBuscar.Text)
           DatagridAutos.DataSource = dt
    
    
     'Agrego la columna Detalle
            Dim colDet As New DataGridViewLinkColumn()
            colDet .HeaderText = "Detalle"
            colDet .Name = "Detalle"
            colDet .Text = "Ver Detalle"
            colDet .UseColumnTextForLinkValue = True
            colDet .Width = 30
             DatagridAuto.Columns.Insert(4, colDet )
    
    end sub
    
    'Evento click del boton:
    
     Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
    
           Sub Filtrado()
    
        End Sub

    domingo, 11 de septiembre de 2016 21:20
  • Jose Alrey,

    Entendiendo que las columnas se crean automáticamente según el origen de datos vinculado, puedes quitar todas las columnas de la colección antes de realizar el "binding":

    Dim objCapaNegocio As New CNAutos
    
    dt = objCapaNegocio.FiltrarRegistros(txtBuscar.Text)
    
    DatagridAutos.AutoGenerateColumns = True
    DatagridAutos.Columns.Clear()
    
    DatagridAutos.DataSource = dt
    
    'Agrego la columna detalle



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jose Alrey domingo, 11 de septiembre de 2016 21:48
    domingo, 11 de septiembre de 2016 21:35
  • Funciona perfectamente, muchas gracias por tus respuestas maestro.
    • Marcado como respuesta Jose Alrey domingo, 11 de septiembre de 2016 21:48
    • Desmarcado como respuesta Jose Alrey domingo, 11 de septiembre de 2016 21:48
    domingo, 11 de septiembre de 2016 21:47
  • Yo quiero filtrar con textbox insertando números (por ejemplo quiero filtrar con numero de DNI en un registro de personales) en la datagridwiud 
    martes, 20 de junio de 2017 18:06