Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => 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 (sql) [Seleccionar]
CREATE OR REPLACE FUNCTION tr_stock_articulo_almacen()
  RETURNS trigger AS
$BODY$
DECLARE i_existe integer;
i_tipo integer;
BEGIN
-- Calcula valores
i_tipo   := (CASE WHEN TG_TABLE_NAME = 'tb_venta_detalle' THEN -1 ELSE 1 END);
i_existe := (SELECT COUNT(id) FROM tb_stock WHERE idalmacen = NEW.idalmacen AND idarticulo = NEW.idarticulo);

-- Inserta almacen y producto en tabla stock
IF i_existe = 0 THEN
INSERT INTO tb_stock (idalmacen, idarticulo, cantidad) VALUES (NEW.idalmacen, NEW.idarticulo, 0);
END IF;

-- Opera trigger
IF TG_OP = 'INSERT' THEN
UPDATE tb_stock SET cantidad = cantidad + (NEW.cantidad * i_tipo) WHERE idalmacen = NEW.idalmacen AND idarticulo = NEW.idarticulo;

ELSEIF TG_OP = 'UPDATE' THEN
UPDATE tb_stock SET cantidad = cantidad - (OLD.cantidad * i_tipo) WHERE idalmacen = OLD.idalmacen AND idarticulo = OLD.idarticulo;
UPDATE tb_stock SET cantidad = cantidad + (NEW.cantidad * i_tipo) WHERE idalmacen = NEW.idalmacen AND idarticulo = NEW.idarticulo;

ELSEIF TG_OP = 'DELETE' THEN
UPDATE tb_stock SET cantidad = cantidad - (OLD.cantidad * OLD.tipo) WHERE idalmacen = OLD.idalmacen AND idarticulo = OLD.idarticulo;
END IF;

RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;


Asi asignas el trigger a la tabla:

Código (sql) [Seleccionar]
-- Para la tabla de detalle de compra
CREATE TRIGGER tb_compra_detalle_trigger
  AFTER INSERT OR UPDATE OR DELETE
  ON tb_compra_detalle
  FOR EACH ROW
  EXECUTE PROCEDURE tr_stock_articulo_almacen();

-- Para la tabla de detalle de venta
CREATE TRIGGER tb_venta_detalle_trigger
  AFTER INSERT OR UPDATE OR DELETE
  ON tb_venta_detalle
  FOR EACH ROW
  EXECUTE PROCEDURE tr_stock_articulo_almacen();


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 ¡¡¡