Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

manejo de stock de una BD mysql en un inventario

Estas en el tema de manejo de stock de una BD mysql en un inventario en el foro de Mysql en Foros del Web. Buena tarde, si alguin me puede ayudar, tegon una base de datos con 4 tablas Entradas Salidas materiales proveedores proyectos en las cuales quiero sacar ...
  #1 (permalink)  
Antiguo 28/03/2012, 17:47
 
Fecha de Ingreso: marzo-2012
Mensajes: 1
Antigüedad: 12 años, 1 mes
Puntos: 0
Busqueda manejo de stock de una BD mysql en un inventario

Buena tarde,
si alguin me puede ayudar,

tegon una base de datos con 4 tablas
Entradas
Salidas
materiales
proveedores
proyectos

en las cuales quiero sacar el estock entre las entradas y las salidas lo cual he tenido problemas, el query que estoy manejando es este,

SELECT m.nombre,m.tipo,m.medida,m.resistencia,m.presentac ion,m.longitud,m.color,m.marca, sum(e.cantidad) Entrada,sum(s.cantidad)Salida,sum(e.cantidad)- sum(s.cantidad)
FROM materiales m join entradas e
on(m.idmateriales=e.materiales_idmateriales)
join salida s
on(m.idmateriales=s.materiales_idmateriales)
group by nombre,tipo,medida,resistencia,presentacion,longit ud,color,marca


pero el problema es que no me da las cantidades correctas.

si me pudieran ayudar les agradeceria..
  #2 (permalink)  
Antiguo 28/03/2012, 21:03
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 2 meses
Puntos: 177
Respuesta: manejo de stock de una BD mysql en un inventario

y no será mejor hacer una tabla referencial llamada stock y ahí poner la cantidad actial de materiales y actualizarla cuando haya entradas o salidas???
__________________
la la la
  #3 (permalink)  
Antiguo 29/03/2012, 10:08
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: manejo de stock de una BD mysql en un inventario

Hola perro5128:

Si estoy en lo correcto un producto puede tener 0 o más entradas y 0 o más salidas correcto??? partiendo de este supuesto estás equivocando la estrategia para obtener el stock.

En primer lugar, al se posible que un producto no tenga entradas y/o salidas, DEBES UTILIZAR LEFT O RIGTH JOIN. El JOIN simple o INNER JOIN necesita que existan registros en ambas tablas que estás tratando de unir por lo tanto no te arrojaría resultados correctos.

Segundo, la agrupación de las entradas y salidas DEBERÁS HACERLA ANTES DE UNIRLAS CON LA TABLA DE MATERIALES. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM productos;
  2. +-------------+-------------+
  3. | id_producto | descripcion |
  4. +-------------+-------------+
  5. |           1 | uno         |
  6. |           2 | dos         |
  7. |           3 | tres        |
  8. |           4 | cuatro      |
  9. +-------------+-------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM entradas;
  13. +------------+-------------+----------+
  14. | id_entrada | id_producto | cantidad |
  15. +------------+-------------+----------+
  16. |          1 |           1 |       10 |
  17. |          2 |           1 |       12 |
  18. |          3 |           2 |       20 |
  19. |          4 |           2 |        9 |
  20. |          5 |           3 |       15 |
  21. +------------+-------------+----------+
  22. 5 rows in set (0.00 sec)
  23.  
  24. mysql> SELECT * FROM salidas;
  25. +-----------+-------------+----------+
  26. | id_salida | id_producto | cantidad |
  27. +-----------+-------------+----------+
  28. |         1 |           1 |       10 |
  29. |         2 |           1 |        8 |
  30. |         3 |           2 |        5 |
  31. |         4 |           2 |        7 |
  32. +-----------+-------------+----------+
  33. 4 rows in set (0.00 sec)
  34.  
  35. mysql> SELECT P.*,
  36.     -> IFNULL(E.total_entradas, 0) entradas,
  37.     -> IFNULL(S.total_salidas, 0) salidas,
  38.     -> IFNULL(E.total_entradas, 0) - IFNULL(S.total_salidas, 0) stock
  39.     -> FROM productos P
  40.     -> LEFT JOIN
  41.     -> (SELECT id_producto, SUM(cantidad) total_entradas FROM entradas
  42.     -> GROUP BY id_producto) E
  43.     -> ON P.id_producto = E.id_producto
  44.     -> LEFT JOIN
  45.     -> (SELECT id_producto, SUM(cantidad) total_salidas FROM salidas
  46.     -> GROUP BY id_producto) S
  47.     -> ON P.id_producto = S.id_producto;
  48. +-------------+-------------+----------+---------+-------+
  49. | id_producto | descripcion | entradas | salidas | stock |
  50. +-------------+-------------+----------+---------+-------+
  51. |           1 | uno         |       22 |      18 |     4 |
  52. |           2 | dos         |       29 |      12 |    17 |
  53. |           3 | tres        |       15 |       0 |    15 |
  54. |           4 | cuatro      |        0 |       0 |     0 |
  55. +-------------+-------------+----------+---------+-------+
  56. 4 rows in set (0.00 sec)

Observa que cambié los JOIN's por LEFT JOIN y que la agrupación de las entradas y salidas las realizo en una subconsulta... previa a unirla con la tabla de productos. Si esto no te sirve portea algunos datos de ejemplo de tus tablas para poder hacer pruebas.

En cuanto al comentario de truman_truman:

Cita:
y no será mejor hacer una tabla referencial llamada stock y ahí poner la cantidad actial de materiales y actualizarla cuando haya entradas o salidas???
Si bien es una solución que podría servir, va en contra de las reglas de normalización de BD... ya que no deben existir campos que puedan ser calculados, pero bueno... esa es otra historia

Saludos
Leo.

Etiquetas: query
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:50.