SoloCodigo

Bases de Datos => SQL Server => Mensaje iniciado por: JoseServer en Martes 12 de Mayo de 2009, 21:24

Título: UPDATE APARTIR DE CONSULTA
Publicado por: JoseServer en Martes 12 de Mayo de 2009, 21:24
Hola que tal amigos, necesito ayuda para un procedimiento que quiero hacer
para actualizar uns registros, que es este:

tengo las tablas tblVentas , tblDescripcionVenta  de las que voy a eliminar una venta, (par el dado caso de una cancelacion o algo relacionado)
Al eliminar la venta, quiero regresar a la tabla tblProductos las cantidades de producto que se hiban a vender (campo existencia).


ALTER PROCEDURE spSESPOSDelVenta
   @idVenta int
AS
BEGIN
   SET NOCOUNT ON;
   DECLARE @idproducto int;
   DECLARE @cantidad int;
   
   
   WHILE (SELECT idProducto FROM tblProductos WHERE exists (SELECT @idProducto =idProducto ,  @cantidad =cantidad  FROM tblDescripcionVenta WHERE idVenta = @idVenta) )
      BEGIN
      
         UPDATE tblProductos set existencia =( existencia + @cantidad)  
         WHERE idProducto = @idProducto
                  
      END
   
   Delete from tblVentas WHERE  idVenta = @idVenta
   
   Delete from tblDescripcionVenta WHERE idVenta = @idVenta
   
END

Como seria , de antemano gracias x sus respuestas...
Título: Re: UPDATE APARTIR DE CONSULTA
Publicado por: F_Tanori en Miércoles 13 de Mayo de 2009, 16:35
Te recomiendo usarlo de manera transaccional para asegurar su exito,
en este ejemplo se asume que tblDescripcionVenta  contiene el codigo del producto, la cantidad vendida, y se relacciona la tabla de productos a traves del codigo del producto...

Espero Te sirva.

Código: SQL
  1. CREATE PROCEDURE spSESPOSDelVenta
  2. @idVenta INT
  3. AS
  4. BEGIN
  5. SET NOCOUNT ON;
  6.     -- Actualizar Almacen
  7.     UPDATE tblProductos  SET existencia = (p.existencia + dv.cantidad) FROM tblProductos   p
  8.     INNER JOIN tblDescripcionVenta dv ON dv.codigo = p.codigo
  9.     WHERE idventa = @idVenta
  10.  
  11.     --Eliminar Ventas ( se perderan consecutivos !)
  12.     DELETE FROM tblVentas       WHERE id_venta=@idVenta
  13.     DELETE FROM tblDescripcionVenta WHERE id_venta=@idVenta
  14.  
  15. END
  16.  


Código: SQL
  1. EXEC spSESPOSDelVenta 18
  2.  
Título: Re: UPDATE APARTIR DE CONSULTA
Publicado por: JoseServer en Miércoles 13 de Mayo de 2009, 19:20
Gracias   :D , funcionó muy bien.

La verdad ya lo tenia asÍ:

 UPDATE  tblProductos
      SET existencia = existencia +
      (Select DV.cantidad FROM tblDescripcionVenta as DV WHERE DV.idProducto = tblProductos.idProducto AND DV.idventa=@idVenta)
      WHERE tblProductos.idProducto IN (Select DV.idProducto FROM tblDescripcionVenta as DV WHERE  DV.idventa=@idVenta)

Pero es mas corto y mejor tú  Trans-sql .   :good:

POST CERRADO - RESUELTO.  :good:
Título: Re: UPDATE APARTIR DE CONSULTA
Publicado por: F_Tanori en Lunes 18 de Mayo de 2009, 00:44
Claro, a la larga (conforme aumenta el numero de registros, las subconsultas se vuelven pesadas)

Saludos