none
Error al actualizar contenido de un griview RRS feed

  • Pregunta

  • Hola a todos,

    Estoy filtrando el contenido de un griview mediante una serie de textbox, un par de ellos contienen dos campos en los que introducir la fecha desde y la fecha hasta.

    Construyo la expresión de filtrado y me da el error La expresión contiene un operador 'Between' no compatible.

    La cadena que construyo es "idCentro = '21035'  and fecha BETWEEN '28/03/2011' AND '11/07/2011' " y tambien he probado a pasar "idCentro = '21035'  and fecha between convert(datetime, '28/03/2011' ) and convert(datetime, '11/07/2011')"

    ¿Me podeis ayudar?


    Empezando ;)
    lunes, 11 de julio de 2011 12:40

Respuestas

  • como estas pasando los filtros a la query ? usas parametros o concatenas el string

    si es este ultimo alli esta el problema, debes usar parametros, como explico aqui

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/19e56e70-33b9-4087-b84c-977a387cc46c/

     

    Using conn As New OleDb.OleDbConnection(strconexion)
            conn.Open()
           
            Dim strSQL As String = "SELECT * FROM Autorizaciones WHERE " & _
                                    "CAST(CONVERT(varchar(8), Fecha_Autorizacion, 112) as INT) " & _
                                    "BETWEEN CAST(CONVERT(varchar(8), @fechadesde, 112) as INT) " & _
                                    "AND CAST(CONVERT(varchar(8), @fechahasta, 112) as INT) "

            Dim cmd As New OleDb.OleDbCommand(strSQL, conn)
            cmd.Parameters.AddWithValue("@item", textSalidaITEM.Text)
           
            cmd.Parameters.AddWithValue("@fechadesde", CDate("22/04/2010"))
            cmd.Parameters.AddWithValue("@fechahasta", CDate("22/04/2010"))

            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
       
        End Using

     

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Alberto SH martes, 12 de julio de 2011 9:18
    lunes, 11 de julio de 2011 12:48
  • Hola Alberto, Leandro:

     

    Lo que esta haciendo Alberto no es filtras sobre la base de datos esta realizando una consulta sobre un DataTable con la expresion.

     

    <DataTable>.Select(idCentro = '21035'  and fecha BETWEEN '28/03/2011' AND '11/07/2011'). 

     

    Lo que estas haciendo según planteas la pregunta no es una buena practica primero solicitas todos los datos a tu base de datos y despúes los filtras en memoria. Yo te propongo lo siguiente: 

     

    Filtra sobre la base de datos no sobre el DataTable.

     

    Si quieres filtras sobre DataTable el operador BETWEEN no esta soportado tienes que hacer lo siguiente:

     

    <DataTable>.Select(idCentro = '21035'  and fecha >='28/03/2011' and fecha <='11/07/2011'). 

     

    Te paso un link donde te aclara esto .

     

    http://www.foro.vb-mundo.com/f25/filtrar-datagridview-fecha-y-hora-16603/

     

    Saludos.

     



     

     

     



    phurtado
    • Marcado como respuesta Alberto SH martes, 12 de julio de 2011 9:18
    lunes, 11 de julio de 2011 13:05
  • Hola Alberto:

     

    "No lo he hecho con parámetros por que hay campos que son obligatorios en la bd pero que para el filtro no tienen por que ponerse, es decir, si en código yo digo que un campo va a ser parametrizado, pero el usuario decide no filtrarlo, ¿como hago para que me aparezcan todos? ¿que pongo en el cmd.Parameters.AddWithValue?"

     

    puedes escribir la sentencia de la siguiente forma 

     

    select * from tabla

    where (campo  = @campo or @campo is null)

     

    el valor que tienes que agregar a "cmd.Parameters.AddWithValue"

    es el siguiente:

     

    cmd.Parameters.AddWithValue(@campo,System.DbNull.Value); // si el valor es null

     

    cmd.Parameters.AddWithValue(@campo,Valor); // si el valor no es null

    Entendiendo que Valor es una variable que almacena el valor.

    Saludos

     


    phurtado
    • Marcado como respuesta Alberto SH miércoles, 13 de julio de 2011 9:47
    martes, 12 de julio de 2011 13:01

Todas las respuestas

  • como estas pasando los filtros a la query ? usas parametros o concatenas el string

    si es este ultimo alli esta el problema, debes usar parametros, como explico aqui

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/19e56e70-33b9-4087-b84c-977a387cc46c/

     

    Using conn As New OleDb.OleDbConnection(strconexion)
            conn.Open()
           
            Dim strSQL As String = "SELECT * FROM Autorizaciones WHERE " & _
                                    "CAST(CONVERT(varchar(8), Fecha_Autorizacion, 112) as INT) " & _
                                    "BETWEEN CAST(CONVERT(varchar(8), @fechadesde, 112) as INT) " & _
                                    "AND CAST(CONVERT(varchar(8), @fechahasta, 112) as INT) "

            Dim cmd As New OleDb.OleDbCommand(strSQL, conn)
            cmd.Parameters.AddWithValue("@item", textSalidaITEM.Text)
           
            cmd.Parameters.AddWithValue("@fechadesde", CDate("22/04/2010"))
            cmd.Parameters.AddWithValue("@fechahasta", CDate("22/04/2010"))

            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
       
        End Using

     

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Alberto SH martes, 12 de julio de 2011 9:18
    lunes, 11 de julio de 2011 12:48
  • Hola Alberto, Leandro:

     

    Lo que esta haciendo Alberto no es filtras sobre la base de datos esta realizando una consulta sobre un DataTable con la expresion.

     

    <DataTable>.Select(idCentro = '21035'  and fecha BETWEEN '28/03/2011' AND '11/07/2011'). 

     

    Lo que estas haciendo según planteas la pregunta no es una buena practica primero solicitas todos los datos a tu base de datos y despúes los filtras en memoria. Yo te propongo lo siguiente: 

     

    Filtra sobre la base de datos no sobre el DataTable.

     

    Si quieres filtras sobre DataTable el operador BETWEEN no esta soportado tienes que hacer lo siguiente:

     

    <DataTable>.Select(idCentro = '21035'  and fecha >='28/03/2011' and fecha <='11/07/2011'). 

     

    Te paso un link donde te aclara esto .

     

    http://www.foro.vb-mundo.com/f25/filtrar-datagridview-fecha-y-hora-16603/

     

    Saludos.

     



     

     

     



    phurtado
    • Marcado como respuesta Alberto SH martes, 12 de julio de 2011 9:18
    lunes, 11 de julio de 2011 13:05
  • como estas pasando los filtros a la query ? usas parametros o concatenas el string

    si es este ultimo alli esta el problema, debes usar parametros, como explico aqui

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/19e56e70-33b9-4087-b84c-977a387cc46c/

     

    Using conn As New OleDb.OleDbConnection(strconexion)
            conn.Open()
           
            Dim strSQL As String = "SELECT * FROM Autorizaciones WHERE " & _
                                    "CAST(CONVERT(varchar(8), Fecha_Autorizacion, 112) as INT) " & _
                                    "BETWEEN CAST(CONVERT(varchar(8), @fechadesde, 112) as INT) " & _
                                    "AND CAST(CONVERT(varchar(8), @fechahasta, 112) as INT) "

            Dim cmd As New OleDb.OleDbCommand(strSQL, conn)
            cmd.Parameters.AddWithValue("@item", textSalidaITEM.Text)
           
            cmd.Parameters.AddWithValue("@fechadesde", CDate("22/04/2010"))
            cmd.Parameters.AddWithValue("@fechahasta", CDate("22/04/2010"))

            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
       
        End Using

     

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Hola Leandro y Pedro,

    Lo que estoy haciendo es sobre un gridview que por defecto, muestra todos los registros, dar la posibilidad de filtrarlos para localizar determinada información.

    No lo he hecho con parámetros por que hay campos que son obligatorios en la bd pero que para el filtro no tienen por que ponerse, es decir, si en código yo digo que un campo va a ser parametrizado, pero el usuario decide no filtrarlo, ¿como hago para que me aparezcan todos? ¿que pongo en el cmd.Parameters.AddWithValue?

    Como lo estoy haciendo ahora, lo que hago es generar un filtro y asignarlo al sqldatasource del que depende el grid:

    SqlDataSource1.FilterExpression = filtro

    SqlDataSource1.DataBind()

    saludos cordiales


    Empezando ;)
    • Editado Alberto SH martes, 12 de julio de 2011 10:24 Solucionado
    martes, 12 de julio de 2011 9:26
  • Hola Alberto:

     

    "No lo he hecho con parámetros por que hay campos que son obligatorios en la bd pero que para el filtro no tienen por que ponerse, es decir, si en código yo digo que un campo va a ser parametrizado, pero el usuario decide no filtrarlo, ¿como hago para que me aparezcan todos? ¿que pongo en el cmd.Parameters.AddWithValue?"

     

    puedes escribir la sentencia de la siguiente forma 

     

    select * from tabla

    where (campo  = @campo or @campo is null)

     

    el valor que tienes que agregar a "cmd.Parameters.AddWithValue"

    es el siguiente:

     

    cmd.Parameters.AddWithValue(@campo,System.DbNull.Value); // si el valor es null

     

    cmd.Parameters.AddWithValue(@campo,Valor); // si el valor no es null

    Entendiendo que Valor es una variable que almacena el valor.

    Saludos

     


    phurtado
    • Marcado como respuesta Alberto SH miércoles, 13 de julio de 2011 9:47
    martes, 12 de julio de 2011 13:01