none
Filtro datagridView por fecha y hora VB.Net en Acces RRS feed

  • Pregunta

  • Hola a todos, lamento volver a molestar con este tema...  hace poco me ayudaron con esta pregunta, pero desde una base de datos echa en SQL. En aquella ocación ocupe un procedimiento almacenado, que me ayudo a hacer un filtro de fechas y horas ahora debo hacer lo mismo pero en una base de datos en acces. Resulta que estoy desorientado y no se realmente como realizarlo alguien que me pueda ayudar?.

    Mi base de datos:  Id (int, not null) - Fecha (datetime) - Long(Varchar) - Lat (Varchar) - Oxi1(varchar) - Oxi2(Varchar)

    La ves anterior ocupaba la cadena de conección y llamaba a los datos con parámetros pero ahora vuelvo a repetir me perdí y no se como hacer esta consulta. he visto conexiones a acces y eso es todo.

    Gracias de ante mano

    sábado, 2 de julio de 2016 21:04

Respuestas

  • Hola adriian.91,

    No veo cual es el problema, porque es casi lo mismo.

      Public Sub filtrarDatos()
    
            Dim fechaHoraInicio As DateTime = New DateTime(DtpFechaIni.Value.Year,
                                                           DtpFechaIni.Value.Month,
                                                           DtpFechaIni.Value.Day,
                                                           DtpHoraIni.Value.Hour,
                                                           DtpHoraIni.Value.Minute,
                                                           DtpHoraIni.Value.Second)
    
            Dim fechaHoraFinal As DateTime = New DateTime(DtpFechaFin.Value.Year,
                                                           DtpFechaFin.Value.Month,
                                                           DtpFechaFin.Value.Day,
                                                           DtpHoraTer.Value.Hour,
                                                           DtpHoraTer.Value.Minute,
                                                           DtpHoraTer.Value.Second)
            Try
                Using con As New OleDbConnection("MiCadenaDeConexion")
                    con.Open()
    
               Dim _da As New OleDbDataAdapter("Select * from MITABLA where (Fecha between ? and ?) ", con)
                    _da.SelectCommand.Parameters.AddWithValue("@fi", fechaHoraInicio)
                    _da.SelectCommand.Parameters.AddWithValue("@ff", fechaHoraFinal)
    
                    Dim dt As New DataTable
    
                    'Cargamos el DataTable con el resultado
                    _da.Fill(dt)
    
                    'Asigno el resultado al DGV
                    DataGridView1.DataSource = dt
    
                End Using
            Catch ex As Exception
                MessageBox.Show("Error : " & ex.Message)
            End Try
        End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta adriian.91 sábado, 2 de julio de 2016 22:29
    sábado, 2 de julio de 2016 21:51
  • adriian.91,

    Como te das cuenta, el mecanismo de acceso a los datos es similar entre distintos orígenes de datos, la diferencia radica en las clases que expone cada proveedor según el origen de datos, para SQL Server el proveedor de datos es SqlClient mientras que para Ms-Access es OleDb, cada uno de ellos expone mecanismos para conectarse, ejecutar comandos sql y recuperar información.

    Sobre el código que muestras como ejemplo déjame darte unas consideraciones (aplica tanto para SqlClient como OeDb)

    1. Si sólo harás uso de un conjunto de datos para vincular a un contenedor de datos entonces basta con un objeto DataTable, es innecesario que declares un objeto de tipo DataSet.
    2. Puedes usar un objeto de tipo DataAdapter de manera directa sin necesidad de declarar previamente un objeto de tipo Command.
    3. Si haces uso de un objeto DataAdapter, abrir una conexión es opcional. Si la conexión está cerrada antes de llamar al método Fill, se abre para realizar la acción y luego se cierra.

    Respecto al error que presentas, es claro que debes de instalar los drivers del motor de base de datos de Microsoft Access de 32 o 64 bits, Microsoft Access Database Engine 2010 Redistributable

    EDITO, no olvides referir el espacio de nombres para el proveedor OleDb

    Imports System.Data.OleDb


    • Editado Willams Morales sábado, 2 de julio de 2016 22:21
    • Marcado como respuesta adriian.91 sábado, 2 de julio de 2016 22:29
    sábado, 2 de julio de 2016 22:17

Todas las respuestas

  • Hola adriian.91,

    - Supongo que obtendrás la fecha mediante un DateTimePicker? pero Hora y Fecha ?

    Te muestro un ejemplo :

         Public Sub filtrarDatos(ByVal _fecha As DateTime)
            Try
                Using con As New OleDbConnection("MiCadenaDeConexion")
                    con.Open()
    
                    Dim _da As New OleDbDataAdapter("Select * from MITABLA where Fecha = @fecha", con)
                    _da.SelectCommand.Parameters.AddWithValue("@fecha", _fecha)
    
                    Dim dt As New DataTable
    
                    'Cargamos el DataTable con el resultado
                    _da.Fill(dt)
    
                    'Asigno el resultado al DGV
                    DataGridView1.DataSource = dt
    
                End Using
            Catch ex As Exception
                MessageBox.Show("Error : " & ex.Message)
            End Try
        End Sub

    Ojo, tienes que seleccionar una fecha y hora iguales para que te muestren los resultados.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 2 de julio de 2016 21:29
  • claro con 4 datetimePicker antes lo hacia de esta forma 

    Private Sub btnconsulta_Click(sender As System.Object, e As System.EventArgs) Handles btnconsulta.Click

            Dim fecha As DateTime = DtpFechaIni.Value.Date
            Dim hora As DateTime = CDate(DtpHoraIni.Value.ToString)
            Dim fechaHoraIni As New DateTime(
                fecha.Year, fecha.Month, fecha.Day, hora.Hour, hora.Minute, hora.Second)

            fecha = DtpFechaFin.Value.Date
            hora = CDate(DtpHoraTer.Value.ToString)
            Dim fechaHoraFin As New DateTime(
                fecha.Year, fecha.Month, fecha.Day, hora.Hour, hora.Minute, hora.Second)


            Try

                Using conexionSQL As New SqlConnection(My.Settings.Patagon3)

                    Dim comando As SqlCommand = conexionSQL.CreateCommand()
                    comando.CommandText = "ReportePatagon"
                    comando.CommandType = CommandType.StoredProcedure


                    comando.Parameters.AddWithValue("@FechaInicio", fechaHoraIni)
                    comando.Parameters.AddWithValue("@FechaFin", fechaHoraFin)


                    Dim adaptador As New SqlDataAdapter(comando)
                    Dim datatable As New DataTable()
                    Dim ds As New DataSet
                    adaptador.Fill(datatable)
                    DataGridView1.DataSource = datatable


                End Using
            Catch ex As Exception
                MessageBox.Show("Se produjo un error : " & ex.Message)

            End Try


        End Sub

    sábado, 2 de julio de 2016 21:36
  • Hola adriian.91,

    No veo cual es el problema, porque es casi lo mismo.

      Public Sub filtrarDatos()
    
            Dim fechaHoraInicio As DateTime = New DateTime(DtpFechaIni.Value.Year,
                                                           DtpFechaIni.Value.Month,
                                                           DtpFechaIni.Value.Day,
                                                           DtpHoraIni.Value.Hour,
                                                           DtpHoraIni.Value.Minute,
                                                           DtpHoraIni.Value.Second)
    
            Dim fechaHoraFinal As DateTime = New DateTime(DtpFechaFin.Value.Year,
                                                           DtpFechaFin.Value.Month,
                                                           DtpFechaFin.Value.Day,
                                                           DtpHoraTer.Value.Hour,
                                                           DtpHoraTer.Value.Minute,
                                                           DtpHoraTer.Value.Second)
            Try
                Using con As New OleDbConnection("MiCadenaDeConexion")
                    con.Open()
    
               Dim _da As New OleDbDataAdapter("Select * from MITABLA where (Fecha between ? and ?) ", con)
                    _da.SelectCommand.Parameters.AddWithValue("@fi", fechaHoraInicio)
                    _da.SelectCommand.Parameters.AddWithValue("@ff", fechaHoraFinal)
    
                    Dim dt As New DataTable
    
                    'Cargamos el DataTable con el resultado
                    _da.Fill(dt)
    
                    'Asigno el resultado al DGV
                    DataGridView1.DataSource = dt
    
                End Using
            Catch ex As Exception
                MessageBox.Show("Error : " & ex.Message)
            End Try
        End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta adriian.91 sábado, 2 de julio de 2016 22:29
    sábado, 2 de julio de 2016 21:51
  • claro es que nunca he trabajado con acces

    llegue a la conclusion solo hace un rato no habia visto tu respuesta, pero me arroja el error:

    "El proveedor 'Microsoft.ACEOLEDB.12.0' no esta resgistrado en el equipo local"

    Private Sub btnconsulta_Click(sender As System.Object, e As System.EventArgs) Handles btnconsulta.Click

            Dim fecha As DateTime = DtpFechaIni.Value.Date
            Dim hora As DateTime = CDate(DtpHoraIni.Value.ToString)
            Dim fechaHoraIni As New DateTime(
                fecha.Year, fecha.Month, fecha.Day, hora.Hour, hora.Minute, hora.Second)

            fecha = DtpFechaFin.Value.Date
            hora = CDate(DtpHoraTer.Value.ToString)
            Dim fechaHoraFin As New DateTime(
                fecha.Year, fecha.Month, fecha.Day, hora.Hour, hora.Minute, hora.Second)


            Try

                Using conexion As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\adria\Desktop\bASE DE DATOS ACCES\DB_PV.mdb")
                    conexion.Open()
                    Dim Adapter As New OleDbDataAdapter("Select * from DB_PV where Fecha Between = @fechaInicio and @fechaFin", conexion)
                    Adapter.SelectCommand.Parameters.AddWithValue("@fechaInicio", fechaHoraFin)
                    Adapter.SelectCommand.Parameters.AddWithValue("@FechaFin", fechaHoraFin)

                    Dim datatable As New DataTable()
                    Dim ds As New DataSet
                    Adapter.Fill(datatable)
                    DataGridView1.DataSource = datatable


                End Using
            Catch ex As Exception
                MessageBox.Show("Se produjo un error : " & ex.Message)

            End Try


        End Sub

    sábado, 2 de julio de 2016 22:06
  • Hola adriian.91,

    Ese error es muy común, si lo buscas en google.

    Descarga el controlador para conectividad de datos.

    Componentes de conectividad de datos.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 2 de julio de 2016 22:12
  • adriian.91,

    Como te das cuenta, el mecanismo de acceso a los datos es similar entre distintos orígenes de datos, la diferencia radica en las clases que expone cada proveedor según el origen de datos, para SQL Server el proveedor de datos es SqlClient mientras que para Ms-Access es OleDb, cada uno de ellos expone mecanismos para conectarse, ejecutar comandos sql y recuperar información.

    Sobre el código que muestras como ejemplo déjame darte unas consideraciones (aplica tanto para SqlClient como OeDb)

    1. Si sólo harás uso de un conjunto de datos para vincular a un contenedor de datos entonces basta con un objeto DataTable, es innecesario que declares un objeto de tipo DataSet.
    2. Puedes usar un objeto de tipo DataAdapter de manera directa sin necesidad de declarar previamente un objeto de tipo Command.
    3. Si haces uso de un objeto DataAdapter, abrir una conexión es opcional. Si la conexión está cerrada antes de llamar al método Fill, se abre para realizar la acción y luego se cierra.

    Respecto al error que presentas, es claro que debes de instalar los drivers del motor de base de datos de Microsoft Access de 32 o 64 bits, Microsoft Access Database Engine 2010 Redistributable

    EDITO, no olvides referir el espacio de nombres para el proveedor OleDb

    Imports System.Data.OleDb


    • Editado Willams Morales sábado, 2 de julio de 2016 22:21
    • Marcado como respuesta adriian.91 sábado, 2 de julio de 2016 22:29
    sábado, 2 de julio de 2016 22:17