none
Error de lectura porque no hay datos RRS feed

  • Pregunta

  • Hola a todos estoy desarrollando una aplicación de cotizaciones con windows form y al hacer clic en un botón muestra "Error de lectura porque no hay datos". El el código de mi botón tengo esto

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            'guardar_cotizacion()

            If guardar_cotizacion() And guardar_orden() Then
                If guardar_relacion_pedido_cotizacion_orden() Then
                    If crear_pdf_cotizacion() And crear_pdf_ver2() Then
                        If crear_correo_y_enviar() Then
                        End If
                    Else
                    End If
                Else
                End If
            Else
            End If
            MsgBox("Se ha generado la cotización versión 2")
            Me.DialogResult = System.Windows.Forms.DialogResult.OK
            Me.Close()
        End Sub

    Y donde yo creo que tengo el problema es en la siguiente definición.

    Private Function guardar_cotizacion() As Boolean
            Try
                Dim c As New ConexionBD()
                Dim conn As SqlConnection = c.conectar()
                Dim command As New SqlCommand("SELECT * FROM SCSAdmin.pedidos_nom005 WHERE id_pedido =" & pedido, conn)
                Dim dr As SqlDataReader = command.ExecuteReader()
                If dr.HasRows And dr.Read Then
                    Dim idCte As Integer = dr.GetInt32(1)
                    command = New SqlCommand("select * from SCSAdmin.cotizaciones_nom_005 where id_pedido = " & pedido & " and id_cliente =" & idCte, conn)
                    dr.Close()
                    dr = command.ExecuteReader()
                    If dr.HasRows And dr.Read() Then
                        Dim id_cliente As Integer = idCte
                        TextBox8.Text = dr.GetString(16)
                        'Dim idCte As Integer = dr.GetInt32(1)
                        Dim version As Integer = 2
                        Dim empresa As String = TextBox15.Text
                        Dim atencion_inicial As String = TextBox16.Text
                        Dim puesto_inicial As String = TextBox17.Text
                        Dim Localizacion As String = TextBox18.Text
                        Dim telefono_inicial As String = TextBox19.Text
                        Dim correo_electronico_inicial As String = TextBox20.Text
                        Dim subt As Double
                        'Double.TryParse(TextBox1.Text, subt)
                        Dim row As DataGridViewRow = dgvSeleccion.Rows([dgvSeleccion].Rows.Count - 1)

                        Dim subtotal As Decimal = 0
                        Dim sup As Decimal = 0
                        Dim iva As Decimal = 0
                        Dim iv As Decimal = 0
                        'VARIABLES TOTAL POR FILA
                        Dim tot As Decimal = 0
                        Dim cantidad As Decimal = 0
                        Dim precio_uni As Decimal = 0
                        'VARIABLES TOTAL FINAL
                        Dim total As Decimal = 0
                        Dim precio_final As Decimal = 0
                        Dim iva_final As Decimal = 0

                        For i As Integer = 0 To dgvSeleccion.Rows.Count - 1

                            cantidad = dgvSeleccion.Item("cantidad", i).Value
                            precio_uni = dgvSeleccion.Item("precio", i).Value

                            subtotal = precio_uni * cantidad
                            sup += subtotal

                            iva = subtotal * 0.16
                            iv += iva

                            tot = tot + subtotal + iva

                        Next

                        precio_final = (sup)
                        iva_final = (iv)
                        total = (tot)

                        Dim subtotal_final As Decimal = precio_final
                        Dim iva_fin As Decimal = iva_final
                        Dim total_final As Decimal = total

                        Dim total_letra As String = "(" & calcular_letras(total.ToString.Replace(",", ".")) & ")"
                        'Dim total_letra As String = "quinientos cincuenta"
                        Dim nombre_facturacion As String = TextBox25.Text
                        Dim direccion_fiscal As String = TextBox26.Text
                        Dim rfc As String = TextBox27.Text
                        Dim observaciones As String = TextBox28.Text
                        Dim nombre_persona_acepta As String = TextBox29.Text
                        Dim area_persona_acepta As String = TextBox30.Text
                        Dim correo_electronico_persona_acepta As String = TextBox31.Text
                        Dim telefono_persona_acepta As String = TextBox32.Text
                        Dim ubicacion As String = TextBox33.Text
                        Dim pais_cliente As String = TextBox34.Text
                        Dim estado_cliente As String = TextBox35.Text
                        Dim ubicacion_cliente As String = TextBox36.Text
                        Dim contacto_recibe_personal As String = TextBox37.Text
                        Dim correo_contacto As String = TextBox38.Text
                        Dim telefono_contacto As String = TextBox39.Text
                        Dim viaticos As Data.SqlTypes.SqlMoney = Double.TryParse(TextBox40.Text, subt)


                        If viaticos > 0 Then
                            subtotal = subtotal + viaticos
                            iva = subtotal * 0.16
                            total = subtotal + iva
                            total_letra = "(" & calcular_letras(total.ToString.Replace(",", ".")) & ")"
                        End If
                        dr.Read()
                        conn.Close()
                        'total_orden = total / 2
                        Dim fecha As Date
                        conn.Open()
                        command = New SqlCommand("SELECT GETDATE()", conn)
                        reader = command.ExecuteReader()
                        reader.Read()
                        fecha = reader.GetDateTime(0).Date
                        'conn.Close()
                        reader.Close()
                        Dim vigencia As Date = DateAdd("m", 6, fecha)
                        'conn.Open()
                        command = New SqlCommand("INSERT INTO SCSAdmin.cotizaciones_nom_005 " & _
                                             "(versi,fecha_cotizada,empresa,atencion_inicial,puesto_inicial,localizacion_inicial," & _
                                             "telefono_inicial,correo_electronico_inicial,subtotal,iva,total,total_letra,vigencia," & _
                                             "nombre_facturacion,direccion_fiscal,rfc_facturacion,comentarios,nombre_persona_acepta," & _
                                             "area_persona_acepta,correo_persona_acepta,telefono_persona_acepta,ubicacion_servicio," & _
                                             "pais_cliente,estado_cliente,ubicacion_cliente,contacto_recibe_personal,telefono_contacto," & _
                                             "correo_contacto,id_cliente,viaticos_iniciales,id_pedido) VALUES" & _
                                             "(@p1,@p2,@p3,@p4,@p5,@p6," & _
                                             "@p7,@p8,@p9,@p10,@p11,@p12,@p13," & _
                                             "@p14,@p15,@p16,@p17,@p18," & _
                                             "@p19,@p20,@p21,@p22," & _
                                             "@p23,@p24,@p25,@p26,@p27," & _
                                             "@p28,@p29,@p30,@p31) SELECT @@Identity", conn)
                        command.Parameters.AddWithValue("@p1", version)
                        command.Parameters.AddWithValue("@p2", fecha)
                        command.Parameters.AddWithValue("@p3", empresa)
                        command.Parameters.AddWithValue("@p4", atencion_inicial)
                        command.Parameters.AddWithValue("@p5", puesto_inicial)
                        command.Parameters.AddWithValue("@p6", Localizacion)
                        command.Parameters.AddWithValue("@p7", telefono_inicial)
                        command.Parameters.AddWithValue("@p8", correo_electronico_inicial)
                        command.Parameters.AddWithValue("@p9", subtotal_final)
                        command.Parameters.AddWithValue("@p10", iva_fin)
                        command.Parameters.AddWithValue("@p11", total_final)
                        command.Parameters.AddWithValue("@p12", total_letra)
                        command.Parameters.AddWithValue("@p13", vigencia)
                        command.Parameters.AddWithValue("@p14", nombre_facturacion)
                        command.Parameters.AddWithValue("@p15", direccion_fiscal)
                        command.Parameters.AddWithValue("@p16", rfc)
                        If observaciones.Length = 0 Then
                            command.Parameters.AddWithValue("@p17", observaciones).Value = DBNull.Value
                        Else
                            command.Parameters.AddWithValue("@p17", observaciones)
                        End If
                        command.Parameters.AddWithValue("@p18", nombre_persona_acepta)
                        command.Parameters.AddWithValue("@p19", area_persona_acepta)
                        command.Parameters.AddWithValue("@p20", correo_electronico_persona_acepta)
                        command.Parameters.AddWithValue("@p21", telefono_persona_acepta)
                        command.Parameters.AddWithValue("@p22", ubicacion)
                        command.Parameters.AddWithValue("@p23", pais_cliente)
                        command.Parameters.AddWithValue("@p24", estado_cliente)
                        command.Parameters.AddWithValue("@p25", ubicacion_cliente)
                        command.Parameters.AddWithValue("@p26", contacto_recibe_personal)
                        command.Parameters.AddWithValue("@p27", telefono_contacto)
                        command.Parameters.AddWithValue("@p28", correo_contacto)
                        command.Parameters.AddWithValue("@p29", idCte)
                        command.Parameters.AddWithValue("@p30", viaticos)
                        command.Parameters.AddWithValue("@p31", pedido)
                        id_cotizacion = CInt(command.ExecuteScalar())
                        'Session("id_cotizacion") = id_cotizacion
                        'reader = command.ExecuteReader()
                        'reader.Read()
                        'reader.Close()
                        partidas = New ArrayList
                        Dim nopartida As Integer = 0

                        For Each rows As DataGridViewRow In dgvSeleccion.Rows
                            ' Dim i As Integer

                            Dim nueva_partida As New Partida
                            nueva_partida.familia_dispensario = rows.Cells("modelo").Value
                            nueva_partida.cantidad = rows.Cells("cantidad").Value
                            'nueva_partida.Cant = row.Cells("cantidad").Value & i
                            nopartida = nopartida + 1
                            nueva_partida.num_partida = nopartida
                            Dim comand = New SqlCommand("SELECT descripcion,precio FROM SCSAdmin.servicios_nom_005 WHERE id_servicio = '" & rows.Cells("Id_Servicio").Value & "'", conn)
                            Dim reader As SqlDataReader = comand.ExecuteReader()
                            'reader.Close()
                            If reader.Read() Then
                                'Dim Cantidad_modelo As Integer = Cantidad
                                'Dim modelo As String = rows.Cells("modelo").Value
                                nueva_partida.Descripcion = reader.GetString(0)
                                nueva_partida.precio_uni = reader.GetSqlMoney(1)
                                nueva_partida.precio_total = nueva_partida.precio_uni * nueva_partida.cantidad
                            End If

                            'comand = New SqlCommand("select id_cotizacion from SCSAdmin.cotizaciones_nom_005 where id_pedido ='" & pedido & "' and versi= 2", conn)
                            'reader = comand.ExecuteReader()
                            'Dim idCotizacion = reader.GetInt32(0)
                            nueva_partida.id_cotizacion = id_cotizacion
                            reader.Close()
                            partidas.Add(nueva_partida)
                            'reader.Close()
                        Next
                        'Next

                        Dim suma As Integer = 0
                        Dim p As Partida
                        For Each p In partidas
                            comand = New SqlCommand("INSERT INTO SCSAdmin.partidas_cotizacion (id_cotizacion,num_partida,familia_dispensario,descripcion_servicio,cantidad,precio_unitario,precio_total)" & _
                                     "VALUES (@p1,@p2,@p3,@p4,@p5,@p6,@p7)", conn)
                            comand.Parameters.AddWithValue("@p1", p.id_cotizacion)
                            comand.Parameters.AddWithValue("@p2", p.num_partida)
                            comand.Parameters.AddWithValue("@p3", p.familia_dispensario)
                            comand.Parameters.AddWithValue("@p4", p.Descripcion)
                            comand.Parameters.AddWithValue("@p5", p.cantidad)
                            comand.Parameters.AddWithValue("@p6", p.precio_uni)
                            comand.Parameters.AddWithValue("@p7", p.precio_total)
                            suma = suma + comand.ExecuteNonQuery()
                        Next
                        conn.Close()
                        If suma > 0 Then
                            Return True
                        Else
                            Return False
                        End If
                    End If
                End If
                'conn.Close()
                Return True
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try
        End Function

    Espero sus respuestas, gracias

    miércoles, 27 de abril de 2016 21:32

Todas las respuestas

  • El "Error de lectura porque no hay datos" típicamente se produce cuando accedes a una columna de un DataReader sin haberle hecho antes el Read. Tu código está demasiado complicado como para ver de un simple vistazo dónde puede ocurrir eso; para eso está el debugger, que te permite encontrar la línea exacta donde ocurre y seguir paso a paso la ejecución hasta llegar a ella. Mi sospecha (dado que no puedo ejecutar tu código en el debugger) es que en tu caso estás usando la variable dr para el datareader DENTRO de un bucle que a su vez también usa la misma variable dr. Cuando cierras el datareader de dentro, se pasa a la siguiente iteración del bucle de fuera, que intenta usar el mismo dr pero que ahora está cerrado, y por eso le sale el error. Sugiero ir cambiando el nombre de variable para cada uno de los datareaders, en lugar de reutilizar la misma variable "dr".
    jueves, 28 de abril de 2016 6:10
  • Gracias por tu respuesta ya solucione mi error,  escribi una variable por otra y esa variable tenía un valor diferente al que necesitaba. gracias por tu ayuda
    jueves, 28 de abril de 2016 22:15