Punto de Venta Visual Basic (Parte 4)

Ejercicio Anterior|Ejercicio Siguiente
Pantalla de Ventas (frmVenta)
Diseñamos el formulario (frmVenta) de la siguiente manera:

Declaramos la variable que almacenará el total de la venta:
Dim varTotal As Double = 0

Proceso para agregar articulos a la lista de ventas:
    Protected Function Agregar() As Boolean
        Dim cnn As New OleDbConnection(CnnStr)
        Dim RowCount As Integer = 0
        Try
            cnn.Open()
            Dim cmd As New OleDbCommand
            cmd.Connection = cnn
            ''validamos si existe el producto
            cmd.CommandText = "SELECT COUNT(*) FROM PRODUCTOS " & _
                "WHERE ID_PRODUCTO=@ID_PRODUCTO"
            cmd.Parameters.Add("@ID_PRODUCTO", _
                OleDbType.VarChar, 50).Value = txtIdProducto.Text
            RowCount = CInt(cmd.ExecuteScalar)
            cmd.Parameters.Clear() ''Limpiamos parametros
            If (RowCount = 0) Then
                Throw (New Exception("El producto no existe"))
            End If
            ''insertamos el producto a la tabla temporal
            cmd.CommandText = "SELECT COUNT(*) " & _
                " FROM VENTA_DETALLE_TMP " & _
                " WHERE ID_PRODUCTO=@ID_PRODUCTO" & _
                " AND USER_LOGIN=@USER_LOGIN"
            cmd.Parameters.Add("@ID_PRODUCTO", _
                OleDbType.VarChar, 50).Value = txtIdProducto.Text
            cmd.Parameters.Add("@USER_LOGIN", _
                OleDbType.VarChar, 50).Value = frmLogin.UserLogin
            RowCount = CInt(cmd.ExecuteScalar)
            cmd.Parameters.Clear() ''Limpiamos parametros
            If (RowCount = 0) Then
                ''Nuevo
                cmd.CommandText = "INSERT INTO VENTA_DETALLE_TMP " & _
                    " (USER_LOGIN, ID_PRODUCTO,CANTIDAD," & _
                    "PRECIO_VENTA,PRECIO_COMPRA,IMPUESTO) " & _
                    " SELECT @USER_LOGIN, ID_PRODUCTO, @CANTIDAD, " & _
                    " PRECIO_VENTA, PRECIO_COMPRA, IMPUESTO " & _
                    " FROM PRODUCTOS WHERE ID_PRODUCTO=@ID_PRODUCTO"
                cmd.Parameters.Add("@USER_LOGIN", _
                   OleDbType.VarChar, 50).Value = frmLogin.UserLogin
                cmd.Parameters.Add("@CANTIDAD", _
                    OleDbType.Double).Value = txtCantidad.Text
                cmd.Parameters.Add("@ID_PRODUCTO", _
                    OleDbType.VarChar, 50).Value = txtIdProducto.Text
            Else
                ''Editar
                cmd.CommandText = "UPDATE VENTA_DETALLE_TMP " & _
                    " SET CANTIDAD = CANTIDAD + @CANTIDAD " & _
                    " WHERE ID_PRODUCTO=@ID_PRODUCTO " & _
                    " AND USER_LOGIN=@USER_LOGIN "
                cmd.Parameters.Add("@CANTIDAD",
                    OleDbType.Double).Value = txtCantidad.Text
                cmd.Parameters.Add("@ID_PRODUCTO",
                    OleDbType.VarChar, 50).Value = txtIdProducto.Text
                cmd.Parameters.Add("@USER_LOGIN",
                    OleDbType.VarChar, 50).Value = frmLogin.UserLogin
            End If
            cmd.ExecuteNonQuery()
            Return True
        Catch ex As Exception
            Throw (ex)
        Finally
            cnn.Close()
        End Try
    End Function

Lógica del proceso:
  1. Se indica el producto y la cantidad
  2. Se valida si existe el producto.
    • Si no existe el producto se genera un error (Throw)
  3. Se valida si el producto ya existe en la lista de ventas
    • Si no existe se agrega nuevo
    • Si existe, se actualiza la cantidad

Código para cancelar la venta:
    Protected Function CancelarVenta() As Boolean
        Dim cnn As New OleDbConnection(CnnStr)
        Try
            cnn.Open()
            Dim cmd As New OleDbCommand
            cmd.Connection = cnn
            cmd.CommandText = "DELETE FROM VENTA_DETALLE_TMP " & _
                "WHERE USER_LOGIN=@USER_LOGIN"
            cmd.Parameters.Add("@USER_LOGIN",
               OleDbType.VarChar, 50).Value = frmLogin.UserLogin
            cmd.ExecuteNonQuery()
            Return True
        Catch ex As Exception
            Throw (ex)
        Finally
            cnn.Close()
        End Try
    End Function

El siguiente código genera los encabezados del LisView:
    Protected Sub Encabezados()
        With lvVenta
            .View = View.Details
            .FullRowSelect = True
            .GridLines = True
            .HideSelection = False
            .Columns.Add("Id", 50)
            .Columns.Add("Producto", 250)
            .Columns.Add("Cant", 50, HorizontalAlignment.Right)
            .Columns.Add("Prec", 50, HorizontalAlignment.Right)
            .Columns.Add("Total", 80, HorizontalAlignment.Right)
        End With
    End Sub

El siguiente código Muestra los productos en el ListView:
    Protected Sub MostrarVenta()
        Dim cnn As New OleDbConnection(CnnStr)
        varTotal = 0
        Try
            cnn.Open()
            Dim cmd As New OleDbCommand
            cmd.Connection = cnn
            cmd.CommandText = "SELECT P.ID_PRODUCTO, " & _
                "P.PRODUCTO, T.CANTIDAD, T.PRECIO_VENTA," & _
                "(T.CANTIDAD * T.PRECIO_VENTA) AS TOTAL " & _
                " FROM VENTA_DETALLE_TMP T, PRODUCTOS P " & _
                " WHERE T.ID_PRODUCTO=P.ID_PRODUCTO " & _
                " AND T.USER_LOGIN=@USER_LOGIN"
            cmd.Parameters.Add("@USER_LOGIN",
               OleDbType.VarChar, 50).Value = frmLogin.UserLogin
            Dim dr As OleDbDataReader = cmd.ExecuteReader
            Dim i As Integer = 0
            lvVenta.Items.Clear()
            While (dr.Read())
                With lvVenta
                    .Items.Add(dr("ID_PRODUCTO").ToString())
                    .Items(i).SubItems.Add(dr("PRODUCTO").ToString())
                    .Items(i).SubItems.Add(String.Format("{0:N}",
                               dr("CANTIDAD")))
                    .Items(i).SubItems.Add(String.Format("{0:C}",
                              dr("PRECIO_VENTA")))
                    .Items(i).SubItems.Add(String.Format("{0:C}",
                              dr("TOTAL")))
                End With
                varTotal += CDbl(dr("TOTAL"))
                i += 1
            End While
            dr.Close()
            lblTotal.Text = String.Format("{0:C}", varTotal)
        Catch ex As Exception
            Throw (ex)
        Finally
            cnn.Close()
        End Try
    End Sub

Botón "Agregar":
    Private Sub btnAgregar_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnAgregar.Click
        Try
            If (Agregar()) Then
                MostrarVenta()
                txtCantidad.Text = "1"
                txtIdProducto.Text = ""
                txtIdProducto.Focus()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Información del Sistema",
               MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Botón "Cancelar":
    Private Sub btnCancelar_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles btnCancelar.Click
        Try
            If (CancelarVenta()) Then
                lvVenta.Items.Clear()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Información del Sistema",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Botón "Cobrar":
    Private Sub btnCobrar_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles btnCobrar.Click
        If (lvVenta.Items.Count > 0) Then
            Dim frm As New frmCobrar
            frm.TotalVenta = varTotal
            frm.StartPosition = FormStartPosition.CenterScreen
            frm.ShowInTaskbar = False
            frm.ShowDialog()
            If (frm.Success) Then
                lvVenta.Items.Clear()
            End If
        Else
            MessageBox.Show("No hay elementos", "Información del Sistema",
               MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub

Form_Load:
    Private Sub frmVenta_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Encabezados()
            MostrarVenta()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Información del Sistema", _
               MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Ahora vamos al furmulario mdiMain y creamos el siguiente proceso:
    Protected Sub Ventas()
        Dim frm As New frmVenta
        frm.StartPosition =
            FormStartPosition.CenterScreen
        frm.ShowInTaskbar = False
        frm.ShowDialog()
    End Sub

De esta manera podremos mandar llamar al formulario frmVenta. Por ejemplo, si deseamos llamarlo desde el botón btnVentas:
    Private Sub btnVentas_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles btnVentas.Click
        Ventas()
    End Sub

Si todo está bien hasta este punto, hemos terminado el proceso de ventas. Mas adelante veremos como crear el Ticket de Venta utlizando el generador de reportes de Visual Studio.

35 comentarios:

  1. Estamos a la espera de los capírulos siguientes; muy bueno tu tutorial. Gracias

    ResponderEliminar
  2. Muy buen tutorial =P estoy en espera de los siguientes capitulos para poder imprimir los tickets. A su vez espero los de consultas. Y estaria bien agregar alguna gestion de inventarios para hacer una aplicacion mas entera. Saludos y Felicidades

    ResponderEliminar
  3. Esperando siguiente
    Saludos

    ResponderEliminar
  4. y como seria si lo planteamos con clases?

    ResponderEliminar
  5. es que estoy haciendo el punto de venta, ya tengo todo. inventario.remisiones,ticket,login. y ventas, ya hace todas las funciones de cobrar, pero el de cancelar no se como valla el codigo, ystoy trabajando con clases. te agradeceria tu ayuda,

    ResponderEliminar
  6. ya casi termina Mayo, espero ya este el 5,

    esperando completar el tutorial
    saludos

    ResponderEliminar
  7. el 5 ????
    no me dejes con esto a medias
    animo ....
    que no te gane la HUEV

    aqui espero
    no problem master

    ResponderEliminar
  8. podrias subir el archivo?? ya verifique dos noches todo el codigo y no veo en donde tengo el error, ayudarias a muchos colegas como yo.. gracias y felicidades

    ResponderEliminar
  9. Hola, fijate que no me corre el programa, me muestra que el archivo .exe del archivo está perdido... cual sería la solución.

    De antemano, gracias.

    ResponderEliminar
  10. esperamos la quinta parte, saludos muchas gracias

    ResponderEliminar
  11. Hola muy buen tutorail, muchisimas gracias, esto nos ayuda a los que nos apasina la programacion ir adelante de lo que los profesores nos puedane nseñar. Muy buena felicitaciones. Espero puedas poner pronto la parte cinco de impresion de tiket ademas me gustaria u ejemplo de eliminar factura y volviendo las cantidads de esos productos de detalle al inventario o stock. mil gracias. de Honduras

    ResponderEliminar
  12. Hey estamos esperando la parte 5 imprimir tiket, será posible que la impresion de tiket funcione aunque se instale en una computadora que no tenga instalado crystal, nos dices como hacer para que al hacer el programa instalable lleve todas las dependencias necesarias en el paquete de instalación, gracias muy buen aporte, tengo todo los ejemplos que has dado, corriendo perfectamente. Lo pude adaptar a un proyecto que estaba haciendo, pero lo hacía de otra forma que no lograba el objetivo deseado. gracias nuevamente. en espera de lo demas....

    ResponderEliminar
  13. me aparece que no se han especificadp valor para algunos de los parametros requeridos

    ResponderEliminar
  14. me gusto mucho este ejercicio, espero ver el final

    ResponderEliminar
  15. Y el final???? No dejes a medias es como si no hubieras empezado

    ResponderEliminar
  16. Hola a Todos
    Actualmente estoy muy ocupado
    Veo que muchos desean que continúe con el siguiente ejercicio.
    Para aquellos que ya están un poco avanzados, no les resultará difícil terminarlo si toman como base otras publicaciones de este mismo sitio.
    Saludos

    ResponderEliminar
  17. Esperando el Punto de Venta Visual Basic (Parte 5) :D

    ResponderEliminar
  18. Hola esperando el crear los tickets. Saludos amigo. Soy Gohan

    ResponderEliminar
  19. hola Juan Gabriel Castillo

    como puedo actualizar la cantidad de ventas

    ResponderEliminar
  20. Hola, buenas tardes.
    Gracias por tu excelente aportación, pero aún seguimos esperando las siguientes partes.
    Saludos.
    Rafael Torres Hipólito

    ResponderEliminar
  21. siempre dejan los tutoriales a medias estos sopla pollas sera que abra alguien capaz de hacer un tutorial de un punto de venta con access y visual estudio 2010 y que tenga tiempo por supuesto, que no muera con el conocimiento por lo menos....

    ResponderEliminar
  22. espero k alguien puedo resolver mi duda el codigo no m marka error pero al compilar m sale este error :
    'C\Users\ddi-gcastillo\Documentos\tyrodeveloper\PVenta2012\PVenta2012.accdb'
    no es una ruta da acceso valida. Asegúrese de que la ruta este escrita correctamente y que este conectado al servidor donde seencuentra el archivo

    PD: este error lo genera cuando esta n el formulario d Login y hago click en el boton Aceptar para ingresar

    ResponderEliminar
  23. Agradezco por los aportes, y a la espera de la continuación del sistema. realmente son buenos los aportes realizados que permiten el aprendizaje a personas que queremos saber un poco mas sobre programación en visual basic.

    Gracias nuevamente.

    ResponderEliminar
  24. Hola estamos esperando...espero no nos dejes esperando el resto de capitulos

    ResponderEliminar
  25. jajajajaja, este ya le va hacer como el campa del sistema punto de venta en Access, que te deja con unos capítulos y los restantes te va querer cobrar, por cierto saludos al buen Arturo Chapa

    ResponderEliminar
  26. Espero y publiques pronto como imprimir el ticket de venta.... :,(

    ResponderEliminar
  27. hojala puedas publicar el resto gracias de antemano saludos

    ResponderEliminar
  28. jajaja y nunca llego el siguiente yo bien animado que estaba ! :W

    ResponderEliminar