UNIVERSIDAD NACIONAL DE TRUJILLO
ESCUELA DE INGENIERÍA DE SISTEMAS
PRÁCTICA CALIFICADA N° 01
BASE DE DATOS AVANZADAS
DOCENTE: Dr. Luis Boy ChavilEN UN SISTEMA DE VENTAS DE PRODUCTOS FARMACÉUTICOS SEREQUIERE: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.
SOLUCIÓN:
1. MODELADO
2. CREAR TABLAS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | create database BDVentas use BDVentas; go create table CLIENTE( CLI_codigo int primary key identity(1,1), CLI_nombres varchar(50), CLI_apellidos varchar(50), ClI_saldo money, ClI_estado char(1) not null ) create table VENDEDOR( VEN_codigo int primary key identity(1,1), VEN_nombres varchar(50) not null, VEN_apellidos varchar(50) not null, VEN_comision money ) create table PEDIDO( PED_codigo int primary key identity(1,1), VEN_codigo int references VENDEDOR(VEN_codigo), CLI_codigo int references CLIENTE(CLI_codigo), PED_fecha date ) create table FACTURA( FAC_codigo int primary key identity(1,1), PED_codigo int references PEDIDO(PED_codigo), FAC_fecha date, FAC_total money not null ) create table PRODUCTO( PRO_codigo int primary key identity(1,1), PRO_precio money ) create table STOCK( STO_codigo int primary key identity(1,1), PRO_codigo int references PRODUCTO(PRO_codigo), STO_actual int not null, STO_anterior int not null ) create table DETALLE_FACTURA( FAC_codigo int references FACTURA(FAC_codigo), PRO_codigo int references PRODUCTO(PRO_codigo), cantidad int not null ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | create trigger tgdetalleFactura on DETALLE_FACTURA for insert as begin declare @CLI_estado char(1), @CLI_codigo int, @CLI_saldo money, @VEN_codigo int, @FAC_codigo int, @PRO_codigo int, @cantidadProducto int, @STO_actual int, @PRO_precio money select @FAC_codigo=i.FAC_codigo, @PRO_codigo=i.PRO_codigo, @cantidadProducto=i.cantidad, @STO_actual=s.STO_actual, @PRO_precio=p.PRO_precio, @CLI_codigo=c.ClI_codigo, @CLI_estado=c.ClI_estado, @CLI_saldo=c.ClI_saldo, @VEN_codigo=v.VEN_codigo from inserted i inner join FACTURA f on f.FAC_codigo=i.FAC_codigo inner join PEDIDO pe on pe.PED_codigo=f.PED_codigo inner join VENDEDOR v on v.VEN_codigo=pe.VEN_codigo inner join CLIENTE c on c.CLI_codigo=pe.CLI_codigo inner join PRODUCTO p on p.PRO_codigo=i.PRO_codigo inner join STOCK s on s.PRO_codigo=p.PRO_codigo if @CLI_estado='v' and @CLI_saldo>=(@PRO_precio*@cantidadProducto) begin -- el stock del producto tiene que ser mayor a la cantidad del pedido if @cantidadProducto<=@STO_actual begin --insertar un nuevo stock insert into STOCK values(@PRO_codigo,(@STO_actual-@cantidadProducto),@STO_actual) -- actualizar el total de la factura update factura set FAC_total=FAC_total+(@PRO_precio*@cantidadProducto) where FAC_codigo=@FAC_codigo -- actualizar el saldo del cliente update CLIENTE set ClI_saldo=ClI_saldo-(@PRO_precio*@cantidadProducto) where CLI_codigo=@CLI_codigo -- actualizar la comision de vendedor update VENDEDOR set VEN_comision=VEN_comision+0.01*(@PRO_precio*@cantidadProducto) where VEN_codigo=@VEN_codigo end else begin raiserror ('stock insuficiente', 16, 2) rollback transaction end end else begin raiserror ('el cliente no tiene saldo o su estado es f', 16, 2) rollback transaction end end |
4. PRUEBA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | use BDVentas go insert into CLIENTE values ('Elson Roque','Caldas Dominguez',5000,'v'), ('Hector','Caldas Dominguez',0,'v'), ('Emerson','Caldas Lozano',2000,'f') insert into VENDEDOR values('Emerita','Caldas Pinedo',0) insert into PRODUCTO values(5),(10) insert into STOCK values(1,15,0),(2,0,0) insert into pedido values (1,1,GETDATE()),-- primer pedido (1,2,GETDATE()),-- segundo pedido (1,3,GETDATE())-- tercer pedido insert into factura values(1,GETDATE(),0), (2,GETDATE(),0), (3,GETDATE(),0) insert into detalle_factura values (2,1,1) |
0 Comment to "PROBLEMA DESARROLLADO EN SQL SERVER "
Publicar un comentario