Ver Mensaje Individual
  #3 (permalink)  
Antiguo 14/03/2012, 12:36
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con Stock

Hay muchas formas de hacerlo pero algunas no son correctas por que hay unas reglas de normalizacion del diseño a seguir.

A ver ERROR la tabla stock no es necesaria y ademas es peligroso tenerla.

Por que?

Por que la información que contiene es el resultado de un calculo sobre la información que ya tienes en t_movimiento, luego cualquier error en ese update te dejara la bbdd en un estado incoherente, craso error. Evitar esta situación es un principio básico en el momento de diseñar una base de datos relacional.

Te propongo lo siguiente

__________________________________
t_edificio
-------------------------------------------------------
Id_edi | Nombre | Direccion | Telefono
-------------------------------------------------------



___________________________________
t_Productos
-------------------------------------------------------
IdPro | Nombre | Comentario
-------------------------------------------------------




__________________________________
t_proveedores
-------------------------------------------------------
IdProveed | Nombre | Mail
--------------------------------------------------------



__________________________________________________ _
t_movimiento
----------------------------------------------------------------------------------
IdMov | IdPro | IdProveed | Id_edi | cant | movim | fecha
----------------------------------------------------------------------------------
movim será 1 entradas 2 Salidas


Y luego para obtener el stock solo tienes que hacer lo siguiente


Código MySQL:
Ver original
  1. CREATE VIEW VStock AS SELECT p.idPro, p.nombre as Prod,
  2.            e.id_Edi, e.nombre as Edif,
  3.            SUM(if(m.movim=1,m.cant,0)) as entradas,
  4.            SUM(if(m.movim=2,m.cant,0)) as salidas,
  5.            SUM(if(m.movim=1,m.cant,0))-SUM(if(m.movim=2,m.cant,0)) as Stock
  6. FROM (t_movimiento m INNER JOIN t_Productos p ON m.IdPro=p.IdPro)
  7.          INNER JOIN t_edificio e ON m.Id_edi=e.Id_edi
  8. GROUP BY p.nombre,
  9.            e.nombre;

Esto lo ejecutas una sola vez y te creará una vista o tabla virtual que siempre te dara el stock actual por productos y edificios... y a demas no ocupa espacio de disco.

Para consultarla, como si fuera una tabla normal

Código MySQL:
Ver original
  1. SELECT * FROM VStock; ///Stock completo
o

Código MySQL:
Ver original
  1. SELECT SUM(S.Stock) as StockProducto
  2. FROM VStock S
  3. WHERE S.idPro=X
  4. GROUP BY S.idPro;   ///Stock del producto X

Obviamente debes crear las FK que relacionen y aseguren que existen en las tablas principales los id que introduces en t_movimiento.

Asi con solo hacer el insert en t_movimiento, ya tienes actualizado el stock.

Planteate como conseguirias las compras por producto y proveedor...

Periodicamente habra que resumir la tabla movimientos para que no se haga infinita... esto tambien lo tendrias que hacer con tu modelo, por ejemplo con una t_movimientos por años donde debe haber un asiento de entrada con el stock inicial....momento en el que se suele hacer inventario para ajustar el stock contable con el real... ya se sabe que siempre hay alguna diferencia.

Todo esto se complica cuando te piden que digas el valor monetario del stock....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 14/03/2012 a las 13:24