none
Procedimiento Almacenado RRS feed

  • Pregunta

  • Hola comunidad, tengo una duda 

    tengo 2 tablas 

    Venta

    -----

    (PK- AUTOINCREMENT)idventa|(FK)idempleado|(FK)idcliente|idtransporte|total|fecha

    DetalleVenta

    (PK- AUTOINCREMENT)iddetalleventa|(FK)idventa|(FK)idproducto|cantidad|subtotal|

    y con un procedimiento almacenado alimento a las 2 tablas...

    CREATE PROCEDURE [dbo].[sp_GenerarVenta]
    -- Add the parameters for the stored procedure here

    @Empleado int,
    @Cliente int,
    @Producto int,
    @Transporte int,
    @TamanioPedido int


    AS
    BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @idResulVenta int

        -- Insert statements for procedure here
    insert into [Venta] values(@Empleado,@Cliente,@Transporte,0,getdate())
    Select @idResulVenta = scope_identity()
    insert into [DetalleVenta] values(@idResulVenta, @Producto,@TamanioPedido,((Select ((p.Precio) * (@TamanioPedido)) from [Producto] p inner join [DetalleVenta] dv on p.IdProducto = dv.IdProducto where p.IdProducto = @Producto)))
    update v set v.Total = (SELECT Total FROM Venta WHERE IdVenta = @idResulVenta) + (SELECT dv.Subtotal from DetalleVenta dv where dv.IdVenta = @idResulVenta) from Venta v 
    END

    la pregunta es ¿COMO SE CALCULA EL TOTAL?, en "ventas" tengo una tabla producto que tiene el precio del producto y lo multiplico por la cantidad, ¿Esas columnas con la misma venta como las sumo y inserto en el Total?


    Crysis

    martes, 29 de noviembre de 2016 5:40

Respuestas

  • CrysisDeveloper,

    Intenta analizar y realizar le código propuesto:

    CREATE PROCEDURE dbo.sp_GenerarVenta
        @Empleado int,
        @Cliente int,
        @Producto int,
        @Transporte int,
        @TamanioPedido int
    AS
    BEGIN
        SET NOCOUNT ON;
    
        BEGIN TRANSACTION
    
        BEGIN TRY
    	   DECLARE @idVenta int
    
    	   INSERT INTO dbo.Venta 
    	   VALUES (@Empleado, @Cliente, @Transporte, 0, GETDATE());
    
    	   SELECT @idVenta = SCOPE_IDENTITY();
    
    	   INSERT INTO dbo.DetalleVenta 
    	   SELECT 
    		  @idVenta, 
    		  @Producto, 
    		  @TamanioPedido, 
    		  MAX(p.Precio) * @TamanioPedido
    	   FROM
    		  Producto p
    		  INNER JOIN DetalleVenta dv ON p.IdProducto = dv.IdProducto
    			 AND (p.IdProducto = @Producto)
    	   GROUP BY
    		  p.IdProducto;
    
    	   WITH T AS
    	   (
    		  SELECT dv.IdVenta, SUM(dv.Subtotal) AS 'SubTotal' 
    		  FROM DetalleVenta dv WHERE dv.IdVenta = @idVenta
    	   )    
    	   UPDATE v 
    	   SET v.Total = v.Total + t1.SubTotal
    	   FROM 
    		  Venta v
    		  INNER JOIN T t1 ON v.IdVenta = t1.IdVenta;
        END TRY
        BEGIN CATCH
    	   SELECT ERROR_MESSAGE()
    
    	   IF @@TRANCOUNT > 0  
    		  ROLLBACK TRANSACTION;  
        END CATCH
    
        IF @@TRANCOUNT > 0  
    	   COMMIT TRANSACTION;  
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 29 de noviembre de 2016 16:06

Todas las respuestas

  • por lo que veo tu ya has buscado una solución. aunque no tengo muy claro como resuelves que un pedido tenga más de una línea.

    ?cual es el problema con los queries que has puesto?


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 29 de noviembre de 2016 7:08
    Moderador
  • CrysisDeveloper,

    Intenta analizar y realizar le código propuesto:

    CREATE PROCEDURE dbo.sp_GenerarVenta
        @Empleado int,
        @Cliente int,
        @Producto int,
        @Transporte int,
        @TamanioPedido int
    AS
    BEGIN
        SET NOCOUNT ON;
    
        BEGIN TRANSACTION
    
        BEGIN TRY
    	   DECLARE @idVenta int
    
    	   INSERT INTO dbo.Venta 
    	   VALUES (@Empleado, @Cliente, @Transporte, 0, GETDATE());
    
    	   SELECT @idVenta = SCOPE_IDENTITY();
    
    	   INSERT INTO dbo.DetalleVenta 
    	   SELECT 
    		  @idVenta, 
    		  @Producto, 
    		  @TamanioPedido, 
    		  MAX(p.Precio) * @TamanioPedido
    	   FROM
    		  Producto p
    		  INNER JOIN DetalleVenta dv ON p.IdProducto = dv.IdProducto
    			 AND (p.IdProducto = @Producto)
    	   GROUP BY
    		  p.IdProducto;
    
    	   WITH T AS
    	   (
    		  SELECT dv.IdVenta, SUM(dv.Subtotal) AS 'SubTotal' 
    		  FROM DetalleVenta dv WHERE dv.IdVenta = @idVenta
    	   )    
    	   UPDATE v 
    	   SET v.Total = v.Total + t1.SubTotal
    	   FROM 
    		  Venta v
    		  INNER JOIN T t1 ON v.IdVenta = t1.IdVenta;
        END TRY
        BEGIN CATCH
    	   SELECT ERROR_MESSAGE()
    
    	   IF @@TRANCOUNT > 0  
    		  ROLLBACK TRANSACTION;  
        END CATCH
    
        IF @@TRANCOUNT > 0  
    	   COMMIT TRANSACTION;  
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 29 de noviembre de 2016 16:06