none
setencia para filtrar numeros RRS feed

  • Pregunta

  • hola,

    estoy buscando una forma de filtrar datos de una datagridview, la cual la columna a filtrar es de numeros, en mi motor de base de datos (access) tengo mi tabla y esa columna es de tipo numerica, ya probe con LIKE pero me marca un error que se puede por que LIKE no busca en columnas numericas, asi pude entender, existe otra forma que no sea cambiar la columna numerica a tex?to

    sábado, 14 de noviembre de 2009 5:02

Respuestas

  • "Leandro Tuttini" escribió:

    > podrias usar la consulta
    >
    > SELECT * FROM <tabla> WHERE CSTR(Id) LIKE '10%'
    >
    > esto debería devolverte todos lo Id que empiecen con 10

    Digo yo que esa consulta estaría bien para filtrar los registros directamente en la tabla de Access. Pero ¿también sirve para filtrar los datos de un objeto DataTable, o las filas existentes en un control DataGridView, cuando la columna no es alfanumérica? ;-)

    Si no desea mapear el objeto DataTable, tendría que convertir a alfanumérico el campo numérico de la tabla de la siguiente manera:

         Dim sql As String = "SELECT CSTR(IdCliente) AS IdCliente, Nombre FROM Clientes"

    Ahora, el campo IdCliente sí sería alfanumérico, por tanto, puede utilizarlo con el operador LIKE para filtrar registros.



    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta PauloCastro sábado, 14 de noviembre de 2009 21:21
    • Marcado como respuesta J. Miguel domingo, 15 de noviembre de 2009 8:37
    sábado, 14 de noviembre de 2009 16:56
    Moderador

Todas las respuestas

  • Por si lo ignoras, el operador LIKE sólo se puede utilizar con columnas alfanuméricas, por tanto, si la columna es numérica, me me imagino que obtendrás una excepción tan grande como un camión. :-)

    Tienes que mapear el objeto DataTable antes de rellenarlo de datos, para cambiarle a String el tipo de dato de la columna numérica.

    Por ejemplo, imagina que deseas utilizar el operador Like con el campo numérico IdCliente de la clásica tabla de Clientes. Mapearías el objeto DataTable de la siguiente manera:

            Using cnn As New OleDbConnection( _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\Mis documentos\Bd1.mdb;")

                Dim sql As String = "SELECT * FROM Clientes"

                Dim da As New OleDbDataAdapter(sql, cnn)

                ' Mapeamos la tabla de Clientes
                Dim dtm As Common.DataTableMapping = _
                    da.TableMappings.Add("Clientes", "DataClientes")

                ' Añadimos un mapeado de columna, utilizando
                ' un nuevo nombre para el campo IdCliente.
                Dim dcm As Common.DataColumnMapping = _
                    dtm.ColumnMappings.Add("IdCliente", "ID")

                ' Creamos el objeto DataTable. Pero en lugar de indicar
                ' el nombre de la tabla de la base de datos (Clientes)
                ' le indicamos el nombre de la tabla mapeada (DataClientes).
                '
                Dim dt As New DataTable("DataClientes")

                ' Definimos el campo ID del objeto DataTable
                ' del tipo alfanumérico.
                '
                dt.Columns.Add("ID", GetType(String))

                ' Rellenamos el objeto DataTable
                '
                da.Fill(dt)

                DataGridView1.DataSource = dt

            End Using


    Ahora, cuando desees utilizar el operador Like, lo harías de la siguiente manera:

            ' Referenciamos el objeto DataTable
            '
            Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)

            ' Recuperamos los registros cuyo campo ID comiencen por 4300
            '
            Dim rows() As DataRow = dt.Select("ID Like '4300%'")

            MessageBox.Show(rows.Count.ToString)

    Asi sí puedes utilizar el operador Like. :-)


    Enrique Martínez [MS MVP - VB]
    sábado, 14 de noviembre de 2009 9:26
    Moderador
  • hola

    se me ocurre que si necesitas usar el LIKE sobre un campo numerico puedas convertirlo a string


    podrias usar la consulta


    SELECT * FROM <tabla> WHERE CSTR(Id) LIKE '10%'


    esto debería devolverte todos lo Id que empiecen con 10


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Propuesto como respuesta PauloCastro sábado, 14 de noviembre de 2009 21:21
    sábado, 14 de noviembre de 2009 16:40
  • "Leandro Tuttini" escribió:

    > podrias usar la consulta
    >
    > SELECT * FROM <tabla> WHERE CSTR(Id) LIKE '10%'
    >
    > esto debería devolverte todos lo Id que empiecen con 10

    Digo yo que esa consulta estaría bien para filtrar los registros directamente en la tabla de Access. Pero ¿también sirve para filtrar los datos de un objeto DataTable, o las filas existentes en un control DataGridView, cuando la columna no es alfanumérica? ;-)

    Si no desea mapear el objeto DataTable, tendría que convertir a alfanumérico el campo numérico de la tabla de la siguiente manera:

         Dim sql As String = "SELECT CSTR(IdCliente) AS IdCliente, Nombre FROM Clientes"

    Ahora, el campo IdCliente sí sería alfanumérico, por tanto, puede utilizarlo con el operador LIKE para filtrar registros.



    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta PauloCastro sábado, 14 de noviembre de 2009 21:21
    • Marcado como respuesta J. Miguel domingo, 15 de noviembre de 2009 8:37
    sábado, 14 de noviembre de 2009 16:56
    Moderador
  • tengo este problema:


    vista.RowFilter =

    "cstr(nvn) LIKE '" & "%" & Me.No.Text & "%'"

    me dice que la funcion cstr() no esta definida

    domingo, 15 de noviembre de 2009 18:42
  • hola

    el tema es que son distintos los contextos en dodne usaras el CStr(), a nivel de filtro el la vista como interroga Enrique seguramente no funcione, y se confirma con el problema que planteas

    lo que Enrique apunta es que directamente convirtas a string el campo cuando realzias el select

    para ello deberas modificar al consulta que usas para cargar el DataSet o DataTable, de esta forma haces que el tipo de dato de la consulta sea string, y no necesites ninguna otra conversion

    busca el query que usas para obtener los datos y en la parte del SELECT encierra el campo bmv con el Cstr(), como lo ahce Enrique en el ejemplo:

    SELECT CSTR(IdCliente) AS IdCliente, Nombre FROM Clientes


    y luego si podras filtrar directamente

    vista.RowFilter = String.Format("nvn LIKE '%{0}%'", Me.No.Text)


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 15 de noviembre de 2009 18:50
  • me aparece esto:


    No se puede interpretar el símbolo (token) 'LIKE' en la posición 5.
    domingo, 15 de noviembre de 2009 18:57
  • hola

    pero te parece cuando?

    o sea bajo que acciones has realziado para obtener el mensaje
    en que linea te muestra ese mensaje

    has cambiado la query?
    agregandole el CStr()


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Propuesto como respuesta PauloCastro jueves, 26 de noviembre de 2009 20:07
    domingo, 15 de noviembre de 2009 19:00
  • si ya le agrege el dato CSTR(ventas.nvn)

    y me aparece a la hora de la que escribo un numero, es decir, corro el programa me carga el datagridview y al situarme en el textbox y escribo un numero "1", me arroja ese error.

    el filtrado lo tengo dentro del textchanged


    domingo, 15 de noviembre de 2009 19:04
  • hola

    te animas a postear el codigo de las partes donde realizas la carga del dataset que bidneas a la grilla
    y donde realzias la busqueda os ea el textchanged


    verifica que lo postees que el formato de la identacion sea correcto asi se facilita la lectura y el analisis del codigo

    saludis
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 15 de noviembre de 2009 19:18
  • Imports System.Data.OleDb
    Imports System.IO
    Imports System.Data.SqlClient
    -------------------
    
    Public AppPath As String = System.IO.Directory.GetCurrentDirectory()
    Private _da As OleDbDataAdapter
    Dim cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & AppPath & "\DataBase\DataBase_TPV_Autos_2009.accdb;Persist Security Info=False;Jet OLEDB:Database Password = Administrador")
    Dim dt As New DataTable("Buscar")
    ------------
    
    
    Private Function CargarDatos() As Boolean
    
                Dim sql As String = "SELECT CSTR(VENTAS.NVN), VENTAS.FECHA, VENTAS.HORA, VENTAS.C_VND, VENTAS.VNDDOR, AUTOS.C_AUTO, AUTOS.MARCA, AUTOS.MODELO, AUTOS.AÑO, AUTOS.PRECIO, VENTAS.CANT, (VENTAS.CANT*AUTOS.PRECIO) AS SUBTOTAL, (SUBTOTAL*0.15) AS IVA, (SUBTOTAL+IVA) AS TOTAL FROM (VENTAS INNER JOIN VENDEDORES ON VENTAS.C_VND=VENDEDORES.C_VND) INNER JOIN AUTOS ON VENTAS.C_AUTO=AUTOS.C_AUTO ORDER BY VENTAS.NVN DESC"
                _da = New OleDbDataAdapter(sql, cnn)
                _da.Fill(dt)
                buscar_en.DataSource = dt
                buscar_en.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
                buscar_en.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
                buscar_en.Columns(1).HeaderText = "No."
                buscar_en.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(2).HeaderText = "FECHA"
                buscar_en.Columns(2).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(3).HeaderText = "HORA"
                buscar_en.Columns(3).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(4).HeaderText = "ID_VND"
                buscar_en.Columns(4).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(5).HeaderText = "VENDEDOR"
                buscar_en.Columns(5).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(6).HeaderText = "ID_AUTO"
                buscar_en.Columns(6).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(7).HeaderText = "MARCA"
                buscar_en.Columns(7).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(8).HeaderText = "MODELO"
                buscar_en.Columns(8).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(9).HeaderText = "AÑO"
                buscar_en.Columns(9).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(10).HeaderText = "PRECIO"
                buscar_en.Columns(10).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(10).DefaultCellStyle.Format = "C2"
                buscar_en.Columns(10).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                buscar_en.Columns(11).HeaderText = "CANT."
                buscar_en.Columns(11).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(12).HeaderText = "SUBTOTAL"
                buscar_en.Columns(12).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(12).DefaultCellStyle.Format = "C2"
                buscar_en.Columns(12).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                buscar_en.Columns(13).HeaderText = "IVA"
                buscar_en.Columns(13).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(13).DefaultCellStyle.Format = "C2"
                buscar_en.Columns(13).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                buscar_en.Columns(14).HeaderText = "TOTAL"
                buscar_en.Columns(14).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
                buscar_en.Columns(14).DefaultCellStyle.Format = "C2"
                buscar_en.Columns(14).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
    
    
        End Function
    
    --------
    
    Private Sub Buscar_sig_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
     CargarDatos()
    
    End Sub
    
    -----------
    
    Private Sub no_TextChanged(ByVal sender As System.Object, ByVal e As  _
    System.EventArgs) Handles No.TextChanged
    
           
                vista.Table = dt
                'filtro SQL: registros que empiecen por el texto escrito en el TextBox
                vista.RowFilter = "no. LIKE '" & Me.No.Text & "%'"
                'vista.RowFilter = "cstr(no.) LIKE '" & "%" & Me.No.Text & "%'"
                'nuevo origen del DataDrid: la vista personalizada
                buscar_en.DataSource = vista
                'recargar el DataGrid
                buscar_en.Update()
                No.AutoCompleteCustomSource.Clear()
    
    
    End Sub
    domingo, 15 de noviembre de 2009 19:38
  • hola

    bien lo primero que puedo observar es que cuando usas el LIKE estas filtrando con un mombre que le asignaste al datagridiew en el header
    pero deberias ahcer con el nombre del campo de tu datatable

    entonces primero usa un alias

    Dim sql As String = "SELECT CSTR(VENTAS.NVN) AS NVN , VENTAS.FECHA, VENTAS.HORA, VENTAS.C_VND, VENTAS.VNDDOR, AUTOS.C_AUTO, AUTOS.MARCA, AUTOS.MODELO, AUTOS.AÑO, AUTOS.PRECIO, VENTAS.CANT, (VENTAS.CANT*AUTOS.PRECIO) AS SUBTOTAL, (SUBTOTAL*0.15) AS IVA, (SUBTOTAL+IVA) AS TOTAL FROM (VENTAS INNER JOIN VENDEDORES ON VENTAS.C_VND=VENDEDORES.C_VND) INNER JOIN AUTOS ON VENTAS.C_AUTO=AUTOS.C_AUTO ORDER BY VENTAS.NVN DESC"


    entonces despues en el filtro us ese campo

    vista.RowFilter = String.Format("NVN LIKE '%{0}%'", Me.No.Text)

    y no el del datagridview

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 15 de noviembre de 2009 19:57
  • problema resuelto graxias si efectivamente eso era el error, graxias por tu time y dedicacion.

    ahora tengo otra duda la cual la posteare en otra pregunta
    domingo, 15 de noviembre de 2009 20:07