Ver Mensaje Individual
  #3 (permalink)  
Antiguo 29/03/2012, 10:08
leonardo_josue
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.