Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: geshiro en 7 Abril 2016, 22:32 pm



Título: como realizar un trigger para el control de stock
Publicado por: geshiro en 7 Abril 2016, 22:32 pm
Como descontar cantidad de stock en tabla de product desde  sale_detail


tabla product
id
product
cantidad

tabla sale_detail
id
id_sale
id_product
cantidad


Título: Re: como realizar un trigger para el control de stock
Publicado por: crisoof en 13 Abril 2016, 20:11 pm
que llevas hecho?, alguna duda sobre el codigo para tu trigger? o solo esperas que te den el codigo ya listo? :laugh: :laugh: :laugh: :laugh: :laugh:


Título: Re: como realizar un trigger para el control de stock
Publicado por: Hadess_inf en 14 Abril 2016, 21:44 pm
Hola, pues bien .. la idea es esta:

- tb_articulo ( id INT PK)
- tb_almacen (id INT PK)
- tb_stock (id INT PK, idarticulo INT FK, idalmacen INT FK, cantidad INT)

Y este es el Trigger:

Código
  1. CREATE OR REPLACE FUNCTION tr_stock_articulo_almacen()
  2.  RETURNS TRIGGER AS
  3. $BODY$
  4. DECLARE i_existe INTEGER;
  5. i_tipo INTEGER;
  6. BEGIN
  7. -- Calcula valores
  8. i_tipo   := (CASE WHEN TG_TABLE_NAME = 'tb_venta_detalle' THEN -1 ELSE 1 END);
  9. i_existe := (SELECT COUNT(id) FROM tb_stock WHERE idalmacen = NEW.idalmacen AND idarticulo = NEW.idarticulo);
  10.  
  11. -- Inserta almacen y producto en tabla stock
  12. IF i_existe = 0 THEN
  13. INSERT INTO tb_stock (idalmacen, idarticulo, cantidad) VALUES (NEW.idalmacen, NEW.idarticulo, 0);
  14. END IF;
  15.  
  16. -- Opera trigger
  17. IF TG_OP = 'INSERT' THEN
  18. UPDATE tb_stock SET cantidad = cantidad + (NEW.cantidad * i_tipo) WHERE idalmacen = NEW.idalmacen AND idarticulo = NEW.idarticulo;
  19.  
  20. ELSEIF TG_OP = 'UPDATE' THEN
  21. UPDATE tb_stock SET cantidad = cantidad - (OLD.cantidad * i_tipo) WHERE idalmacen = OLD.idalmacen AND idarticulo = OLD.idarticulo;
  22. UPDATE tb_stock SET cantidad = cantidad + (NEW.cantidad * i_tipo) WHERE idalmacen = NEW.idalmacen AND idarticulo = NEW.idarticulo;
  23.  
  24. ELSEIF TG_OP = 'DELETE' THEN
  25. UPDATE tb_stock SET cantidad = cantidad - (OLD.cantidad * OLD.tipo) WHERE idalmacen = OLD.idalmacen AND idarticulo = OLD.idarticulo;
  26. END IF;
  27.  
  28. RETURN NULL;
  29. END;
  30. $BODY$
  31.  LANGUAGE plpgsql VOLATILE;

Asi asignas el trigger a la tabla:

Código
  1. -- Para la tabla de detalle de compra
  2. CREATE TRIGGER tb_compra_detalle_trigger
  3.  AFTER INSERT OR UPDATE OR DELETE
  4.  ON tb_compra_detalle
  5.  FOR EACH ROW
  6.  EXECUTE PROCEDURE tr_stock_articulo_almacen();
  7.  
  8. -- Para la tabla de detalle de venta
  9. CREATE TRIGGER tb_venta_detalle_trigger
  10.  AFTER INSERT OR UPDATE OR DELETE
  11.  ON tb_venta_detalle
  12.  FOR EACH ROW
  13.  EXECUTE PROCEDURE tr_stock_articulo_almacen();
  14.  

Saludos.

 ::) ::)


Título: Re: como realizar un trigger para el control de stock
Publicado por: jdannycastilla en 8 Agosto 2019, 07:38 am
Me sirvió de mucho, en mi caso utilizo una sola tabla para todo, compras, ventas, traslados,etc al cual dependiendo si es ingreso o salida lo multiplico *1 (positivo) o *1 (negativo), el cual ya no tengo que utilizar la variable i_tipo, ojala les sirva.


Título: Re: como realizar un trigger para el control de stock
Publicado por: Hadess_inf en 15 Agosto 2019, 01:24 am
Aunque sea funcional yo no estoy de acuerdo en meter todo a una tabla (por el tema de consultas -> tu tabla crecerá mucho por la cantidad de datos que iras metiendo).

Saludos ¡¡¡