Está en la página 1de 7

PRÁCTICA CALIFICADA N° 01

BASE DE DATOS AVANZADAS


DOCENTE: Dr. Luis Boy Chavil
EN UN SISTEMA DE VENTAS DE PRODUCTOS FARMACÉUTICOS SE REQUIERE:
AL REGISTRAR UNA VENTA DE PRODUCTOS FARMACÉUTICOS; SE
ACTUALIZARÁ EL STOCK DEL PRODUCTO; ASI COMO SU RESPECTIVO
KÁRDEX DONDE SE REGISTRARÁ EL TIPO DE DOCUMENTO DE LA VENTA
(FACTURA O BOLETA), EL N° DE DICHO DOCUMENTO, EL TIPO DE
OPERACIÓN (EN ESTE CASO ES DE SALIDA), EL STOCK ANTERIOR, LA
CANTIDAD VENDIDA Y EL STOCK ACTUAL. TAMBIEN SE ACTUALIZARÁ LA
COMISIÓN DEL VENDEDOR QUE SERÁ ACUMULADO EN BASE AL 1% DEL
IMPORTE DE LA VENTA TOTAL; ASIMISMO, SE HARÁ LAS SIGUIENTES
VERIFICACIONES: EL ESTADO DEL CLIENTE DEBE ESTAR ACTIVO Y SU
SALDO DE CRÉDITO DEBE SER MAYOR AL IMPORTE TOTAL DE VENTA, EN
CASO CONTRARIO SE RECHAZA LA OPERACIÓN; SI NO HAY STOCK
SUFICIENTE, SE MOSTRARÁ UN MENSAJE DE RECHAZO Y SE ANULA LA
OPERACIÓN.

IMPLEMENTE EL SCRIPT EN T-SQL PARA RESOLVER EL PROBLEMA


PLANTEADO.
NOTA: PUEDE UTILIZAR: TRIGGER’S, FUNCIONES, CURSORES, PROCEDIMIENTOS
ALMACENADOS, ETC.

--Crear BD
GO
CREATE DATABASE BD_Examen_I
--Crear Tablas
GO
USE BD_Examen_I
GO
CREATE TABLE CLIENTE
(
cliente_id integer IDENTITY ( 1,1 ) ,
estado varchar(5) NOT NULL ,
saldo money NOT NULL
)
go

ALTER TABLE CLIENTE


ADD CONSTRAINT XPKCLIENTE PRIMARY KEY CLUSTERED (cliente_id ASC)
go

CREATE TABLE COMISION


(
vendedor_id integer NOT NULL ,
autogenerado integer IDENTITY ( 1,1 ),
cantidad money NOT NULL,
fecha DATETIME NULL DEFAULT(GETDATE())
)
go

ALTER TABLE COMISION


ADD CONSTRAINT XPKCOMISION PRIMARY KEY CLUSTERED (vendedor_id
ASC,autogenerado ASC)
go

CREATE TABLE DETALLE_DOCUMENTO


(
stock_actual char(18) NULL ,
sock_anterior char(18) NULL ,
cantidad_vendida char(18) NULL ,
documento_id integer NOT NULL ,
producto_id integer NOT NULL
)
go

ALTER TABLE DETALLE_DOCUMENTO


ADD CONSTRAINT XPKDETALLE_DOCUMENTO PRIMARY KEY CLUSTERED
(documento_id ASC,producto_id ASC)
go

CREATE TABLE DOCUMENTO_VENTA


(
documento_id integer IDENTITY ( 1,1 ) ,
venta_id integer NOT NULL ,
tipo char(18) NULL
)
go

ALTER TABLE DOCUMENTO_VENTA


ADD CONSTRAINT XPKDOCUMENTO_VENTA PRIMARY KEY CLUSTERED (documento_id
ASC)
go

CREATE TABLE PRODUCTO


(
producto_id integer IDENTITY ( 1,1 ) ,
nombre varchar(60) NOT NULL ,
stock integer NOT NULL ,
precio money NOT NULL
)
go

ALTER TABLE PRODUCTO


ADD CONSTRAINT XPKPRODUCTO PRIMARY KEY CLUSTERED (producto_id ASC)
go

CREATE TABLE VENDEDOR


(
vendedor_id integer IDENTITY ( 1,1 ),
nombre varchar(50)
)
go

ALTER TABLE VENDEDOR


ADD CONSTRAINT XPKVENDEDOR PRIMARY KEY CLUSTERED (vendedor_id ASC)
go

CREATE TABLE VENTA


(
venta_id integer IDENTITY ( 1,1 ) ,
cliente_id integer NULL ,
vendedor_id integer NULL
)
go

ALTER TABLE VENTA


ADD CONSTRAINT XPKVENTA PRIMARY KEY CLUSTERED (venta_id ASC)
go

ALTER TABLE COMISION


ADD CONSTRAINT R_6 FOREIGN KEY (vendedor_id) REFERENCES
VENDEDOR(vendedor_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE DETALLE_DOCUMENTO


ADD CONSTRAINT R_4 FOREIGN KEY (documento_id) REFERENCES
DOCUMENTO_VENTA(documento_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE DETALLE_DOCUMENTO


ADD CONSTRAINT R_5 FOREIGN KEY (producto_id) REFERENCES
PRODUCTO(producto_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE DOCUMENTO_VENTA


ADD CONSTRAINT R_3 FOREIGN KEY (venta_id) REFERENCES VENTA(venta_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE VENTA


ADD CONSTRAINT R_7 FOREIGN KEY (cliente_id) REFERENCES CLIENTE(cliente_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE VENTA


ADD CONSTRAINT R_8 FOREIGN KEY (vendedor_id) REFERENCES
VENDEDOR(vendedor_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
Go

--Condiciones
GO
USE BD_Examen_I
GO

IF OBJECT_ID('dbo.indexOf') IS NOT NULL


DROP FUNCTION dbo.indexOf
IF OBJECT_ID('SP_registrar_venta') IS NOT NULL
DROP PROCEDURE SP_registrar_venta

GO
-- RETORNA UNA CADENA DE ACUERDO A LA POSICION SOLICITADA
CREATE FUNCTION dbo.indexOf(@cadena VARCHAR(1000),@indice INTEGER)
RETURNS VARCHAR(50) AS
BEGIN
declare @posicion int
declare @valor varchar(100)
declare @contador integer
set @contador = 0
set @cadena = @cadena + ','
while patindex('%,%' , @cadena) <> 0
begin
set @posicion = patindex('%,%' , @cadena)
set @valor = left(@cadena, @posicion - 1)
if @contador = @indice
return @valor
set @cadena = stuff(@cadena, 1, @posicion, '')
set @contador = @contador + 1
end
return 'error'
END

GO
CREATE PROCEDURE SP_registrar_venta
@idCliente INTEGER, @idVendedor INTEGER, @id_productos VARCHAR(100),
@cantidad_productos varchar(100),
@numeroProductos INTEGER
AS
BEGIN
-- VARIABLES
declare @estado varchar(10) -- A Activo, N No Activo
declare @saldo money
declare @contProductos integer
declare @idProducto integer
declare @importeTotal money
declare @cantidadProducto integer
declare @precioTemp money
declare @stockProducto integer
declare @idVenta integer
declare @idDocumentoVenta integer
set @cantidadProducto = 0
set @importeTotal = 0
set @contProductos = 0
SELECT @estado = C.estado, @saldo = C.saldo FROM CLIENTE AS C WHERE
C.cliente_id = @idCliente

-- VERIFICACION DE ESTADO
if @estado = 'N'
begin
RAISERROR('El cliente no esta activo',16,16)
return
end

while @contProductos < @numeroProductos


begin
set @idProducto =
CONVERT(integer,dbo.indexOf(@id_Productos,@contProductos))
set @cantidadProducto =
CONVERT(integer,dbo.indexOf(@cantidad_productos,@contProductos))
SELECT @precioTemp = P.precio, @stockProducto = P.stock FROM
PRODUCTO AS P WHERE P.producto_id = @idProducto

-- VERIFICACION DE IMPORTE TOTAL


set @importeTotal = @importeTotal + @cantidadProducto*
@precioTemp
if @saldo < @importeTotal
begin
raiserror('No tiene saldo suficiente',16,16)
return
end

--VERIFICACION DE STOCK
if @cantidadProducto > @stockProducto
begin
raiserror('No esiste stock suficiente para el producto',16,16)
return
end

set @contProductos = @contProductos + 1


end
begin try
INSERT INTO VENTA(cliente_id,vendedor_id)
VALUES(@idCliente,@idVendedor)
set @idVenta = @@IDENTITY
INSERT INTO DOCUMENTO_VENTA(venta_id,tipo)
VALUES(@idVenta,'Factura')
set @idDocumentoVenta = @@IDENTITY

set @contProductos = 0
while @contProductos < @numeroProductos
begin
set @idProducto =
CONVERT(integer,dbo.indexOf(@id_Productos,@contProductos))
set @cantidadProducto =
CONVERT(integer,dbo.indexOf(@cantidad_productos,@contProductos))
SELECT @precioTemp = P.precio, @stockProducto = P.stock
FROM PRODUCTO AS P WHERE P.producto_id = @idProducto
INSERT INTO
DETALLE_DOCUMENTO(documento_id,producto_id,stock_actual,sock_anterior,cantidad_vend
ida)

VALUES(@idDocumentoVenta,@idProducto,@stockProducto -
@cantidadProducto,@stockProducto,@cantidadProducto)
UPDATE PRODUCTO SET stock = @stockProducto -
@cantidadProducto WHERE producto_id = @idProducto

set @contProductos = @contProductos + 1


end

INSERT INTO COMISION(vendedor_id,cantidad)


VALUES(@idVendedor,0.01*@importeTotal)
end try
begin catch
RAISERROR('ERROR DE TRANSACCION',16,16)
end catch

END
--Prueba
GO
USE BD_Examen_I
GO
--DELETE CLIENTE
--DELETE VENDEDOR
--DELETE PRODUCTO
--INSERT INTO CLIENTE(estado,saldo) VALUES('A',100),('N',100),('A',0)
--INSERT INTO VENDEDOR(nombre) VALUES('Alex')
--INSERT INTO PRODUCTO(nombre,stock,precio)
VALUES('p04',10,13),('p05',15,10),('p6',6,15)

GO
EXEC SP_registrar_venta 1,1,'2,4,5','3,1,1',3

GO
SELECT * FROM CLIENTE
SELECT * FROM DOCUMENTO_VENTA
SELECT * FROM DETALLE_DOCUMENTO
SELECT * FROM PRODUCTO
SELECT * FROM COMISION

También podría gustarte