none
Incrementar o Disminuir existencias RRS feed

  • Pregunta

  • Tengo una base de datos y tengo la tabla productos, compra y ventas, quiero que a la hora de agregar una nueva compra o venta 

    incremente o reste los datos en la tabla productos en el apartado existencias les dejo la relación y el procedure de la venta

    ALTER PROC [dbo].[VentasCreateOrUpdate]
    @numventa int,
    @cliente varchar(50),
    @fecha datetime,
    @cantidad int,
    @id_producto int,
    @p_unitario int,
    @p_total int
    AS
    If(@numventa=0)
    	BEGIN
    	INSERT INTO VENTAS(cliente, fecha, cantidad, id_producto, precio_unitario,precio_total)
    	VALUES (@cliente, @fecha, @cantidad, @id_producto, @p_unitario,@p_total)
    	END
    ELSE
    	BEGIN
    	UPDATE VENTAS
    	SET
    	cliente = @cliente,
    	fecha= @fecha, 
    	cantidad=@cantidad,
    	id_producto=@id_producto,
    	precio_unitario=@p_unitario,
    	precio_total=@p_total	
    	WHERE numfactura= @numventa
    	END

    martes, 28 de enero de 2020 2:36

Todas las respuestas

  • Hola Edward_Castillo:

    Para lo que solicitas:

    CREATE TABLE ventas
    (cliente         VARCHAR(50), 
     fecha           DATETIME, 
     cantidad        INT, 
     id_producto     INT, 
     precio_unitario INT, 
     precio_total    INT, 
     numfactura      INT IDENTITY(1,1) 
     -- ESTO NO SERÁ ASÍ PERO ME FACILITA EL CÓDIGO PORQUE NO TENGO QUE CALCULAR EL NUMERO DE FACTURA
    );
    
    CREATE TABLE productos
    (id_prod     INT, 
     descripcion VARCHAR(50), 
     idMarca     INT, 
     idCateg     INT, 
     existencia  INT, 
     precioA     INT, 
     precioB     INT, 
     precioC     INT, 
     precioD     INT
    );
    GO
    INSERT INTO dbo.productos (id_prod, descripcion, idMarca, idCateg, existencia, precioA, precioB, precioC, precioD)
    VALUES
    (1,'CAMISA',1,1,100,10,15,20,25);
    GO
    /* hasta aquí el escenario para poder efectuar pruebas */
    
    -- SI EL SQL SERVER ES INFERIOR A 2016, UTILIZAR O CREATE O ALTER (NO JUNTOS)
    CREATE OR ALTER PROC [dbo].[VentasCreateOrUpdate] @numventa    INT, 
                                             @cliente     VARCHAR(50), 
                                             @fecha       DATETIME, 
                                             @cantidad    INT, 
                                             @id_producto INT, 
                                             @p_unitario  INT, 
                                             @p_total     INT
    AS
    BEGIN TRANSACTION
    BEGIN TRY
    
    --- SOLO INCORPORAR SI SE QUIERE EVITAR LA VENTA CUANDO NO HAY STOCK
    	DECLARE @CANTIDADSTOCK INT = (SELECT EXISTENCIA FROM dbo.productos WHERE id_prod = @id_producto);
    	IF @CANTIDADSTOCK< @cantidad
    	BEGIN
    		PRINT' EL STOCK ES MENOR QUE LA CANTIDAD VENDIDA'
    		-- AQUÍ SE PODRÍA DESHACER LA TRANSACCION Y DEVOLVER UN ERROR.
    	END
    ---- FIN DEL CONTROL DE STOCK
    
         IF(@numventa = 0)
             BEGIN
                 INSERT INTO VENTAS
                  (cliente
                 , fecha
                 , cantidad
                 , id_producto
                 , precio_unitario
                 , precio_total
                  )
                 VALUES
                 (
                        @cliente, @fecha, @cantidad, @id_producto, @p_unitario, @p_total
                 );
    			 
         END;
             ELSE
             BEGIN
                 UPDATE VENTAS
                   SET 
                       cliente = @cliente, 
                       fecha = @fecha, 
                       cantidad = @cantidad, 
                       id_producto = @id_producto, 
                       precio_unitario = @p_unitario, 
                       precio_total = @p_total
                        WHERE numfactura = @numventa;
         END;
    
    	 UPDATE dbo.productos SET existencia = existencia - @cantidad WHERE ID_PROD = @id_producto;
    
    COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    	IF (@@TRANCOUNT>0)
    		ROLLBACK TRANSACTION;
    	THROW;
    END CATCH
    GO
    
    /* ejecutamos una inserción */
    EXEC [dbo].[VentasCreateOrUpdate] @numventa    = 0, 
                                      @cliente     ='JUAN', 
                                      @fecha       = '20200101', 
                                      @cantidad    = 10, 
                                      @id_producto = 1, 
                                      @p_unitario  = 10, 
                                      @p_total     = 10;
    GO
    /* ejecutamos un update */
    EXEC [dbo].[VentasCreateOrUpdate] @numventa    = 1, 
                                      @cliente     ='JUAN', 
                                      @fecha       = '20200201', 
                                      @cantidad    = 30, 
                                      @id_producto = 1, 
                                      @p_unitario  = 15, 
                                      @p_total     = 450;			
    GO	
    

    Salida

    Flecos que tienes que tener en cuenta.

    Una venta no debería de ser modificada sin dejar rastro.

    Te he puesto un if al principio del procedimiento por si quieres controlar el stock antes de hacer nada. Dado que con el procedimiento solo entra una fila no habrá una merma en rendimiento por hacerlo de este modo y no controlarlo en la sentencia de insert o update, que se podría.

    El número de factura, en el ejemplo he puesto que es un número identity, aunque supongo que no sea tú modelo.

    Espero te ayude

    martes, 28 de enero de 2020 5:08