Formularios y subformularios en Access y relaciones entre los registros

Tengo un programa en access de ventas, consiste en un formulario principal con un subformulario, en el subformulario es donde se registran los productos vendidos, mi problema es que al vender un producto este se descuenta automáticamente del inventario como es normal, pero a la hora de cancelar el producto a vender resulta problemático si son 100 productos que ya vendiste por ejemplo, lo que yo quiero es meter el código del producto y que no descuente nada del inventario, que puedas cancelar ese producto y que no regrese nada al inventario, sino que al imprimir el ticket que recorra todos los registros y de acuerdo a su estatus, "vendido" que descuente una unidad del inventario, "cancelado" que no haga ninguna operación, te explico mejor este asunto co este pseudocodigo para ver si me puedes ayudar a pasarlo a código visual de access...
Desde "primer registro" hasta "ultimo Registro" hacer
si estatus="vendido" then existencia=-1
Regresar hasta llegar al ultimo registro... Imprime ticket.

1 Respuesta

Respuesta
1
No sé si el tema de hacerlo en Basic es por asignar la funcionalidad a un botón o algo pero la solución más sencilla es actualizar la tabla de inventario con una consulta de selección de la tabla tickets.
Genera la siguiente consulta:
SELECT T_ENIKMA_TICKETS.Artículo, Count(T_ENIKMA_TICKETS.Status) AS Vendidos
FROM T_ENIKMA_TICKETS
WHERE (((T_ENIKMA_TICKETS.Status)="Vendido"))
GROUP BY T_ENIKMA_TICKETS.Artículo;
Esta consulta te da el total de vendidos por artículo. La llamaremos "Q_ENIKMA_CUENTA_VENDIDOS"
Luego genera esta otra:
UPDATE T_ENIKMA_INVENTARIO INNER JOIN Q_ENIKMA_CUENTA_VENDIDOS ON T_ENIKMA_INVENTARIO.Articulo = Q_ENIKMA_CUENTA_VENDIDOS.Artículo SET T_ENIKMA_INVENTARIO.Existencia = [Q_ENIKMA_CUENTA_VENDIDOS].[Vendidos];
y la llamas "Q_ENIKMA_ACTUALIZA_EXISTENCIAS".
Lo único que tienes que hacer es ejecutar esta segunda consulta desde Visual Basic y no necesitas hacer bucles para recorrer registros:
Sub ActualizaExistencias()
Dim oQD as DAO.QueryDef
Set oQD = DBEngine(0)(0).QueryDefs("Q_ENIKMA_ACTUALIZA_EXISTENCIAS")
DBEngine(0).BeginTrans
oQD.Execute
DBEngine(0).CommitTrans
Set oQD = Nothing
End Sub
Ok, probé lo que me dices y si es una buena forma de actualizar mi inventario, pero mira, te voy a explicar mejor mi problema, es un programa táctil de venta de helados, por medio de puros botones, entonces si el cliente quiere un helado en cono al presionar el botón aparece el producto y me descuenta el cono y el peso de la bola de helado, todo bien hasta ahí, el problema es cuando un cliente pide varios productos, por ejemplo
1 cono sencillo
1 vaso doble
1 paleta de fesa
1 especialidad de coco.
Pero a la mera hora el cliente decide que ya no quiere el vaso doble, entonces tengo un botón que cancela ese producto regresando el vaso y el peso del helado, pero como aquí cambian constantemente los productos tengo que poner una condición para cada producto para que según el producto regrese tdos sus componentes al inventario, lo que yo quiero es que se pueda vender todo los productos pero que al presionar el botón todavía no descuente nada, y que al cancelar no regrese nada al inventario, si no que al presionar el botón de imprimir el ticket haga un recorrido por los registros activos del subformulario y que solo descuente los productos que están marcados como vendidos y que ignore los cancelados, el programa me funciona bien así como esta pero lo que quiero es dejar de meter código nuevo cada vez que hay un producto nuevo, ¿cómo la vez sera que entendiste mi problema? ' Espero puedas ayudarme.
A ver si ahora te he entendido:
Consulta Q_ENIKMA_TICKET_A_EXISTENCIAS:
PARAMETERS NoTicket Long;
UPDATE T_ENIKMA_INVENTARIO INNER JOIN T_ENIKMA_TICKETS ON T_ENIKMA_INVENTARIO.Articulo = T_ENIKMA_TICKETS.Artículo SET T_ENIKMA_INVENTARIO.Existencia = [T_ENIKMA_INVENTARIO].[Existencia]-[T_ENIKMA_TICKETS].[Cantidad]
WHERE (((T_ENIKMA_TICKETS.TicketNo)=[NoTicket]) AND ((T_ENIKMA_TICKETS.Status)="Vendido"));
Cuando das al botón Imprimir, el código será el siguiente:
Dim oQD As DAO.QueryDef
Set oQD = DBEngine(0)(0).QueryDefs("Q_ENIKMA_TICKET_A_EXISTENCIAS")
oQD.Parameters("NoTicket") = Me.TicketNo
DBEngine(0).BeginTrans
oQD.Execute
DBEngine(0).CommitTrans
Set oQD = Nothing
End Sub
Aquí asumo que vas numerando los tickets de forma que lo que haces al imprimir el ticket es descontar del inventario los artículos que aparecen como vendidos en dicho ticket.
Lo de dejar de meter código nuevo cada vez que hay un producto nuevo ... no termino de entenderlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas