none
Actualizacion de tabla detalles RRS feed

  • Pregunta

  • Buenas mi pregunta es sencilla

    Tengo 3 tablas una de ventas, otra de detallesventa y la de productos. la tabla de productos tiene un campo de cantidad, que cada vez que hago una venta se actualiza el campo de cantidad cuando hago una salidad de X producto, quisiera poder saber como hago para cuando anulo una venta, todos los productos que tiene el detalle de esa venta aumenten la cantidad.

    ojala puedan entenderme y gracias de antemano.


    Alexander Jimenez

    jueves, 7 de junio de 2018 19:24

Todas las respuestas

  • Si la operacion de anular una venta la haces dentro de un procedimiento almacenado, entonces pudieras adicionar la logica en este.

    Otra forma es creando triggers de acuerdo a la accion y ques etos se encarguen de actualizar la tabla producto.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    jueves, 7 de junio de 2018 19:32
  • Hola AJ Designs:

    Te diría que el stock no es una propiedad del producto, que no parece el sitio más recomendable.

    Como no has puesto nada más que la idea que tienes, he intentado trasladarla de un modo muy simple.

    /* minimo */
    
    CREATE TABLE VENTA
    (ID            INT IDENTITY(1, 1),
     CLIENTE       INT,
     TIPOOPERACION VARCHAR(10)
    );
    GO
    
    /* relacionado por el id con la venta */
    
    CREATE TABLE DETALLE_VENTA
    (ID       INT,
     LINEA    INT,
     PRODUCTO INT,
     CANTIDAD INT
    );
    GO
    CREATE TABLE PRODUCTOS
    (IDPRODUCTO    INT IDENTITY(1, 1),
     DESCRIPCION   VARCHAR(10),
     CANTIDADSTOCK INT
    );
    GO
    
    /*inserto dos productos con su stock a modo de ejemplo */
    
    INSERT INTO PRODUCTOS
    (DESCRIPCION,
     CANTIDADSTOCK
    )
    VALUES
    ('PRODUCTO1',
     10
    ),
    ('PRODUCTO2',
     20
    );
    GO
    
    /* creo un procedimiento almacenado para insertar la cabecera */
    
    CREATE PROCEDURE SP_OPERACIONVENTA
    (@ID      INT OUTPUT,
     @CLIENTE INT,
     @TIPO    VARCHAR(10)
    )
    AS
         INSERT INTO VENTA
    (CLIENTE,
     TIPOOPERACION
    )
         VALUES
    (@CLIENTE,
     @TIPO
    );
         SET @ID = SCOPE_IDENTITY(); 
    
    /*le asigno al parametro definido como output el id de la venta */
    
         RETURN;
    GO
    
    /* creo un procedimiento para el detalle */
    
    CREATE PROCEDURE SP_OPERACIONDETALLE
    (@ID       INT,
     @LINEA    INT,
     @PRODUCTO INT,
     @CANTIDAD INT,
     @TIPO     VARCHAR(10)
    )
    AS
    	
    	/* inserto el detalle de la venta */
    
         INSERT INTO DETALLE_VENTA
    (ID,
     LINEA,
     PRODUCTO,
     CANTIDAD
    )
         VALUES
    (@ID,
     @LINEA,
     @PRODUCTO,
     @CANTIDAD
    );
    	
    /* si la operacion es del tipo SALIDA entonces sumo el stock al producto, sino nada */
    
         IF @TIPO = 'SALIDA'
             BEGIN
                 UPDATE PRODUCTOS
                   SET
                       CANTIDADSTOCK = CANTIDADSTOCK + @CANTIDAD
                 WHERE IDPRODUCTO = @PRODUCTO;
             END;
         RETURN;
    GO
    
    /* INICIAMOS LAS OPERACIONES */
    
    DECLARE @VALOR INT;
    DECLARE @ID INT;
    DECLARE @TP VARCHAR(20)= 'ENTRADA';
    
    /*en la definicion de la operacion le indico que el parametro @ID es de salida */
    
    EXECUTE SP_OPERACIONVENTA
            @ID OUTPUT,
            @CLIENTE = 1,
            @TIPO = @TP;
    
    /*MOVIMIENTO QUE NO SUMA STOCK*/
    
    /*EL PARAMETRO @ID nos vendrá con el valor insertado en la tabla */
    
    /*ejecuto el detalle */
    
    EXECUTE SP_OPERACIONDETALLE
            @ID,
            1,
            1,
            12,
            @TP;
    SELECT *
    FROM VENTA;
    SELECT *
    FROM DETALLE_VENTA;
    SELECT *
    FROM PRODUCTOS;
    
    /* NO HUBO CAMBIOS */
    
    GO
    
    /* AHORA UN OPERACION QUE VARIA STOCK */
    
    DECLARE @VALOR INT;
    DECLARE @ID INT;
    DECLARE @TP VARCHAR(20)= 'SALIDA';
    EXECUTE SP_OPERACIONVENTA
            @ID OUTPUT,
            @CLIENTE = 1,
            @TIPO = @TP;
    
    /*MOVIMIENTO QUE NO SUMA STOCK*/
    
    /*EL PARAMETRO @ID nos vendrá con el valor insertado en la tabla */
    
    EXECUTE SP_OPERACIONDETALLE
            @ID,
            1,
            1,
            12,
            @TP;
    SELECT *
    FROM VENTA;
    SELECT *
    FROM DETALLE_VENTA;
    SELECT *
    FROM PRODUCTOS;

    Espero que te sirva.

    Saludos

    jueves, 7 de junio de 2018 19:59