none
Restar desde datagrid en sql

    Pregunta

  • Hola, tengo un formulario que se encarga de realizar las ventas, lo que quiero que haga es que al momento de realizar una venta el reste la cantidad de productos en la base de datos Sql. Al momento de realizar la ventas cuando por ejemplo agrego un producto par ala venta me lo resta del datagrtid donde están los productos de forma correcta. Después si vuelvo a ingresar me sigue quedando la misma cantidad. El código que tengo por ahora es este. Tal vez con un comando UPDATE pueda llegar a andar. Desde ya gracias.

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim Nombre, PrecioUnitario, Cantidad, Total, cantidad2 As String

            Nombre = DataGridView1(1, DataGridView1.CurrentRow.Index).Value
            PrecioUnitario = DataGridView1(2, DataGridView1.CurrentRow.Index).Value

      Try
                Using cn As New SqlConnection("Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")
                    cn.Open()
                    Cantidad = txtcant.Text
                    Dim ConsultaSQL As String = "Select CantidasStock - @Cantidad FROM Productos"
                    Dim cmd As New SqlCommand(ConsultaSQL, cn)

                    If txtcant.Text <= DataGridView1(3, DataGridView1.CurrentRow.Index).Value Then
                        Cantidad = txtcant.Text
                        Total = DataGridView1(2, DataGridView1.CurrentRow.Index).Value * Val(txtcant.Text)
                        DataGridView2.Rows.Add(Nombre, PrecioUnitario, Cantidad, Total)
                        cantidad2 = DataGridView1(3, DataGridView1.CurrentRow.Index).Value - Val(txtcant.Text)
                        DataGridView1(3, DataGridView1.CurrentRow.Index).Value = cantidad2
                        txtcant.Clear()

                        cmd.ExecuteNonQuery()
                    Else
                        MsgBox("No hay sufuciente stock para esta cantidad", MsgBoxStyle.OkOnly, "ERROR")
                        txtcant.Focus()

                    End If

                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

            End If

    No se si esta bien ahí pero me sale el error "debe declarar la variable escalar @cantidad"


    martes, 4 de octubre de 2016 20:05

Respuestas

  • Juan259,

    Claro, si efectúas una operación de venta las variables mínimas involucradas son el producto y la cantidad vendida (cliente, fecha de venta, nro de documento), por tanto, debes de restar la cantidad vendida sobre el stock actual de un determinado producto.

    /*Producto A, Stock 10 unidades*/
    
    /*Vendo 2 unidades del producto A*/
    
    UPDATE Productos SET Stock = Stock - 2 WHERE Producto = 'A';
    
    /*Stock actual del producto A: 8 unidades*/


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 miércoles, 5 de octubre de 2016 0:06
    martes, 4 de octubre de 2016 23:25
  • El código cual seria?El del producto?

     Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
            Try
                Using cn As New SqlConnection("Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")

                    Dim ConsultaSQL As String = "UPDATE Productos SET CantidasStock -= @Cantidad WHERE (Codigo = @Codigo)"
                    Dim cmd As New SqlCommand(ConsultaSQL, cn)
                    Dim productos As String = String.Empty
                    Dim cantidad2 As String
                    cantidad2 = Val(txtcant.Text)
                 

                    cmd.Parameters.AddWithValue("@cantidad", cantidad2)
                    cmd.Parameters.AddWithValue("@Codigo", )

                    For Each row As DataGridViewRow In DataGridView2.Rows
                        productos += String.Concat(row.Cells("Column1").Value.ToString(), ",")
                    Next

                    'Dim venta As New Ventas
                    With Me.Ventas
                        .Id_ventas = Convert.ToInt32(txtid.Text)
                        .Productos = productos.TrimEnd(","c)
                        .Total = Convert.ToDecimal(txttotal.Text)
                        .dtpFecha = DateTimePicker1.Value
                        .Cliente = cmbnomcliente.Text
                        .Usuario = NombreUsuario
                        Insertar(Ventas)

                        cn.Open()
                        cmd.ExecuteNonQuery()

                        MsgBox("La venta se guardo correctamente")
                        DataGridView2.Rows.Clear()
                    End With
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try


    • Editado Federico32113 martes, 4 de octubre de 2016 23:24
    • Marcado como respuesta Federico32113 miércoles, 5 de octubre de 2016 0:06
    martes, 4 de octubre de 2016 23:12

Todas las respuestas

  • Juan259,

    ¿Puedes poner la imagen del formulário para que se lo veamos ?


    JoseBonfim | Desde Brazil

    • Editado JoseBonfim martes, 4 de octubre de 2016 22:01
    martes, 4 de octubre de 2016 22:01
  • 

    No me deja subir la imagen tengo que verificar la cuenta.

    Pero no sabes porque me sale este error?debe declarar la variable escalar @cantidad



    martes, 4 de octubre de 2016 22:31
  • Juan259,

    La consulta de selección espera por un valor al parámetro @cantidad que tu no proporcionas:

    If txtcant.Text <= DataGridView1(3, DataGridView1.CurrentRow.Index).Value Then
    
    	Dim ConsultaSQL As String = "Select CantidasStock - @Cantidad FROM Productos"
    	Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    	cmd.Parameters.AddWithValue("@cantidad", COLOCAR_CANTIDAD)
    
    	Cantidad = txtcant.Text
    	Total = DataGridView1(2, DataGridView1.CurrentRow.Index).Value * Val(txtcant.Text)
    	DataGridView2.Rows.Add(Nombre, PrecioUnitario, Cantidad, Total)
    	cantidad2 = DataGridView1(3, DataGridView1.CurrentRow.Index).Value - Val(txtcant.Text)
    	DataGridView1(3, DataGridView1.CurrentRow.Index).Value = cantidad2
    	txtcant.Clear()
    
    	cmd.ExecuteNonQuery()
    Else
    	MsgBox("No hay sufuciente stock para esta cantidad", MsgBoxStyle.OkOnly, "ERROR")
    	txtcant.Focus()
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 4 de octubre de 2016 22:41
  • Sin embargo nota que la consulta de selección dentro del proceso no tiene ninguna función, no hace nada o por lo menos nunca recuperas el valor, si deseas actualizar el stock debes de realizar una consulta de actualización:

    Dim ConsultaSQL As String = "UPDATE Productos SET CantidasStock -= @Cantidad WHERE (Codigo = @Codigo)"
    Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    cmd.Parameters.AddWithValue("@Cantidad", COLOCAR_CANTIDAD)
    cmd.Parameters.AddWithValue("@Codigo", COLOCAR_CÓDIGO)
    
    cmd.ExecuteNonQuery()


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 4 de octubre de 2016 22:49
  • El código cual seria?El del producto?

     Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
            Try
                Using cn As New SqlConnection("Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")

                    Dim ConsultaSQL As String = "UPDATE Productos SET CantidasStock -= @Cantidad WHERE (Codigo = @Codigo)"
                    Dim cmd As New SqlCommand(ConsultaSQL, cn)
                    Dim productos As String = String.Empty
                    Dim cantidad2 As String
                    cantidad2 = Val(txtcant.Text)
                 

                    cmd.Parameters.AddWithValue("@cantidad", cantidad2)
                    cmd.Parameters.AddWithValue("@Codigo", )

                    For Each row As DataGridViewRow In DataGridView2.Rows
                        productos += String.Concat(row.Cells("Column1").Value.ToString(), ",")
                    Next

                    'Dim venta As New Ventas
                    With Me.Ventas
                        .Id_ventas = Convert.ToInt32(txtid.Text)
                        .Productos = productos.TrimEnd(","c)
                        .Total = Convert.ToDecimal(txttotal.Text)
                        .dtpFecha = DateTimePicker1.Value
                        .Cliente = cmbnomcliente.Text
                        .Usuario = NombreUsuario
                        Insertar(Ventas)

                        cn.Open()
                        cmd.ExecuteNonQuery()

                        MsgBox("La venta se guardo correctamente")
                        DataGridView2.Rows.Clear()
                    End With
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try


    • Editado Federico32113 martes, 4 de octubre de 2016 23:24
    • Marcado como respuesta Federico32113 miércoles, 5 de octubre de 2016 0:06
    martes, 4 de octubre de 2016 23:12
  • Juan259,

    Claro, si efectúas una operación de venta las variables mínimas involucradas son el producto y la cantidad vendida (cliente, fecha de venta, nro de documento), por tanto, debes de restar la cantidad vendida sobre el stock actual de un determinado producto.

    /*Producto A, Stock 10 unidades*/
    
    /*Vendo 2 unidades del producto A*/
    
    UPDATE Productos SET Stock = Stock - 2 WHERE Producto = 'A';
    
    /*Stock actual del producto A: 8 unidades*/


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 miércoles, 5 de octubre de 2016 0:06
    martes, 4 de octubre de 2016 23:25