none
Error: Referencia a objeto no establecida como instancia de un objeto RRS feed

  • Pregunta

  • Hola!

    Tengo este código que me arroja el error que indico en el "asunto". Lo curioso es que sólo me lo arroja la primera vez. Tras aceptar el catch, sigue todo normal. 

    A qué se puede deber?

    Gracias de antemano!

    Imports System.Data.OleDb
    
    Public Class Entradas
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim dt As New DataTable
            dt = Mostrardatos()
            PersonalizaDgv(DataGridView1)
    
        End Sub
    
    
    
        Function Mostrardatos() As DataTable
            Try
                Dim fecha1 As Date = DateTimePicker1.Value.Date
                Dim fecha2 As Date = DateTimePicker2.Value.Date
                Using cnn As New OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\DBF;Extended Properties='dBASE 5.0;'")
                    Dim sqlbuscar As String = "SELECT PROVEE01.NOMBRE As Proveedor, " &
                                              "SUM(ENTRDT01.CANTIDAD) as Cantidad, " &
                                              "SUM(ENTRDT01.IMPORTE) As Importe " &
                                              "FROM		ENTRDT01 " &
                                              "INNER JOIN  PROVEE01 On ENTRDT01.PROVEEDOR=PROVEE01.CODIGO " &
                                              "WHERE ENTRDT01.FECHA BETWEEN @fecha1 AND @fecha2 " &
                                              "GROUP BY	PROVEE01.NOMBRE " &
                                              "ORDER BY	PROVEE01.NOMBRE"
    
                    Dim cmd As New OleDbCommand(sqlbuscar, cnn)
                    cmd.Parameters.AddWithValue("@fecha1", fecha1)
                    cmd.Parameters.AddWithValue("@fecha2", fecha2)
                    Dim da As New OleDbDataAdapter(cmd)
                    Dim tabla As New DataTable()
                    DataGridView1.DataSource = tabla
    
                    da.Fill(tabla)
    
                    Return tabla
                End Using
            Catch ex As Exception
                Throw
            End Try
        End Function
    
    
        Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
            Dim dt As New DataTable
            dt = Mostrardatos()
            PersonalizaDgv(DataGridView1)
    
        End Sub
    
        Private Sub DateTimePicker2_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker2.ValueChanged
            Dim dt As New DataTable
            dt = Mostrardatos()
            PersonalizaDgv(DataGridView1)
    
        End Sub
        Sub PersonalizaDgv(ByVal dgv As DataGridView)
            Try
                With dgv
                    .ReadOnly = True
                    .EnableHeadersVisualStyles = False
                    .ColumnHeadersDefaultCellStyle.BackColor = Color.Black
                    .ColumnHeadersDefaultCellStyle.ForeColor = Color.White
    
                    .Columns.Item("Proveedor").Width = 200
    
    
                    .Columns.Item("Cantidad").Width = 60
                    .Columns.Item("Cantidad").DefaultCellStyle.Format = "N0"
                    .Columns.Item("Cantidad").DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight
                    .Columns.Item("Cantidad").HeaderCell.Style.Alignment = DataGridViewContentAlignment.BottomRight
    
                    .Columns.Item("Importe").Width = 90
                    .Columns.Item("Importe").DefaultCellStyle.Format = "N2"
                    .Columns.Item("Importe").DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight
                    .Columns.Item("Importe").HeaderCell.Style.Alignment = DataGridViewContentAlignment.BottomRight
    
    
                End With
            Catch ex As Exception
                MsgBox("error al personalizar el dgv" & ex.ToString)
            End Try
        End Sub
    
    End Class
    

    miércoles, 24 de mayo de 2017 17:52

Respuestas

  • Hola algo que veo en tu código es que asignas el datatable al datagridview antes de llenarlo

      Dim tabla As New DataTable()
                    DataGridView1.DataSource = tabla
    
                    da.Fill(tabla)

    y debería ser algo como

      Dim tabla As New DataTable()
                   
                    da.Fill(tabla)
                     DataGridView1.DataSource = tabla
    

    Para saber en que parte del código cae antes de entrar al try catch podrías poner un punto de interrupción y hacer debug

    punto de interrupcion


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Saludos. Lima-Perú.

    • Marcado como respuesta R_Jorge miércoles, 24 de mayo de 2017 19:58
    miércoles, 24 de mayo de 2017 18:51
  • HOla

    el error se da porque el objeto no está lleno al asignarlo, mira lo que está en negrita:

      Try
                Dim fecha1 As Date = DateTimePicker1.Value.Date
                Dim fecha2 As Date = DateTimePicker2.Value.Date
                Using cnn As New OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\DBF;Extended Properties='dBASE 5.0;'")
                    Dim sqlbuscar As String = "SELECT PROVEE01.NOMBRE As Proveedor, " &
                                              "SUM(ENTRDT01.CANTIDAD) as Cantidad, " &
                                              "SUM(ENTRDT01.IMPORTE) As Importe " &
                                              "FROM		ENTRDT01 " &
                                              "INNER JOIN  PROVEE01 On ENTRDT01.PROVEEDOR=PROVEE01.CODIGO " &
                                              "WHERE ENTRDT01.FECHA BETWEEN @fecha1 AND @fecha2 " &
                                              "GROUP BY	PROVEE01.NOMBRE " &
                                              "ORDER BY	PROVEE01.NOMBRE"
    
                    Dim cmd As New OleDbCommand(sqlbuscar, cnn)
                    cmd.Parameters.AddWithValue("@fecha1", fecha1)
                    cmd.Parameters.AddWithValue("@fecha2", fecha2)
                    Dim da As New OleDbDataAdapter(cmd)
                    Dim tabla As New DataTable()
                    da.Fill(tabla)
                    DataGridView1.DataSource = tabla
                    Return tabla
                End Using
            Catch ex As Exception
                Throw
            End Try
        End Function
    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta R_Jorge miércoles, 24 de mayo de 2017 19:58
    miércoles, 24 de mayo de 2017 18:53
  • Muchas gracias a todos.

    Efectivamente se trataba de ese "pequeño" detalle. Sin embargo, a pesar de haberlo corregido seguía fallando en lo mismo. Hasta que eliminé la llamada a la función personalizardgv() en ambos eventos del datapicker, aunque aún no entiendo muy bien por qué con esto último sí funciona...

    miércoles, 24 de mayo de 2017 20:02

Todas las respuestas

  • Hola algo que veo en tu código es que asignas el datatable al datagridview antes de llenarlo

      Dim tabla As New DataTable()
                    DataGridView1.DataSource = tabla
    
                    da.Fill(tabla)

    y debería ser algo como

      Dim tabla As New DataTable()
                   
                    da.Fill(tabla)
                     DataGridView1.DataSource = tabla
    

    Para saber en que parte del código cae antes de entrar al try catch podrías poner un punto de interrupción y hacer debug

    punto de interrupcion


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Saludos. Lima-Perú.

    • Marcado como respuesta R_Jorge miércoles, 24 de mayo de 2017 19:58
    miércoles, 24 de mayo de 2017 18:51
  • HOla

    el error se da porque el objeto no está lleno al asignarlo, mira lo que está en negrita:

      Try
                Dim fecha1 As Date = DateTimePicker1.Value.Date
                Dim fecha2 As Date = DateTimePicker2.Value.Date
                Using cnn As New OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\DBF;Extended Properties='dBASE 5.0;'")
                    Dim sqlbuscar As String = "SELECT PROVEE01.NOMBRE As Proveedor, " &
                                              "SUM(ENTRDT01.CANTIDAD) as Cantidad, " &
                                              "SUM(ENTRDT01.IMPORTE) As Importe " &
                                              "FROM		ENTRDT01 " &
                                              "INNER JOIN  PROVEE01 On ENTRDT01.PROVEEDOR=PROVEE01.CODIGO " &
                                              "WHERE ENTRDT01.FECHA BETWEEN @fecha1 AND @fecha2 " &
                                              "GROUP BY	PROVEE01.NOMBRE " &
                                              "ORDER BY	PROVEE01.NOMBRE"
    
                    Dim cmd As New OleDbCommand(sqlbuscar, cnn)
                    cmd.Parameters.AddWithValue("@fecha1", fecha1)
                    cmd.Parameters.AddWithValue("@fecha2", fecha2)
                    Dim da As New OleDbDataAdapter(cmd)
                    Dim tabla As New DataTable()
                    da.Fill(tabla)
                    DataGridView1.DataSource = tabla
                    Return tabla
                End Using
            Catch ex As Exception
                Throw
            End Try
        End Function
    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta R_Jorge miércoles, 24 de mayo de 2017 19:58
    miércoles, 24 de mayo de 2017 18:53
  • Así a ojo, tiene buena pinta. No es evidente dónde se puede estar produciendo la Referencia No Establecida, porque todo lo que se ve a simple vista está bien inicializado. Incluso alguna cosa la tienes excesivamente inicializada, ya que haces un New Datatable y a continualción lo machacas con otro valor, con lo que el New no vale para nada. Pero eso no sería motivo para que ocurra el error.

    Así que vas a tener que usar el debugger. Pon un punto de ruptura y ejecuta el código línea por línea hasta que localices la línea exacta en la que sale el error. Sobre esa línea, pasa el ratón por encima de las variables y ve examinando los valores hasta que encuentres cuál es el que vale Nothing. Si después de eso todavía no es evidente la causa del problema, dinos aquí qué línea y qué variable son las causantes, y trataremos de averiguar por qué han quedado sin inicializar.

    miércoles, 24 de mayo de 2017 18:53
  • Muchas gracias a todos.

    Efectivamente se trataba de ese "pequeño" detalle. Sin embargo, a pesar de haberlo corregido seguía fallando en lo mismo. Hasta que eliminé la llamada a la función personalizardgv() en ambos eventos del datapicker, aunque aún no entiendo muy bien por qué con esto último sí funciona...

    miércoles, 24 de mayo de 2017 20:02