Diseño de BASE DE DATOS

(Mi aplicación esta hecha en VB6, no se si sea importante)
Es una aplicación para una tiendita. Lo que pasa es que tengo 5 tablas llamadas Productos, Ventas, Detalle de Ventas, Compras y Detalles de Compras. En Productos almaceno la cantidad de Productos en existencia (ademas de sus características) y cada vez que se hace una Venta esta cantidad disminuye y cuando hago una Compra de productos para resurtir la tienda pues obviamente aumenta.
Y bueno pues también guardo la clave del producto que se va vendiendo en Detalles de Ventas y los que se compran en Detalles de Compras.
Bueno a parte de eso tengo que mostrar en pantalla las Ventas y Compras que se han hecho, pero bueno ahí viene mi duda. Es en cuanto la lógica de mis acciones.
Es que tengo un botón de eliminar Productos y pues los borra eso que ni que; el problema viene que si por ejemplo, el usuario borra Hoy a las 6 de la tarde un producto que se acaba de vender Hoy mismo en la mañana ( y no importándole que aun hay existencias de ese producto), entonces al momento que yo quiera mostrar en pantalla las ventas de Hoy al finalizar el día (la clave del producto vendido sigue guardado en detalles ventas pero en productos ya no existe) y quiera jalar las características de ese producto borrado de seguro me va a marcar error o simplemente no me va a mostrar nada. (Igual aplica para las compras)
La pregunta es ¿qué debo hacer?: Quitar el botón de borrar, o manejar en la tabla una fecha de alta y de baja. O como le hago ¿?. Que me recomienda. Debo cambiar el diseño de la tabla o como manejar esto.
Y bueno si considera que esta pregunta la debo a hacer a un experto programador pues también dígamelo.
Respuesta
1
Antes de proponerte una solución, te digo inmediatamente que nunca es bueno eliminar registros de una base de datos, por los problemas que tú mismo mencionas, entre otros. Por lo tanto, partimos de la premisa que no eliminaremos los Productos.
Lo que tienes que hacer es incoporar en la tabla Producto un campo que indique si está en Stock o no el producto y no eliminar los productos de esta tabla. Por ejemplo, puedes poner el campo En_Stock (tipo bit). 1 indica que está en Stock y 0 que no.
Entonces, cuando traigas los productos que quieres vender la consulta la filtras así:
WHERE ........ AND En_Stock = 1
En vez de eliminar el producto, vas cambiando el campo En_Stock y asunto arreglado. Esto lo tienes que hacer cada vez que haces una compra o una venta.
Ahora, si el producto no lo vas a vender nunca más en la vida, tampoco eliminas el producto, porque como tu dices, si quieres sacar un reporte con los datos de productos que no vendes, te saldrá un error.
Si manejas más de dos estados (en Stock y Agotado), puedes cambiar el campo que te dije y ponerle Estado (tipo SmallInt). Pero funciona muy parecido. Los estados serían:
- 0: Agotado
- 1: En Stock
- 2: Descontinuado
- 3: ...
Y así le vas agregando estados de acuerdo a lo que necesites.
Lo anterior es una buena alternativa, ahora la otra alternativa es la siguiente:
Dado que en la tabla Producto tienes la Cantidad, en todas las consultas tienes que incoporar en el WHERE lo siguiente:
WHERE ....... AND Cantidad > 0
Así al Usuario no le saldrán los Productos que no tienes en Stock.
Espero que sea de utilidad.
Si tienes más dudas no "dudes" en consultarme.
Suerte...
Con tu respuesta si me surgieron algunas dudas, bueno empiezo:
No es que crea que no tengas razón, me es de mucha utilidad y aprendizaje tu respuesta pero me gustaría saber cuales son las otras razones por las que no se deben eliminar registros de las bases de datos (sólo para aprender más y tenerlo en cuenta en futuras experiencias con base de datos y además por si me pregunta mi asesor de por que lo hago así podré dar más argumentos).
Otra cosa, es que en mi tabla de Productos aparte de guardar la descripción de productos y la existencia actual, también utilizo dos campos que he llamado Smin(Stock mínimo) y Smax (Stock Máximo) los cuales son alimentados en un principio por el usuario; en base a eso le indico al usuario cuales son los que están por debajo del mínimo y los que rebasan al máximo y así (según yo), le indico cuales debe comprar y cuales no.
Ahora si viene la otra pregunta, cuando tu utilizas el término de que está en stock te refieres a que el producto si lo maneja la empresa. ¿Y los que no están en estock significa que alguna vez fue vendido por la tienda pero a partir de determinada fecha ya no.?
La segunda opción donde me explicas hacer un filtro (de Cantidad > 0 ) es la que utilizo
Para mostrar la lista de productos que están disponibles para vender.
Pero me gustaría combinarlo con la opción que me propones de que si están descontinuados o agotados y así; ¿O tu crees que sería doble trabajo y por el mismo resultado?
Esto a lo mejor te va a parecer tonto, pero bueno tengo un poco de inseguridad en mi
Forma de ver las cosas, y me gustaría que me dieras tu opinión:
En cuanto a la lógica de guardado. Es que primero le pido al usuario que entre a la pantalla donde se rellenan los campos de descripción de cada producto (nombre, precio, iva, stock mínimo y máximo, entre otros menos las existencias claro esta) y después le pido que se salga de esa pantalla para que entre a la pantalla de compras y ya entonces da los datos propios de la compra como son el proveedor, el producto que compró y su cantidad (el producto lo elige a través de una lista de los productos cuyos datos generales ya fueron capturados); en esta misma pantalla de compras tengo un botón de agregar un nuevo producto por si no se encuentra en la lista que te mencioné y ya así lo da de alta.
No sé si es muy tedioso mi método o podrías sugerirme otra forma menos complicada.
O que de plano el usuario entre a la pantalla de compras aunque la lista de productos aparezca vacía y ya a través del botón de agregar un nuevo producto vaya capturando los productos.
Sobre tus consultas:
- Eliminar registros de las bases de datos, tiene dos implicancias negativas: 1. pierdes el historial de las actividades que realizan los usuarios, con lo que en un momento determinado no sabrías qué pasó si ocurre algún error. 2. Generalmente y lo que es correcto, los diseñadores de bases de datos utilizan integridad referencial para asegurar la integridad de los datos en la base de datos. Por este motivo el motor no te permite eliminar registros que son referenciados en otras tablas, sin eliminar primeramente estas referencias. Por ejemplo, supongamos que tenemos las tablas país y ciudad (en esta tabla existe una referencia al país). Entonces, no puedo eliminar un país si existe alguna ciudad que tenga esta referencia. Imagina si lo pudiera hacer, cuando haga una consulta para saber cual es el país de una ciudad, y si elimine el registro del país, el motor ni siquiera me mostrará la cuidad si hago la consulta con INNER JOIN; si hago la consulta con LEFT OUTER JOIN o FULL JOIN, entonces si me mostrará la ciudad y el campo país en blanco. Bueno, sea cual sea la situación, ninguna opción cumple con el objetivo de mostrar el país. En tu caso en particular, si quieres sacar un historial de productos vendidos y si has eliminado registros de productos, si haces la consulta con INNER, no te traerá todos los registros; si haces la consulta con LEFT OUTER, te traerá los registros, pero no sabrás cual es el producto... Espero haber sido claro.
- Sabes... sobre el stock mínimo y máximo, podrías trabajar en ello, para hacer tu sistemita más interesante. Por ejemplo, podrías determinar el stock mínimo y máximo automáticamente, sin que el usuario lo tenga que ingresar. Todo esto, de debe determinar a partir del historial de ventas. Por ejemplo, sacas un cálculo de máximo mensual vendido de cada producto y el mínimo vendido de cada producto. Ambos datos, los puedes sacar mensualmente y al final, puedes calcular de acuerdo a la época del año, cuanto tienes que ir comprando mensualmente. Adicionalmente, y para efectos de cálculos de finanzas, debes determinar el precio promedio de cada artículo que estas vendiendo. El precio promedio indica cual es el precio compra del producto que estas vendiendo, dado que si compras 10 de producto POR en Enero (a $ 100) tiene un precio distinto de comprar 10 de producto POR en Septiembre (a $ 90). Y cuando no sabes cual estas vendiendo, si es el de Enero o Septiembre, tienes que calcular el precio promedio para saber tu ganancia real. No sé si me expliqué bien, pero si quieres averiguar bien sobre esto, pregúntale a alguien que maneje esos datos.
- Exactamente, cuando indicas en_stock = 1 dices que quedan productos.
- Si quieres saber cuales están en stock, agotados o descontinuados, utilizas la misma consulta, agrupando por el estado. Por ejemplo, SELECT Producto. Nombre, SUM(Producto. Cantidad), Producto. En_Stock FROM Producto GROUP BY Producto. Nombre, Producto. En_Stock. Esta consulta traerá todos los productos y los estados en que se encuentran (stock, agotados y descontinuados).
- Tu forma en que diseñaste el programa esta bien, por varios motivos. 1. Cuando tienes una tiendita tal vez, funcione un poco tedioso, pero si tu tiendita va creciendo, la persona que ingresa los productos y stocks mínimos y máximos, no será necesariamente la persona que compra. Mucho menos la persona que vende. Lo interesante de hacerlo así es que agrupas funciones de la aplicación de acuerdo a una lógica. De no ser así tendrías que tener todas las funciones en una sola pantalla... esto es imposible.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas