s14 Administracion

Descargar como txt, pdf o txt
Descargar como txt, pdf o txt
Está en la página 1de 6

/*Se debe crear un procedimiento y cursor para poder cumplir con los objetivos

propuestos de la práctica para el registro de un pedido de un cliente.


(Debe aplicar BEGIN, COMMIT, ROLLBACK y el empleo del TRY y CATCH)

Crear un procedimiento almacenado donde haga uso de transacciones y excepciones


para crear un cursor que recorra todos los registros de la tabla CLIENTE
luego registre a cada uno, una VENTA con una cantidad de registros aleatorios en
VENTABOLETOS, en esta tabla se insertaràn registros de 1 a un valor N
(este valor debe ingresar como paràmetro) estos registros son de las películas de
la tabla CARTELERA solo se tomará las que tengan estado 1.

El asiento será un número ingresado como paràmetro. Despuès de insertar los


registros en la tabla VENTABOLETOS, debe calcular los totales y editar estos
valores
en la tabla VENTA, el iva será del 12%. */

CREATE OR ALTER PROCEDURE SP_REGISTRAR_VENTAS


@CANT INT,
@ASIENTO INT
AS
BEGIN TRY
BEGIN TRANSACTION
DECLARE @IDCLIENTE INT
DECLARE @REGISTROS INT
DECLARE @IDCARTELERA INT
DECLARE @IDVENTA INT
DECLARE @PRECIO REAL
DECLARE @SUBTOTAL REAL
DECLARE @IVA REAL
DECLARE @TOTAL REAL
DECLARE CLIENTES CURSOR FOR SELECT IDCLIENTE FROM CLIENTE
OPEN CLIENTES
FETCH CLIENTES INTO @IDCLIENTE
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO VENTA VALUES(@IDCLIENTE,GETDATE(),0.00,0.00,0.00,0.00)
SELECT @IDVENTA = ident_current('VENTA')
SELECT @REGISTROS = ROUND(((@CANT - 1) * RAND() + 1), 0)
DECLARE DETALLE CURSOR FOR SELECT TOP(@REGISTROS) IDCARTELERA, PRECIO
FROM CARTELERA WHERE ESTADO = 1 ORDER BY NEWID()
OPEN DETALLE
FETCH DETALLE INTO @IDCARTELERA,@PRECIO
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO VENTABOLETOS
VALUES(@IDVENTA,@IDCARTELERA,@ASIENTO,@PRECIO)
FETCH DETALLE INTO @IDCARTELERA,@PRECIO
END
CLOSE DETALLE
DEALLOCATE DETALLE
SELECT @SUBTOTAL = SUM(PRECIO) FROM VENTABOLETOS WHERE IDVENTA =
@IDVENTA
SELECT @IVA = @SUBTOTAL * 0.12
SELECT @TOTAL = @SUBTOTAL + @IVA
UPDATE VENTA SET SUBTOTAL = @SUBTOTAL,IVA=@IVA,TOTAL=@TOTAL WHERE
IDVENTA = @IDVENTA
FETCH CLIENTES INTO @IDCLIENTE
END
CLOSE CLIENTES
DEALLOCATE CLIENTES
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT ERROR_MESSAGE()
END CATCH

---------------------------
CREATE DATABASE RESTAURANT
USE RESTAURANT

CREATE TABLE CLIENTE


(
IDCLIENTE INT PRIMARY KEY IDENTITY,
NOMBRES VARCHAR(100),
CEDULA VARCHAR(100) UNIQUE,
FECHA_NAC DATE DEFAULT GETDATE(),
GENERO INT DEFAULT 1,
)

CREATE TABLE CATEGORIA


(
IDCATEGORIA INT PRIMARY KEY IDENTITY,
NOMBRE VARCHAR(100)
)

CREATE TABLE COMIDA


(
IDCOMIDA INT PRIMARY KEY IDENTITY,
NOMBRE VARCHAR(50),
IDCATEGORIA INT REFERENCES CATEGORIA(IDCATEGORIA),
PRECIO REAL DEFAULT 0.00
)

CREATE TABLE MENU


(
IDMENU INT PRIMARY KEY IDENTITY,
FECHA_REGISTRO DATE DEFAULT GETDATE(),
OBSERVACION VARCHAR(50)
)

CREATE TABLE MENUCOMIDA


(
IDMENUCOMIDA INT PRIMARY KEY IDENTITY,
IDMENU INT REFERENCES MENU(IDMENU),
IDCOMIDA INT REFERENCES COMIDA(IDCOMIDA),
ESTADO BIT
)

CREATE TABLE PEDIDO


(
IDPEDIDO INT PRIMARY KEY IDENTITY,
FECHA_REGISTRO DATE DEFAULT GETDATE(),
IDCLIENTE INT REFERENCES CLIENTE(IDCLIENTE),
PARA_LLEVAR BIT,
SUBTOTAL REAL,
IVA REAL,
DSCTO REAL,
TOTAL REAL,
)

CREATE TABLE PEDIDOMENUCOMIDA


(
IDPEDIDOMENUCOMIDA INT PRIMARY KEY IDENTITY,
IDPEDIDO INT REFERENCES PEDIDO(IDPEDIDO),
IDMENUCOMIDA INT REFERENCES MENUCOMIDA(IDMENUCOMIDA),
CANT INT,
PRECIO REAL DEFAULT 0.00,
SUBTOTAL REAL DEFAULT 0.00,
)

/*
Se debe crear un procedimiento y cursor para poder cumplir con los objetivos
propuestos de la práctica para el registro de un pedido de un cliente.
(Debe aplicar BEGIN, COMMIT, ROLLBACK y el empleo del TRY y CATCH) Crear un
procedimiento almacenado donde haga uso transacciones, excepciones, parámetros de
entrada y
salida para crear un cursor que recorra todos los registros de la tabla CLIENTE
luego registre a cada uno, un PEDIDO con un valor N
máximo de registros aleatorios en PEDIDOMENUCOMIDA, estos registros se tomarán de
forma aleatoria de la tabla MENUCOMIDA , en la tabla PEDIDOMENUCOMIDA
el campo de cantidad, al igual que el valor N, serán ingresados como parámetros, el
precio lo tomará del campo precio de la tabla COMIDA.
Al final de insertar todos los registros de PEDIDOMENUCOMIDA se calcula y
actualiza el subtotal, iva y total del PEDIDO.
*/

CREATE OR ALTER PROCEDURE SP_REGISTRO_PEDIDOS


@PLATOS INT,
@CANTIDAD INT
AS
BEGIN TRY
BEGIN TRANSACTION
IF EXISTS(SELECT * FROM PEDIDOMENUCOMIDA)
BEGIN
DECLARE @IDCLIENTE INT, @IDPEDIDO INT, @IDMENUCOMIDA INT
DECLARE @PRECIO REAL, @SUBTOTAL REAL,@IVA REAL, @TOTAL REAL
DECLARE CLIENTES CURSOR FOR SELECT IDCLIENTE FROM CLIENTE
OPEN CLIENTES
FETCH CLIENTES INTO @IDCLIENTE
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO PEDIDO VALUES(GETDATE(),@IDCLIENTE,0,0.00,0.00,0.00,0.00)
SELECT @IDPEDIDO = ident_current('PEDIDO')
DECLARE PEDIDOS CURSOR FOR SELECT TOP(@PLATOS) IDMENUCOMIDA, PRECIO
FROM MENUCOMIDA MC JOIN COMIDA C ON MC.IDCOMIDA = C.IDCOMIDA ORDER BY NEWID()
OPEN PEDIDOS
FETCH PEDIDOS INTO @IDMENUCOMIDA,@PRECIO
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO PEDIDOMENUCOMIDA
VALUES(@IDPEDIDO,@IDMENUCOMIDA,@CANTIDAD,@PRECIO,@CANTIDAD*@PRECIO)
FETCH PEDIDOS INTO @IDMENUCOMIDA,@PRECIO
END
CLOSE PEDIDOS
DEALLOCATE PEDIDOS
SELECT @SUBTOTAL = SUM(SUBTOTAL) FROM PEDIDOMENUCOMIDA WHERE IDPEDIDO
LIKE @IDPEDIDO
SET @IVA = @SUBTOTAL * 0.12
SET @TOTAL = @SUBTOTAL + @IVA
UPDATE PEDIDO SET SUBTOTAL = @SUBTOTAL,IVA=@IVA,TOTAL=@TOTAL WHERE
IDPEDIDO LIKE @IDPEDIDO
FETCH CLIENTES INTO @IDCLIENTE
END
CLOSE CLIENTES
DEALLOCATE CLIENTES
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT ERROR_MESSAGE()
END CATCH

EXEC SP_REGISTRO_PEDIDOS 5, 1
SELECT * FROM PEDIDO
-----
Ing. sobre el ejercicio del cursor del taller individual. Sandra Penzo
--------------------------------------------------------------------------
--------------------------------------------------------------------------
GO
create trigger tr_detalle_vta
on detalle after insert, delete
as
begin try
begin tran
declare @idprod int,@cant int
----
if exists(select * from deleted)--el ultimo borrado
begin
select @idprod=IDPRODUCTO, @cant = cant from deleted
---actualizar el stock
update PRODUCTO set STOCK = STOCK + @cant
where IDPRODUCTO = @idprod
end
else if exists(select * from inserted)--el ultimo insertado
begin
select @idprod=IDPRODUCTO, @cant = cant from inserted
update PRODUCTO set STOCK = STOCK - @cant
where IDPRODUCTO = @idprod
end
commit tran
end try
begin catch
rollback tran
end catch
---
go
create procedure registrar_vta
@id int, --id cliente
@mp int, --metodo de pago (1)= contado, (2)=credito
@n int, --numero de productos
@m varchar(100) output--para los mensajes
as
begin try
begin tran
--graba la cabecera de vta
declare @idvta int = (select isnull(MAX(idventa)+1,0) from VENTA)
insert VENTA (IDVENTA,FECHA_REG,METODO_PAGO,IDCLIENTE)
values(@idvta,getdate(),@mp,@id)
--graba el detalle de venta
declare @idprod int,@pvp real,@cant int,@st real
declare cursor_producto cursor for
select top (@n) idproducto,pvp from producto order by newid()
open cursor_producto
fetch cursor_producto into @idprod,@pvp
while @@fetch_status=0
begin
set @cant = (3-1)*rand()+1
set @st = @cant*@pvp
insert into detalle (IDVENTA,IDPRODUCTO,CANT,SUBTOTAL) values
(@idvta,@idprod,@cant,@st)
fetch cursor_producto into @idprod,@pvp
end
close cursor_producto
deallocate cursor_producto
set @m = 'OK'
commit tran
end try
begin catch
deallocate cursor_producto
rollback tran
set @m = error_message()
end catch
----procedimiento para borrar ventas
go
create procedure eliminar_vtas
@id int,--id venta
@m varchar(100) output
as
begin try
begin tran
declare @idprod int --id del producto
declare cursor_detalle cursor for select IDPRODUCTO from DETALLE where IDVENTA =
@id
open cursor_detalle
fetch cursor_detalle into @idprod
while @@fetch_status=0
begin
delete from DETALLE where IDVENTA = @id and IDPRODUCTO = @idprod
fetch cursor_detalle into @idprod
end
close cursor_detalle
deallocate cursor_detalle
delete from VENTA where IDVENTA = @id
set @m = 'OK'
commit tran
end try
begin catch
rollback tran
deallocate cursor_detalle
set @m=error_message()
end catch
go
---grabar una venta
select * from cliente
declare @msg varchar(100)
exec registrar_vta 6,1,3,@m=@msg output
print @msg
--
select * from producto
select * from VENTA v join DETALLE d
on v.IDVENTA = d.IDVENTA order by FECHA_REG desc
go
declare @msg varchar(100)
exec eliminar_vtas 11, @m=@msg output
print @msg

También podría gustarte