PROBLEMA DESARROLLADO EN SQL SERVER


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 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.
  


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
)
3. CREAR TRIGGER


 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)

Compartir

0 Comment to "PROBLEMA DESARROLLADO EN SQL SERVER "

Publicar un comentario