none
Registrar datos de un datagrid en una base de datos SQL

    Pregunta

  • Tengo el siguiente form y quiero pasar esos datos del Datagrid a una base de datos de SQL, tengo la conexion hecha y todo,estoy usando el siguiente codigo

    For Each fila As DataGridViewRow In Listado_Ventas.Rows

                    If Listado_Ventas.Rows.Count > 0 Then
                        dts.gCODIGO = (fila.Cells("CODIGO").Value)
                        dts.gDESCRIPCION = (fila.Cells("DESCRIPCION").Value)
                        dts.gFECHA_SALIDA = Today.Date
                        dts.gCANTIDAD = (fila.Cells("CANTIDAD").Value)
                        dts.gPRECIO = (fila.Cells("PRECIO").Value)
                        dts.gTOTAL = (fila.Cells("TOTAL").Value)
                        dts.gTIPO = "VENTA"
                    Else
                        MsgBox("No se puede registrar la venta, No hay Productos en el listado...", MsgBoxStyle.Information, "Procesando Venta")
                    End If

                Next

    pero solo me registra la ultima fila y no todas, que estoy haciendo mal ?

    de ante mano muchas gracias

    miércoles, 12 de octubre de 2016 16:11

Respuestas

  •  solo me registra la ultima fila y no todas, que estoy haciendo mal ?

    Bueno, lo que estás haciendo mal es que solo has escrito las instrucciones para grabar una fila, con lo que no es extraño que solo grabe una fila.

    Fíjate en el código que has presentado, que lo que hace es copiar los datos de una fila del datagridview (que presumiblemente antes has cargado en la variable "fila") a un objeto que se llama dts y que presumiblemente es una entidad que luego presumiblemente transfieres a tu capa de datos y la grabas. Todos esos "presumiblemente" del párrafo anterior se deben a que no has mostrado ni explicado nada acerca de esos datos de entrada o de cómo se hace la grabación, por lo que las conclusiones son presunciones inferidas a partir de los nombres de las variables.

    Para grabar todas las filas, tendrías que repetir dentro de un bucle todas las mismas instrucciones (las que has presentado más las presuntas que ocurren antes y después para leer la fila y llamar a la capa de datos). Lógicamente, dentro del bucle en la parte donde se cargue la variable "fila", hay que cargarla a cada iteración con una fila distinta, no siempre con la última.

    miércoles, 12 de octubre de 2016 17:58
  • El_vena,

    Sobre lo mencionado por Alberto, por cada fila que leas -de la colección Rows- debes invocar al procedimiento 'registrar_ventas()'

    Private Sub btnGrabar_Click(sender As Object, e As EventArgs) Handles btnGrabar.Click
    
    	If Listado_Ventas.Rows.Count > 0 Then
    		For Each fila As DataGridViewRow In Listado_Ventas.Rows
    
    			Dim dts As New vventas
    
    			dts.gCODIGO = CInt(fila.Cells("CODIGO").Value)
    			dts.gDESCRIPCION = CStr(fila.Cells("DESCRIPCION").Value)
    			dts.gFECHA_SALIDA = Today.Date
    			dts.gCANTIDAD = CDec(fila.Cells("CANTIDAD").Value)
    			dts.gPRECIO = CDec(fila.Cells("PRECIO").Value)
    			dts.gTOTAL = CDec(fila.Cells("TOTAL").Value)
    			dts.gTIPO = "VENTA"
    
    			registrar_ventas(dts)
    		Next
    	Else
    		MessageBox.Show("No se puede registrar la venta, No hay Productos en el listado...")
    	End If
    
    End Sub


    Consideraciones acerca de la clase 'vventas':

    1. Si los descriptores de acceso no implementan lógica puedes definir propiedades auto-implementadas: Propiedades implementadas automáticamente (Visual Basic)
    2. Las propiedades 'Cantidad', 'Precio' y 'Total' deberían ser de tipo 'decimal'.

    Evita el uso de conexiones globales en el procedimiento 'registrarventas()', evita tener una instancia global de la clase SQLCommand, tampoco veo necesario que sea un procedimiento Function:

    Public Sub registrar_ventas(ByVal dts As vventas)
    	Try
    		Using cn As New SqlConnection("<Colocar cadena de conexión>")
    			Dim cmd As New SqlCommand("registrar_ventas", cn)
    			cmd.CommandType = CommandType.StoredProcedure
    
    			cmd.Parameters.AddWithValue("@CODIGO", dts.gCODIGO)
    			cmd.Parameters.AddWithValue("@DESCRIPCION", dts.gDESCRIPCION)
    			cmd.Parameters.AddWithValue("@FECHA_SALIDA", dts.gFECHA_SALIDA)
    			cmd.Parameters.AddWithValue("@UNIDADES", dts.gCANTIDAD)
    			cmd.Parameters.AddWithValue("@PRECIO", dts.gPRECIO)
    			cmd.Parameters.AddWithValue("@TOTAL", dts.gTOTAL)
    			cmd.Parameters.AddWithValue("@TIPO", dts.gTIPO)
    
    			cn.Open()
    			cmd.ExecuteNonQuery()
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 12 de octubre de 2016 19:17

Todas las respuestas

  •  solo me registra la ultima fila y no todas, que estoy haciendo mal ?

    Bueno, lo que estás haciendo mal es que solo has escrito las instrucciones para grabar una fila, con lo que no es extraño que solo grabe una fila.

    Fíjate en el código que has presentado, que lo que hace es copiar los datos de una fila del datagridview (que presumiblemente antes has cargado en la variable "fila") a un objeto que se llama dts y que presumiblemente es una entidad que luego presumiblemente transfieres a tu capa de datos y la grabas. Todos esos "presumiblemente" del párrafo anterior se deben a que no has mostrado ni explicado nada acerca de esos datos de entrada o de cómo se hace la grabación, por lo que las conclusiones son presunciones inferidas a partir de los nombres de las variables.

    Para grabar todas las filas, tendrías que repetir dentro de un bucle todas las mismas instrucciones (las que has presentado más las presuntas que ocurren antes y después para leer la fila y llamar a la capa de datos). Lógicamente, dentro del bucle en la parte donde se cargue la variable "fila", hay que cargarla a cada iteración con una fila distinta, no siempre con la última.

    miércoles, 12 de octubre de 2016 17:58
  • Tengo una clase llamada vventas con el siguiente codigo

    Public Class vventas
        Dim CODIGO As Integer
        Dim DESCRIPCION, TIPO As String
        Dim CANTIDAD, PRECIO, TOTAL As Double
        Dim FECHA_SALIDA As Date
        Public Property gTIPO
            Get
                Return TIPO
            End Get
            Set(ByVal value)
                TIPO = value

            End Set
        End Property
        Public Property gFECHA_SALIDA
            Get
                Return FECHA_SALIDA

            End Get
            Set(ByVal value)
                FECHA_SALIDA = value
            End Set
        End Property
        Public Property gCODIGO
            Get
                Return CODIGO

            End Get
            Set(ByVal value)
                CODIGO = value
            End Set
        End Property
        Public Property gDESCRIPCION
            Get
                Return DESCRIPCION
            End Get
            Set(ByVal value)
                DESCRIPCION = value
            End Set
        End Property
        Public Property gCANTIDAD
            Get
                Return CANTIDAD
            End Get
            Set(ByVal value)
                CANTIDAD = value
            End Set
        End Property


        Public Property gPRECIO
            Get
                Return PRECIO

            End Get
            Set(ByVal value)
                PRECIO = value

            End Set
        End Property


        Public Property gTOTAL
            Get
                Return TOTAL
            End Get
            Set(ByVal value)
                TOTAL = value
            End Set
        End Property
        Public Sub New()

        End Sub
        Public Sub New(ByVal CODIGO As Integer, ByVal TIPO As String, ByVal FECHA_SALIDA As Date, ByVal DESCRIPCION As String, ByVal CANTIDAD As Double, ByVal PRECIO As Double, ByVal TOTAL As Double)
            gCODIGO = CODIGO
            gDESCRIPCION = DESCRIPCION
            gCANTIDAD = CANTIDAD
            gPRECIO = PRECIO
            gTOTAL = TOTAL
            gFECHA_SALIDA = FECHA_SALIDA
            gTIPO = TIPO
        End Sub
    End Class

    y una llamda fventas donde se encuentran los parametros

    Imports System.Data.SqlClient
    Public Class fventas


        Inherits conexion
        Dim cmd As New SqlCommand
        Public Function registrar_ventas(ByVal dts As vventas) As Boolean
            Try
                conectado()
                cmd = New SqlCommand("registrar_ventas")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cnn


                cmd.Parameters.AddWithValue("@CODIGO", dts.gCODIGO)
                cmd.Parameters.AddWithValue("@DESCRIPCION", dts.gDESCRIPCION)
                cmd.Parameters.AddWithValue("@FECHA_SALIDA", dts.gFECHA_SALIDA)
                cmd.Parameters.AddWithValue("@UNIDADES", dts.gCANTIDAD)
                cmd.Parameters.AddWithValue("@PRECIO", dts.gPRECIO)
                cmd.Parameters.AddWithValue("@TOTAL", dts.gTOTAL)
                cmd.Parameters.AddWithValue("@TIPO", dts.gTIPO)
                If cmd.ExecuteNonQuery Then
                    Return True
                Else
                    Return False
                End If

            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            Finally
                desconectado()
            End Try
        End Function

    miércoles, 12 de octubre de 2016 18:40
  • Sí, efectivamente más o menos concuerda con lo anterior, es decir, cabe presumir que "dts" es una instancia de la clase vventas y que después de cargarla con datos como indicabas en la primera pregunta, se ejecuta una llamada a registrar_ventas que graba UNA línea.

    Por lo tanto era válida la respuesta inicial en la que indicaba que hay que repetir esa llamada con un bucle que haga lo mismo que ahora estés haciendo para cargar "fila" (pero cambiándola para que a cada iteración use otra fila del grid), seguido del mismo código que antes mostraste para pasarla al dts, y finalmente la llamada que por algún sitio debes tener para que el dts se lo pase a registrar_ventas, quedando con eso completo el bucle.

    • Propuesto como respuesta Willams Morales miércoles, 12 de octubre de 2016 19:18
    miércoles, 12 de octubre de 2016 19:00
  • recien me estoy iniciando en todo esto, como podria realizar el bucle ? te lo agradeceria mucho
    miércoles, 12 de octubre de 2016 19:11
  • El_vena,

    Sobre lo mencionado por Alberto, por cada fila que leas -de la colección Rows- debes invocar al procedimiento 'registrar_ventas()'

    Private Sub btnGrabar_Click(sender As Object, e As EventArgs) Handles btnGrabar.Click
    
    	If Listado_Ventas.Rows.Count > 0 Then
    		For Each fila As DataGridViewRow In Listado_Ventas.Rows
    
    			Dim dts As New vventas
    
    			dts.gCODIGO = CInt(fila.Cells("CODIGO").Value)
    			dts.gDESCRIPCION = CStr(fila.Cells("DESCRIPCION").Value)
    			dts.gFECHA_SALIDA = Today.Date
    			dts.gCANTIDAD = CDec(fila.Cells("CANTIDAD").Value)
    			dts.gPRECIO = CDec(fila.Cells("PRECIO").Value)
    			dts.gTOTAL = CDec(fila.Cells("TOTAL").Value)
    			dts.gTIPO = "VENTA"
    
    			registrar_ventas(dts)
    		Next
    	Else
    		MessageBox.Show("No se puede registrar la venta, No hay Productos en el listado...")
    	End If
    
    End Sub


    Consideraciones acerca de la clase 'vventas':

    1. Si los descriptores de acceso no implementan lógica puedes definir propiedades auto-implementadas: Propiedades implementadas automáticamente (Visual Basic)
    2. Las propiedades 'Cantidad', 'Precio' y 'Total' deberían ser de tipo 'decimal'.

    Evita el uso de conexiones globales en el procedimiento 'registrarventas()', evita tener una instancia global de la clase SQLCommand, tampoco veo necesario que sea un procedimiento Function:

    Public Sub registrar_ventas(ByVal dts As vventas)
    	Try
    		Using cn As New SqlConnection("<Colocar cadena de conexión>")
    			Dim cmd As New SqlCommand("registrar_ventas", cn)
    			cmd.CommandType = CommandType.StoredProcedure
    
    			cmd.Parameters.AddWithValue("@CODIGO", dts.gCODIGO)
    			cmd.Parameters.AddWithValue("@DESCRIPCION", dts.gDESCRIPCION)
    			cmd.Parameters.AddWithValue("@FECHA_SALIDA", dts.gFECHA_SALIDA)
    			cmd.Parameters.AddWithValue("@UNIDADES", dts.gCANTIDAD)
    			cmd.Parameters.AddWithValue("@PRECIO", dts.gPRECIO)
    			cmd.Parameters.AddWithValue("@TOTAL", dts.gTOTAL)
    			cmd.Parameters.AddWithValue("@TIPO", dts.gTIPO)
    
    			cn.Open()
    			cmd.ExecuteNonQuery()
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 12 de octubre de 2016 19:17