Ir al contenido


Foto

Como puedo descontar productos de un inventario?


  • Por favor identifícate para responder
12 respuestas en este tema

#1 arkanimus

arkanimus

    Member

  • Miembros
  • PipPip
  • 31 mensajes

Escrito 20 mayo 2013 - 08:50

Hola chicos no se me ocurre como modificar mi inventario para descontar prodcutos me imagino que se hace con un procedimiento almacenado pero no se me ocurre como hacerlo..
Bueno porfavor ayudeneme! chicos se los agradeceria mucho:


Tengo la siguiente tabla:

Imagen Enviada

Luego tengo la siguiente consulta:

SELECT sum( detalle_pedido.cantidad ) AS cantidad_pedida, detalle_pedido.id_pedido, productos.nombre, productos.id_producto, inventario.cantidad
FROM detalle_pedido, productos, inventario
WHERE detalle_pedido.id_producto = productos.id_producto
AND productos.id_producto = inventario.id_producto
GROUP BY detalle_pedido.id_pedido, productos.nombre, productos.id_producto, inventario.cantidad


Esta consulta me muestra la cantidad pedida de un producto y la cantidad total de ese producto en el inventario..

Quedando de esta Forma:
Imagen Enviada

mi idea es modificar el inventario luego de insertar.. y para eso tengo el siguiente procedimiento almacenado:

delimiter $$;

CREATE PROCEDURE sp_insertaventa(IN p_id_pedido INT, IN p_id_empleado INT)
BEGIN
  DECLARE VI_PEDIDOS INTEGER;

  SELECT COUNT(*) INTO VI_PEDIDOS
      FROM venta WHERE venta.id_pedido = p_id_pedido;

  IF (VI_PEDIDOS = 0) THEN
      INSERT
          INTO venta (id_pedido,id_empleado)
    VALUES (p_id_pedido,p_id_empleado);
  END IF;

END $$;

call sp_insertaventa(1,1);



Lo que no se hacer es la modificacion en inventario con los datos que entregue no se me ocurre como hacerla..
bueno nuevamente les solicito su ayuda porfavor.

Muchas gracias.!


  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 21 mayo 2013 - 01:50

Buenas,

Por regla general, la modificación del stock suele hacerse mediante un trigger asociado a la tabla de líneas de los albaranes o facturas (dependiendo del negocio si hace lo uno o lo otro). En tu caso entiendo que sería detalle_pedido

Saludos
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 mayo 2013 - 07:44

Te pongo un ejemplo de cómo materializar la idea que da Cadetill, los Triggers  deberían quedar más o menos así, asumiendo que la tabla Detalle_Pedido tiene un campo Cantidad, que no lo veo en el diagrama:


create trigger BIDETALLE_PEDIDO for DETALLE_PEDIDO
    active before insert position 0 as
begin
    update INVENTARIO
    set    CANTIDAD = CANTIDAD - new.Cantidad
    where  ID_Producto = new.ID_Producto;
end!

create trigger BDDETALLE_PEDIDO for DETALLE_PEDIDO
    active before delete position 0 as
begin
    update INVENTARIO
    set    CANTIDAD = CANTIDAD + old.Cantidad
    where  ID_Producto = old.ID_Producto;
end!

create trigger BUDETALLE_PEDIDO for DETALLE_PEDIDO
    active before update position 0 as
begin
    update INVENTARIO
    set    CANTIDAD = CANTIDAD + old.Cantidad
    where  ID_Producto = old.ID_Producto;
    update INVENTARIO
    set    CANTIDAD = CANTIDAD - new.Cantidad
    where  ID_Producto = new.ID_Producto;
end!


Saludos.
  • 0

#4 arkanimus

arkanimus

    Member

  • Miembros
  • PipPip
  • 31 mensajes

Escrito 21 mayo 2013 - 01:58

Vamos a probar..

si la tabla detalle_pedido tiene el campo cantidad solo que en ese diagrama no sale muchas gracias!!, a probar se ha dicho!!


pucha me tira error.. primero que todo modifique un poco el trigger lo deje de esta manera o sino me tiraba error en todos los END

delimiter $$;
CREATE TRIGGER BIDETALLE_PEDIDO FOR DETALLE_PEDIDO
        active BEFORE INSERT POSITION 0 AS
    BEGIN
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD - NEW.Cantidad
        WHERE  ID_Producto = NEW.ID_Producto;
    END$$;
   
    CREATE TRIGGER BDDETALLE_PEDIDO FOR DETALLE_PEDIDO
        active BEFORE DELETE POSITION 0 AS
    BEGIN
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD + OLD.Cantidad
        WHERE  ID_Producto = OLD.ID_Producto;
    END $$;
   
    CREATE TRIGGER BUDETALLE_PEDIDO FOR DETALLE_PEDIDO
        active BEFORE UPDATE POSITION 0 AS
    BEGIN
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD + OLD.Cantidad
        WHERE  ID_Producto = OLD.ID_Producto;
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD - NEW.Cantidad
        WHERE  ID_Producto = NEW.ID_Producto;
    END $$;



Pero ahora me tira error en todos los FOR ejemplo:

CREATE TRIGGER BUDETALLE_PEDIDO FOR DETALLE_PEDIDO


  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 mayo 2013 - 02:41

Disculpa, lo había hecho para Firebird. En MySql sería algo así:


delimiter $$;
CREATE TRIGGER BIDETALLE_PEDIDO BEFORE INSERT ON DETALLE_PEDIDO
      FOR EACH ROW
    BEGIN
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD - NEW.Cantidad
        WHERE  ID_Producto = NEW.ID_Producto;
    END$$;
   
    CREATE TRIGGER BDDETALLE_PEDIDO BEFORE DELETE ON DETALLE_PEDIDO
        FOR EACH ROW
    BEGIN
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD + OLD.Cantidad
        WHERE  ID_Producto = OLD.ID_Producto;
    END $$;
   
    CREATE TRIGGER BUDETALLE_PEDIDO BEFORE UPDATE ON DETALLE_PEDIDO
        FOR EACH ROW
    BEGIN
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD + OLD.Cantidad
        WHERE  ID_Producto = OLD.ID_Producto;
        UPDATE INVENTARIO
        SET    CANTIDAD = CANTIDAD - NEW.Cantidad
        WHERE  ID_Producto = NEW.ID_Producto;
    END $$;


No estoy del todo familiarizado con MySql, si te da algún error, consulta la sintaxis para los triggers en MySql y adapta el código.

Saludos.


  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 21 mayo 2013 - 02:55

Estas cantidades a mi no me gusta llevarlo en una tabla como campo fijo, yo lo que hago es sumar los movimientos anterirores y eso me da la cantidad actual...
  • 0

#7 arkanimus

arkanimus

    Member

  • Miembros
  • PipPip
  • 31 mensajes

Escrito 21 mayo 2013 - 02:58

Funciona!!!!!!!!!

Muchas gracias! amigo si es posible me podrias explicar el trigger eso del OLD y New que no entiendo ..
porfaaa, pero el tema esta resuelto muchas gracias a todos! ..! sobre a todo a Wilson
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 mayo 2013 - 03:42

si es posible me podrias explicar el trigger eso del OLD y New que no entiendo ..


Para explicarte acerca de las variables OLD y NEW, ubícate en el contexto de una actualización, por ejemplo de tu tabla INVENTARIOS, vas a actualizar la cantidad de X producto, antes de la actualización hay 8 unidades, luego vendes 3 unidades, por lo tanto la variable OLD hace referencia a las 8 unidades existentes antes de la actualización, por su parte la variable NEW hace referencia al valor con el que piensas actualizar, en este caso sería 8-3 o sea 5.

Ahora que entiendes el porqué de esas dos variables notarás que en una inserción la variable OLD carece de sentido, igual pasa en un borrado con la variable NEW.

Ahora te explico porqué el trigger BEFORE UPDATE podría parecer un tanto confuso, retomemos el ejemplo del párrafo anterior, tenemos actualmente 10 unidades de x producto, el usuario quiere corregir un detalle de pedido en el que había vendido 4 pero resulta que no eran 4 sino 3, entonces observa que en la primera parte del trigger se suma a la cantidad actual del inventario la cantidad antigua del detalle de pedido o sea (10 + 4 = 14) por lo tanto la cantidad en el inventario queda temporalmente en 14; y en la segunda parte del trigger de actualización se resta de la cantidad temporal la nueva cantidad del detalle de pedido o sea (14-3= 11) por lo tanto el valor final de la cantidad de dicho producto es 11 y no los 10 del principio, todo porque finalmente no vendió 4 sino 3.

Espero se entienda.

Saludos.
  • 0

#9 arkanimus

arkanimus

    Member

  • Miembros
  • PipPip
  • 31 mensajes

Escrito 21 mayo 2013 - 08:57


si es posible me podrias explicar el trigger eso del OLD y New que no entiendo ..


Para explicarte acerca de las variables OLD y NEW, ubícate en el contexto de una actualización, por ejemplo de tu tabla INVENTARIOS, vas a actualizar la cantidad de X producto, antes de la actualización hay 8 unidades, luego vendes 3 unidades, por lo tanto la variable OLD hace referencia a las 8 unidades existentes antes de la actualización, por su parte la variable NEW hace referencia al valor con el que piensas actualizar, en este caso sería 8-3 o sea 5.

Ahora que entiendes el porqué de esas dos variables notarás que en una inserción la variable OLD carece de sentido, igual pasa en un borrado con la variable NEW.

Ahora te explico porqué el trigger BEFORE UPDATE podría parecer un tanto confuso, retomemos el ejemplo del párrafo anterior, tenemos actualmente 10 unidades de x producto, el usuario quiere corregir un detalle de pedido en el que había vendido 4 pero resulta que no eran 4 sino 3, entonces observa que en la primera parte del trigger se suma a la cantidad actual del inventario la cantidad antigua del detalle de pedido o sea (10 + 4 = 14) por lo tanto la cantidad en el inventario queda temporalmente en 14; y en la segunda parte del trigger de actualización se resta de la cantidad temporal la nueva cantidad del detalle de pedido o sea (14-3= 11) por lo tanto el valor final de la cantidad de dicho producto es 11 y no los 10 del principio, todo porque finalmente no vendió 4 sino 3.

Espero se entienda.

Saludos.


Se entiende compa! gracias! por la explicacion :D
  • 0

#10 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 22 mayo 2013 - 12:09

Estas cantidades a mi no me gusta llevarlo en una tabla como campo fijo, yo lo que hago es sumar los movimientos anterirores y eso me da la cantidad actual...


Eso pensaba yo tambien hace algun tiempo, pero resulta que cuando tienes millones de registros eso no es muy factible.
  • 0

#11 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 23 mayo 2013 - 01:32


Estas cantidades a mi no me gusta llevarlo en una tabla como campo fijo, yo lo que hago es sumar los movimientos anterirores y eso me da la cantidad actual...


Eso pensaba yo tambien hace algun tiempo, pero resulta que cuando tienes millones de registros eso no es muy factible.


A parte de "este detalle", llega un momento en una empresa que, por volumen de datos, necesitas quitar histórico. ¿Entonces qué haces? ¿Cómo haces esa suma?

Además, suele haber más de 1 tabla que "toque" el stock de una empresa (albaranes de compra, albaranes de venta/tickets, inventarios, regulaciones de stock,......).

Saludos
  • 0

#12 jorgito

jorgito

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 28 noviembre 2016 - 06:00

buenas soy nuevo en esto.. por favor si alguien me explica algo por que cuando es insert se resta stockactual con cantidad y si es delete se suman.. estoy haciendo un sistema de venta. cuando le inserto un stock le sumo la cantidad el precio total de compra y el precio total de venta cuando es modificar le modifico los campos verdad pero cuando es delete osea una venta le tengo que restar la cantidad que vendi y obviamente el precio total de venta que tenia y el precio total de compra que tenia. por favor si alguien me explica...

trigger de insert

begin
declare resultado bigint;
declare resultado1 bigINT;
   if EXISTS(select * from stock_productos WHERE id_productos = new.id_productos)then
    UPDATE stock_productos
    set cantidad_total = cantidad_total + new.cantidad, precio_total_compra = precio_total_compra + (new.cantidad * new.precio_compra), precio_total_venta = precio_total_venta + (new.cantidad * new.precio_venta)
    WHERE id_productos = new.id_productos;
ELSE
 set resultado = (new.cantidad * new.precio_compra);
 set resultado1 = (new.cantidad * new.precio_venta);
 INSERT into stock_productos(id_productos, cantidad_total, precio_total_compra, precio_total_venta)
 VALUES (new.id_productos, new.cantidad, resultado, resultado1);
 end IF;
 end
 
trigger de update
begin
declare resultado bigint;
declare resultado1 bigINT;
 
if EXISTS(select * from stock_productos WHERE id_productos = new.id_productos)then
    UPDATE stock_productos
    set cantidad_total = cantidad_total - old.cantidad, precio_total_compra = precio_total_compra - (old.cantidad * old.precio_compra), precio_total_venta = precio_total_venta - (old.cantidad * old.precio_venta)
    WHERE id_productos = old.id_productos;
ELSE
 set resultado = (new.cantidad * new.precio_compra);
 set resultado1 = (new.cantidad * new.precio_venta);
 INSERT into stock_productos(id_productos, cantidad_total, precio_total_compra, precio_total_venta)
 VALUES (old.id_productos, old.cantidad, resultado, resultado1);
 end IF;
 
   if EXISTS(select * from stock_productos WHERE id_productos = new.id_productos)then
    UPDATE stock_productos
    set cantidad_total = cantidad_total + new.cantidad, precio_total_compra = precio_total_compra + (new.cantidad * new.precio_compra), precio_total_venta = precio_total_venta + (new.cantidad * new.precio_venta)
    WHERE id_productos = new.id_productos;
ELSE
 set resultado = (new.cantidad * new.precio_compra);
 set resultado1 = (new.cantidad * new.precio_venta);
 INSERT into stock_productos(id_productos, cantidad_total, precio_total_compra, precio_total_venta)
 VALUES (new.id_productos, new.cantidad, resultado, resultado1);
 end IF;
 end

 

 

me faltaria el trigger delete para mi venta...


  • 0

#13 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 545 mensajes
  • Location127.0.0.1

Escrito 27 diciembre 2016 - 03:57

A parte de "este detalle", llega un momento en una empresa que, por volumen de datos, necesitas quitar histórico. ¿Entonces qué haces? ¿Cómo haces esa suma?

Además, suele haber más de 1 tabla que "toque" el stock de una empresa (albaranes de compra, albaranes de venta/tickets, inventarios, regulaciones de stock,......).

Saludos

 

 

Hola, despues de leer el Hilo... y con respecto a este Tema.

 

Segun el pais y el uso de la Contabilidad, existen como hace referencia @Cadetill estos inconvenientes, si mal no recuerdo las informaciones deben de guardarse al minimo de 10 años por revisiones y asuntos fiscales.

 

http://contadormx.co...-de-la-empresa/

 

No es bueno descartar esto... Se que el hilo es Antiguo, pero el Tema es Interesante.

 

Saludos!


  • 0