none
ERROR AL FILTRAR DOS FECHAS CON DATATIMEPICKER RRS feed

  • Pregunta

  • Hola amigos del foro tengo un problema y no lo puedo resolver.

    tengo un datagridview y dos datatimepicker en visual studio 2010 y utilizo el siguiente codigo para filtrar las fechas:

    Sub CargarFiltro()
            ds.Clear()
            da = New MySqlDataAdapter
            da.SelectCommand = New MySqlCommand("SELECT factmos.Fecha,productos.idProducto,CONCAT(productos.Categoria,' ',productos.SubCateg,' ',productos.Marca,' ',productos.Descripcion) AS Producto,productos.Stock,productos.StockMin,(productos.StockMin-productos.Stock) AS Pedir,ROUND((productos.Cotizacion*productos.PCosto),2) AS PCosto,COUNT(factmosdet.Cant) AS Cantidad FROM factmosdet INNER JOIN productos ON factmosdet.idProducto = productos.idProducto INNER JOIN factmos ON factmos.NFact = factmosdet.NFact WHERE factmos.Fecha>='" & dtpDesde.Text & "' AND  factmos.Fecha<='" & dtpHasta.Text & "' GROUP By Producto", conex.cnn)
            ds = New DataSet
            ds.Tables.Add("Partes")
            da.Fill(ds.Tables("Partes"))
            dv.Table = ds.Tables(0)
            dgvFactura.DataSource = dv
            dgvFactura.AllowUserToAddRows = False
        End Sub

    El filtrado en el datagrid me lo muestra bien si por ejemplo uso las fechas desde='01/05/2016' hasta=''15/05/2016', hasta ahi funciona bien.

    El problema esta cuando quiero filtrar fechas por ejemplo: desde='01/04/2016' hasta=''15/05/2016', no me muestra ningun registro en grid.

    si alguien me puede dar una mano con este problema se los agradeceria muchisimo.

     
    jueves, 12 de mayo de 2016 11:37

Respuestas

  • Tuve que cambiar el (dtpDesde.value.date) por (dtpDesde.Text.ToString) ya que en la base de datos (mysql) tengo el campo fecha como (varchar) y no como (date) ya que tenia problemas para guardar las fechas de las facturas con este formato.

    Eso no lo deberías hacer nunca. Ten en cuenta que al guardar el dato como texto cuando ordenes por esa columna MySql va a realizar una ordenación alfanumérica, es decir, '01/12/2020' es menor que '10/01/2001' porque el primer carácter 0 de la primera fecha es menor que el primer carácter 1 de la segunda.

    Del mismo modo cuando tratas de filtrar utilizando operadores como < o > la lógica que va a aplicar es esta.

    Deberías cambiar el tipo de datos del campo a un tipo DATE o DATETIME (si te interesa guardar también la hora).

    Para realizar el filtro no tendrías más que aplicar el ejemplo que te pongo más arriba.

    Para guardar la fecha que tienes el TextBox en base de datos deberías convertir en tu código el texto del TextBox a un tipo DateTime y utilizar el mismo método que en el caso del filtrado: incluir parámetros en la sentencia y asignar los valores con Parameters.AddWithValue. Por ejemplo:

            Dim numFactura As Integer = 3343
            Dim fecha As DateTime = DateTime.ParseExact(TextBox1.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture)
            Dim cmd As New MySqlCommand(conex.cnn)
            cmd.CommandText = "UPDATE factmos SET Fecha=@fecha WHERE NFact=@numFact"
            cmd.Parameters.AddWithValue("@fecha", fecha)
            cmd.Parameters.AddWithValue("@numFact", numFactura)
            cmd.ExecuteNonQuery()
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta dj mac40 viernes, 13 de mayo de 2016 10:13
    jueves, 12 de mayo de 2016 18:24
  • Es un error bastante común. Tanto los campos de tipo fecha como las variables de tipo fecha de tu código no tienen formato. Representan un día del calendario que se almacena internamente como un número (generalmente el número de milisegundos desde una fecha por defecto).

    Si ves la fecha como "2016-05-13" es porque te la está formateando así la herramienta que estés utilizando para realizar la consulta en tu base de datos, no porque esté almacenada en ese formato.

    Cuando recuperes la fecha de la base de datos deberías recuperarla en una variable de tipo DateTime (que como he dicho tampoco tiene formato).

    El formato que desees debes aplicárselo tú cuando vayas a mostrárselo al usuario.

    Mira este ejemplo:

    Dim fecha As DateTime = new DateTime(2016, 5, 13)
    Dim fechaFormateada As String = fecha.ToString("dd/MM/yyyy")

    La variable fecha no tiene formato, es de tipo DateTime y te permite realizar operaciones con ella como añadir días, calcular diferencias con otras fechas, ordenar en una lista, etc. Simplemente representa el día 13 de mayo de 2016 sin ninguna especificación de formato.

    La variable fechaFormateada es un String que representa el valor de fecha con el formato "dd/MM/yyyy", es decir "13/05/2016".

    La variable fecha es la que deberías utilizar para pasar como parámetro a tus consultas o realizar operaciones en tu código.

    La variable fechaFormateada será la que muestres al usuario, por ejemplo en un TextBox:

    TextBox1.Text = fechaFormateada


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta dj mac40 viernes, 13 de mayo de 2016 16:41
    viernes, 13 de mayo de 2016 13:00

Todas las respuestas

  • Deberías acostumbrarte siempre a utilizar parámetros en tus consultas. De esta forma evitas problemas como estos que seguramente sean debidos al formato utilizado al convertir las fechas a string y viceversa.

    Si el campo Fecha de tu base de datos es de tipo fecha puedes pasarle a la consulta los valores directamente desde una variable de tipo DateTime.

            da.SelectCommand = New MySqlCommand("SELECT factmos.Fecha,productos.idProducto,CONCAT(productos.Categoria,' ',productos.SubCateg,' ',productos.Marca,' ',productos.Descripcion) AS Producto,productos.Stock,productos.StockMin,(productos.StockMin-productos.Stock) AS Pedir,ROUND((productos.Cotizacion*productos.PCosto),2) AS PCosto,COUNT(factmosdet.Cant) AS Cantidad FROM factmosdet INNER JOIN productos ON factmosdet.idProducto = productos.idProducto INNER JOIN factmos ON factmos.NFact = factmosdet.NFact WHERE factmos.Fecha>=?fechaDesde AND  factmos.Fecha<=?fechaHasta GROUP By Producto", conex.cnn)
            da.SelectCommand.Parameters.AddWithValue("?fechaDesde", dtpDesde.Value.Date)
            da.SelectCommand.Parameters.AddWithValue("?fechaHasta", dtpHasta.Value.Date)
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 12 de mayo de 2016 11:48
  • Hola amigo Asier, muchisimas gracias por responder tan pronto.

    Modifique el codigo que me pasaste amigo de Esta Forma:

    Sub cargarfiltro()
            ds.Clear()
            Dim da As New MySqlDataAdapter
            da.SelectCommand = New MySqlCommand("SELECT factmos.Fecha,productos.idProducto,CONCAT(productos.Categoria,' ',productos.SubCateg,' ',productos.Marca,' ',productos.Descripcion) AS Producto,productos.Stock,productos.StockMin,(productos.StockMin-productos.Stock) AS Pedir,ROUND((productos.Cotizacion*productos.PCosto),2) AS PCosto,COUNT(factmosdet.Cant) AS Cantidad FROM factmosdet INNER JOIN productos ON factmosdet.idProducto = productos.idProducto INNER JOIN factmos ON factmos.NFact = factmosdet.NFact WHERE factmos.Fecha>=@fechaDesde AND  factmos.Fecha<=@fechaHasta GROUP By Producto", conex.cnn)
            da.SelectCommand.Parameters.AddWithValue("@fechaDesde", dtpDesde.Text.ToString)
            da.SelectCommand.Parameters.AddWithValue("@fechaHasta", dtpHasta.Text.ToString)
            da.Fill(ds, "Facturas")
            dgvFactura.DataSource = ds.Tables("Facturas")
        End Sub

    Tuve que cambiar el (dtpDesde.value.date) por (dtpDesde.Text.ToString) ya que en la base de datos (mysql) tengo el campo fecha como (varchar) y no como (date) ya que tenia problemas para guardar las fechas de las facturas con este formato.

    Si las fechas son del mismo mes (01/05/2016 y 15/05/2016) me las filtra perfecto pero cuando intento con dos meses diferentes no me las filtra (01/04/2016 y 15/05/2016).

    Puede ser amigo Asier, que sea por el tipo de dato del campo en la tabla que tenga ese problema y si tengo que cambiarlo como seria para guardar las fechas desde un textbox que tengo en el sistema de facturacion para guardarlo en la tabla para que ne me de error.

    Desde ya muchisimas gracias por tu ayuda amigo Asier.

     

    jueves, 12 de mayo de 2016 16:58
  • Tuve que cambiar el (dtpDesde.value.date) por (dtpDesde.Text.ToString) ya que en la base de datos (mysql) tengo el campo fecha como (varchar) y no como (date) ya que tenia problemas para guardar las fechas de las facturas con este formato.

    Eso no lo deberías hacer nunca. Ten en cuenta que al guardar el dato como texto cuando ordenes por esa columna MySql va a realizar una ordenación alfanumérica, es decir, '01/12/2020' es menor que '10/01/2001' porque el primer carácter 0 de la primera fecha es menor que el primer carácter 1 de la segunda.

    Del mismo modo cuando tratas de filtrar utilizando operadores como < o > la lógica que va a aplicar es esta.

    Deberías cambiar el tipo de datos del campo a un tipo DATE o DATETIME (si te interesa guardar también la hora).

    Para realizar el filtro no tendrías más que aplicar el ejemplo que te pongo más arriba.

    Para guardar la fecha que tienes el TextBox en base de datos deberías convertir en tu código el texto del TextBox a un tipo DateTime y utilizar el mismo método que en el caso del filtrado: incluir parámetros en la sentencia y asignar los valores con Parameters.AddWithValue. Por ejemplo:

            Dim numFactura As Integer = 3343
            Dim fecha As DateTime = DateTime.ParseExact(TextBox1.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture)
            Dim cmd As New MySqlCommand(conex.cnn)
            cmd.CommandText = "UPDATE factmos SET Fecha=@fecha WHERE NFact=@numFact"
            cmd.Parameters.AddWithValue("@fecha", fecha)
            cmd.Parameters.AddWithValue("@numFact", numFactura)
            cmd.ExecuteNonQuery()
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta dj mac40 viernes, 13 de mayo de 2016 10:13
    jueves, 12 de mayo de 2016 18:24
  • Hola amigo Asier.

    Como siempre, impecable su respuesta, efectivamente cambie el formato "varchar" del campo "fecha" de la tabla mysql a "date" y si bien me lo guarda como "2016-05-13", en la consulta que necesito hacer me funciona perfecto, ahora me salen las facturas con las fechas que quiero consultar.

    Ahora, sin querer abusar de su tiempo amigo asier, se puede cambiar el formato de como se guarda en la tabla de mysql la fecha, o sea cambiar "2016-05-13" por "13/05/2016" directamente.

    Desde ya, MUCHISIMAS GRACIAS POR TU AYUDA AMIGO ASIER.

    viernes, 13 de mayo de 2016 10:29
  • Es un error bastante común. Tanto los campos de tipo fecha como las variables de tipo fecha de tu código no tienen formato. Representan un día del calendario que se almacena internamente como un número (generalmente el número de milisegundos desde una fecha por defecto).

    Si ves la fecha como "2016-05-13" es porque te la está formateando así la herramienta que estés utilizando para realizar la consulta en tu base de datos, no porque esté almacenada en ese formato.

    Cuando recuperes la fecha de la base de datos deberías recuperarla en una variable de tipo DateTime (que como he dicho tampoco tiene formato).

    El formato que desees debes aplicárselo tú cuando vayas a mostrárselo al usuario.

    Mira este ejemplo:

    Dim fecha As DateTime = new DateTime(2016, 5, 13)
    Dim fechaFormateada As String = fecha.ToString("dd/MM/yyyy")

    La variable fecha no tiene formato, es de tipo DateTime y te permite realizar operaciones con ella como añadir días, calcular diferencias con otras fechas, ordenar en una lista, etc. Simplemente representa el día 13 de mayo de 2016 sin ninguna especificación de formato.

    La variable fechaFormateada es un String que representa el valor de fecha con el formato "dd/MM/yyyy", es decir "13/05/2016".

    La variable fecha es la que deberías utilizar para pasar como parámetro a tus consultas o realizar operaciones en tu código.

    La variable fechaFormateada será la que muestres al usuario, por ejemplo en un TextBox:

    TextBox1.Text = fechaFormateada


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta dj mac40 viernes, 13 de mayo de 2016 16:41
    viernes, 13 de mayo de 2016 13:00
  • Hola amigo Asier.

    Efectivamente es como ud lo cita en la respuesta, estoy utilizando el navicat para trabajar con myslq en la vista de las tablas, lo que hice fue cambiar en la consulta "select" el formato de la fecha por:

    Date_Format(FactMos.Fecha,'%d/%m/%Y') AS Fecha

    y me muestra en el datagrid el formato de fecha que necesito.

    La verdad que lo felicito amigo Asier, son muy bien explicadas sus respuestas.

    MUCHISIMAS GRACIAS POR SU AYUDA.

    viernes, 13 de mayo de 2016 16:58