Ticket de Venta Access, sumar cantidad del mismo registro

Estuve mucho tiempo fuera, ahora vuelvo a retomar mi programación.

Mi consulta conlleva lo siguiente, estoy generando un formulario con subformulario en donde quiero generar un ticket de venta, registro en el subformulario los productos mediante un código de barra y quiero que el valor cantidad se sume cada vez que lea el código de barra sin duplicarme el registro en el listado y si agrego otro producto se registre normalmente.

2 respuestas

Respuesta
2

Hay varias formas de hacerlo, en mi caso siempre utilizo tablas independientes porque evito conflictos en entornos multiusuario, porque utilizo PostgreSQL como BackEnd.

Para abreviar en este ejemplo utilizo 2 tablas

TABLAS

No obstante, para hacer el ejemplo más simple solo utilizo la tabla temporal temventa para el subformulario que es donde se debe controlar el ingreso de productos de la factura.

Formulario principal con el subformulario

Voy a realizar otro ingreso del producto "Aceite", como ya existe se la cantidad debe aumentar en 1 unidad y el vrventa debe calcularse, tanto del producto como general.

Observe que la cantidad ahora es 2 y los valores cambiaron, es decir, se incrementaron en $1.700. Puede cambiarse manualmente la cantidad nuevamente a 1 ! Pero no es lo recomendado ! Se deben buscar otros mecanismos más seguros.

Como asumo que el usuario que hace la consulta sabe VBA solo presento el código del subformulario.

Código para actualizar cuando se cambia manualmente la cantidad ! Repito no es lo mejor !

Private Sub cantidad_AfterUpdate()
 If Me.cboProducto > 0 Then
   Me.vrventa = Me.costounitario * Me.cantidad
   Me.Parent.Refresh
 End If
End Sub

Código del evento Después de actualizar el producto (en su caso reemplácelo por el código de barras)Observe que utilizo el código de error 2105 porque en la tabla temporal el idproducto se diseñó indexado y sin duplicados. Si hay error es porque ya existe producto, me ubico sobre éste utilizando Bookmark. Es decir, si no alcanzo el final del archivo EOF() aumento la cantidad y vuelvo a calcular el costo de la venta. Envío el cursor a un nuevo registro y refresco el formulario padre porque llamo la siguiente función para actualizar la suma.

Function totalventa()
  totalventa = DSum("vrventa", "temventa")
End Function

Formulario Principal

Observe que he definido como Origen del control la función.

Si quieren el ejemplo lo pueden solicitar a [email protected] favor en el asunto anotar la consulta.

Disculpe no subió el código del evento principal

Evento Después de actualizar del cuadro combinado cboProducto

Private Sub cboProducto_AfterUpdate()
 On Error GoTo hay_error
 Dim mtem  As Long
 Dim rs As Object
 mtem = Me.idproducto
  Me.costounitario = Me.cboProducto.Column(3)
  Me.vrventa = Me.costounitario * Me.cantidad
  DoCmd.GoToRecord , , acNewRec
  Me.Parent.Refresh
hay_error_exit:
  Exit Sub
hay_error:
    If Err.Number = 2105 Then
         Me.Undo
         Set rs = Me.Recordset.Clone
         rs.FindFirst "[idproducto] =  " & Str(Nz(mtem, 0))
            If Not rs.EOF Then
              Me.Bookmark = rs.Bookmark
              Me.cantidad = Me.cantidad + 1
            End If
          Me.vrventa = Me.costounitario * Me.cantidad
          DoCmd.GoToRecord , , acNewRec
          Me.Parent.Refresh
     End If
     Resume hay_error_exit
End Sub

Le dejo otra alternativa sin clonar (es un desastre) . Pruebe cambiando el evento del cuadro combinado cboproducto por este

Private Sub cboProducto_AfterUpdate()
' Forma optima sin clonar formulario es mi preferida
 On Error GoTo hay_error
 Dim mtem  As Long
 Dim rs As Object
 mtem = Me.idproducto
 If DCount("*", "temventa", "idproducto=" & mtem) > 0 Then
   Me.Undo
   CurrentDb.Execute "UPDATE temventa SET cantidad=cantidad+1 WHERE idproducto=" & mtem
   CurrentDb.Execute "UPDATE temventa SET vrventa=cantidad*costounitario WHERE idproducto=" & mtem
   DoCmd.GoToRecord , , acNewRec
   Me.Parent.Refresh
   Exit Sub
 End If
  Me.costounitario = Me.cboProducto.Column(3)
  Me.vrventa = Me.costounitario * Me.cantidad
  DoCmd.GoToRecord , , acNewRec
  Me.Parent.Refresh
hay_error_exit:
  Exit Sub
hay_error:
     MsgBox "Ocurrió el error " & Err.Number, vbCritical, "Error.."
     Resume hay_error_exit
End Sub
Respuesta
1

Método aplicable en un TPV.
Añadir con un lector de códigos de barra o un click en una pantalla táctil es sencillo.
Se complica si se quiere restar, habrá que hacerlo en mas de un paso para cambiar el signo o aplicar un método alternativo si se dispone de pantalla táctil/teclado auxiliar.

Una vez validado el código de barras (que exista en la base y si fuera el caso que también exista producto) se efectúa una búsqueda con FindFirst sobre el RecordsetClone del subformulario productos.

A.- Se encuentra coincidencia:
Se incrementa en una unidad al campo cantidad del producto y de ser necesario se refresca la pantalla.
B.- No hay coincidencia:
Se continua con el método actual y se inserta en el subformulario

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas