Anda di halaman 1dari 19

--Funciones Escalares

--Funcion Recursiva para determinar si un numero entero es COMPLETO


--Un Numero es completo si es igual a la suma de sus digitos mas la suma de
-- desde 1 has cada uno de sus digitos
-- Ejemplo: 36=(3+6)+(1+2+3)+(1+2+3+4+5+6)
-- 25=(2+5)+(1+2)+(1+2+3+4+50)
use master
go
if OBJECT_ID('dbo.fnNumeroCompleto','FN') is not null
drop function dbo.fnNumeroCompleto
go
create function dbo.fnNumeroCompleto(@numero1 int, @numero2 int, @suma int,
@indice int)
returns int
as
begin
declare @EsCompleto int
if @numero1=0
set @EsCompleto=@suma
else
begin
if @numero1<@indice
begin
set @indice=0
set
@EsCompleto=dbo.fnNumeroCompleto(@numero2 % 10, @numero2/10,@suma + @numero1,0)
end
else
set
@EsCompleto=dbo.fnNumeroCompleto(@numero1,@numero2,@suma+@indice,@indice+1)
end
return (@EsCompleto)

end
go
--Ejecucion de la funcion
use master
go
declare @numero int, @resultado int
set @numero = 30
set @resultado=dbo.fnNumeroCompleto(@numero%10,@numero/10,0,0)
select @numero as Numero,
Mensaje=case @resultado
when @numero then 'Si es completo'
else 'NO es completo'
end,
@resultado as 'Resultado calculado'
go

--TAREA:
-- Escriba un scrip para listar los numero completos menores a 250

declare @numeroFinal int , @contador int
set @numeroFinal=250
set @contador=0

use master
go
if OBJECT_ID('dbo.fnNumeroCompletoMenores','FN') is not null
drop function dbo.fnNumeroCompletoMenores
go

create function dbo.fnNumeroCompletoMenores(@numeroFinal int, @contador int)
as
begin
declare @resul int
if @contador<@numeroFinal then
begin

@resul=dbo.fnNumeroCompleto(@contador%10,@contador/10,0,0)
if @contador=@resul then
begin
SELECT @contador as Numero,
'Es Completo' as Respuesta

dbo.fnNumeroCompletoMenores(@numeroFinal,@contador+1)
end
else

dbo.fnNumeroCompletoMenores(@numeroFinal,@contador+1)

end
else
SELECT 'Operacion Terminada' as Numero, 'Jeje' as Respuesta
end


--Funciones de tabla de multiples sentencias
use AdventureWorks2012
go
if OBJECT_ID('HumanResources.fnEmpleados','FN') is not null
drop function HumanResources.fnEmpleados
go
create function HumanResources.fnEmpleados(@formato varchar(100))
retunrs @TablaEmpleados
table (EmployeeID int primary key, Categoria varchar(100))
AS
BEGIN
IF (@formato='corto')
insert @TablaEmpleados
select EmployeeID,ContactID
FROM HumanResources.Employee
else if(@formato='larog')
insert @TablaEmpleados
select EmployeeID, LoginID
from HumanResources.Employee
return
end
go

if OBJECT_ID('HumanResources.fnEmpleados','FN') is not null
drop function HumanResources.fnEmpleados
go
create function HumanResources.fnEmpleados(@formato varchar(100))
retunrs @TablaEmpleados
table (EmployeeID int primary key, Categoria varchar(100))
AS
BEGIN
IF (@formato='corto')
insert @TablaEmpleados
select EmployeeID,ContactID
FROM HumanResources.Employee
else if(@formato='larog')
insert @TablaEmpleados
select EmployeeID, LoginID
from HumanResources.Employee
return
end
go


SENTENCIAS
select ProductID as [Cdigo de Producto],
ProductName as Producto,
UnitPrice as [Precio Unitario]
from Products
WHERE UnitPrice between 25.00 and 32.50
order by UnitPrice
go
-- ***
select TerritoryID as [Cdigo de Territorio],
TerritoryDescription as Territorio,
R.RegionDescription as Region
from Territories T
inner join Region R
on T.RegionID=R.RegionID
where TerritoryDescription between 'bos' and 'edi'
order by TerritoryDescription
go
-- ***
set dateformat dmy
go
select O.OrderID as 'Nmero de Orden',
O.OrderDate as Fecha,
E.FirstName+' '+E.LastName as Empleado
from Orders O
inner join Employees E
on O.EmployeeID=e.EmployeeID
WHERE OrderDate BETWEEN '10/07/1996' AND '23/07/1996'
ORDER BY OrderDate
-- variables locales
DECLARE @Nombre varchar(50)
set @Nombre='www.rpp.com.pe'
print @Nombre
go

DECLARE @categoria varchar(30)
SET @categoria='Beverages'
SELECT CategoryID,CategoryName
from Categories
where CategoryName=@categoria
go
-- VARIABLES GLOBALES
-- Son predefinidas y mantenidas por SQL
-- Ejemplo: Mostrar el Nmero de Filas
-- seleccionadas por una clusula SELECT
SELECT CategoryID,CategoryName
from Categories
where left(CategoryName,2)='co'
select @@ROWCOUNT

DECLARE @Apellidos varchar(50)
set @Apellidos=(select LastName FROM Employees WHERE EmployeeID=4)
PRINT @Apellidos
go

DECLARE @Nombre varchar(50), @Apellidos varchar(50)
DECLARE CDATOS CURSOR
for
Select FirstName, LastName From Employees
OPEN CDATOS
FETCH CDATOS INTO @Nombre, @Apellidos
While (@@FETCH_STATUS = 0)
Begin
Print 'Nombre: ' + @Nombre
Print 'Apellidos: ' + @Apellidos
Print ' '
FETCH CDATOS INTO @Nombre, @Apellidos
End
CLOSE CDATOS
DEALLOCATE CDATOS

--CURSORES
USE AdventureWorks2012
GO
declare ProductoClaseL CURSOR
FOR SELECT PP.Name, PP.SafetyStockLevel
FROM Production.Product PP
WHERE PP.Class='L'

OPEN ProductoClaseL
--EJECUTA EL CURSOR
FETCH NEXT FROM ProductoClaseL
INTO @Producto,@Existencias
CLOSE ProductoClaseL --CIERRA EL CURSOS
DEALLOCATE ProductoClaseL--LIBERA MEMORY

--consultas avanzadas
use AdventureWorks2012
go
-- Las tablas derivadas se crean al utilizar una sub consulta en vez de una
tabla
-- dentro de la clusula FROM.
SELECT Columna.SalesOrderID as 'N Orden', Columna.CustomerID as Cliente
FROM (SELECT SalesOrderID, CustomerID FROM Sales.SalesOrderHeader ) AS Columna
go



-- En este caso, la sub consulta debe producir un valor escalar o
-- una lista de valores de una sola columna.
SELECT Name as Nombre,
ListPrice as 'Precio en Lista',
(Select AVG(ListPrice)
From Production.Product) AS Promedio,
ListPrice - (select AVG(ListPrice)
from Production.Product ) AS Diferencia
FROM Production.Product WHERE ProductLine ='T'
GO
SELECT * FROM Production.Product WHERE ProductLine ='T'
--SUB CONSULTA CORRELACIONADA
--Es una combinacin entre la sub consulta ejecutada dinmicamente y la
-- fila de la consulta externa.
-- Ejemplo Listar los clientes que han pedido ms de 3 unidades del producto
777.
SELECT SalesOrderID as 'Orden de Venta',
CustomerID as Cliente
FROM Sales.SalesOrderHeader as Orden
where 3 < (SELECT OrderQty
from Sales.SalesOrderDetail as OD
where Orden.SalesOrderID=OD.SalesOrderID and
OD.ProductID =777)

SELECT * FROM Sales.SalesOrderDetail AS OD WHERE OD.ProductID=777




--SUB CONSULTA CORRELACIONADA
-- Listar los productos y el pedido mayor realizado hasta la fecha de cada
-- producto de la tabla SalesOrderDetails.
SELECT distinct OD1.ProductID AS Prducto,
PP.Name,
OrderQty as Cantidad
from Sales.SalesOrderDetail as OD1 inner join Production.Product
PP ON OD1.ProductID=PP.ProductID
WHERE OrderQty = (SELECT MAX(OrderQty)
FROM Sales.SalesOrderDetail AS OD2
WHERE OD1.ProductID = OD2.ProductID )
go

SELECT * FROM Sales.SalesOrderDetail AS OD1


-- COMBIBACION INTERNAS
-- (INNER JOIN)
--Son aquellas en donde los valores de las columnas que se combinan
--se comparan mediante un operador de comparacin.
-- eJEMPLO: Mostrar los nombres de los productos y de las categorias

SELECT P.Name as Producto,
C.Name AS Categora
FROM Production.Product P
inner join Production.ProductCategory C
on P.ProductID = C.ProductCategoryID
go
--COMBINACIONES EXTERNAS
-- (LEFT OUTER JOIN)
--Incluye en el resultado todas las combinaciones de la tabla izquierda, an
cuando no exista
-- en la tabla de la derecha un valor que coincida con la clave.
-- Ejemplo: Mostrar todos los productos, an si no se ha hecho una revisin para
ellos.
SELECT P.Name as Producto,
PR.ProductReviewID as 'Producto Revisado'
FROM Production.Product P left outer join Production.ProductReview PR
ON P.ProductID=PR.ProductID
go
--(Right outer join)
-- Indica que todas las filas de la segunda tabla se deben incluir en los
resultados,
-- an si no hay datos coincidentes en la primera tabla.
-- Ejemplo:Mostrar todos los vendedores, an si no pertenecen a un territorio.
SELECT ST.Name AS Territorio,
SP.BusinessEntityID as Vendedor
FROM Sales.SalesTerritory ST
right outer join Sales.SalesPerson SP
ON ST.TerritoryID = SP.TerritoryID
go
--(FULL OUTER JOIN)
-- FULL OUTER JOIN, incluye todas las filas de ambas tablas,
-- an si la otra tabla tenga o no un valor coincidente
--Ejemplo: Mostrar todos los productos, an si
-- no tienen pedidos de venta y pedidos, an si no tienen productos.

Select P.Name as Producto,
OD.SalesOrderID AS Orden
from Production.Product P
full outer join Sales.SalesOrderDetail OD
on P.ProductID=OD.ProductID
WHERE P.ProductID is null
or OD.ProductID is null
order by P.Name
GO

--Conbiaciones Cruzadas
use AdventureWorks2012
go
--Genera el producto cartesiano
-- de las tablas involucradas en la combinacin
--El producto cartesiano obtiene todas las posibles concatenaciones
-- de filas de la primera tabla con filas de la segunda tabla.
select P.BusinessEntityID as Vendedor,
ST.Name as Territorio
from Sales.SalesPerson P
cross join Sales.SalesTerritory ST
go
-- conbinaciones de resultados
-- operador UNION
USE AdventureWorks2012
GO
select PC.Name
from Person.ContactType PC
UNION
SELECT PCR.Name
FROM Person.CountryRegion PCR
-- SP: para Controlar Usuarios
use BDREUNIONES
go
create procedure ListadoReuniones
(
@ReunionID int
)
AS
Begin
select R.*,
C.descripcion as Descripcion,
RTRIM(U.Nombre)+' '+U.Apellido as Usuario
from Reuniones R
inner join Caracteristicas C
on R.CaracteristicaID=C.CaracteristicaID
inner join Usuarios U
on R.UsuarioID=U.UsuarioID
where R.ReunionID=@ReunionID
End
go
--RTRIM: Devuelve una cadena de caracteres despus de
-- truncar todos los espacios en blanco finales

EJERCICIOS DESARROLLADOS DE SELECT
--caso 1
--Lista de Empleados que ordenaron productos
--en el mes de enero o febrero del ao 1997.
SELECT distinct(E.FirstName+''+E.LastName) as Nombre
from Employees E
inner join Orders O
on E.EmployeeID=O.EmployeeID
WHERE YEAR(O.OrderDate)=1997
AND (MONTH(O.OrderDate)=1 OR MONTH(O.OrderDate)=2)
ORDER BY E.FirstName+''+E.LastName
--caso 2
--Listar los productos que no pertenecen
-- a la categoria Beverages o Condiments.
SELECT P.ProductID AS Codigo,
P.ProductName as Producto
FROM Products P
inner join Categories C
on P.CategoryID=C.CategoryID
where NOT (C.CategoryName='Beverage' or
C.CategoryName='Condiments')
-- caso 3
-- Listar los productos que pertenecen a las categorias
-- Beverages o Condiments o Confections.
select P.ProductID as Producto, P.ProductName as Producto,
C.CategoryName as Categoria
from Products P
INNER JOIN Categories C
ON P.CategoryID=C.CategoryID
where C.CategoryName in ('Beverages','Condiments','Confections')
--where (C.CategoryName='Beverages' or C.CategoryName='Condiments'
--or C.CategoryName='Confections')

--Caso 4
-- Mostrar los nombres de los productos que
-- son de la categora 'Condiments'.
select * from Categories
--***
select P.ProductID, P.ProductName as Nombre
from Products P
where P.CategoryID=
(select distinct C.CategoryID
from Categories C
where C.CategoryName='Condiments')


--Funcin para generar identificador de usuario
use BDREUNIONES
go
if OBJECT_ID('dbo.GenerarUsuario','FN') is not null
drop function dbo.GenerarUsuario
go
create function GenerarUsuario (@Hoy datetime)
returns char(10)
AS
BEGIN
declare @NuevoID char(10)
declare @Cuenta integer
declare @Existe bit
declare @Prefijo char(08)
set @Cuenta=1
set @Existe=1
set @Prefijo=Convert(varchar(04),datepart(yyyy,@hoy))+

Right('00'+Convert(varchar(02),datepart(mm,@Hoy)),2)+

RIGHT('00'+Convert(varchar(02),datepart(dd,@Hoy)),2)
--005
declare cursor_ID CURSOR for
select UsuarioID FROM Usuarios
where UsuarioID like @Prefijo+'%'
--2014051601
--2014051602
open cursor_ID
while(@Existe=1)
Begin
FETCH NEXT from cursor_ID into @NuevoID

if(@NuevoID=@Prefijo+RIGHT('0'+Convert(varchar(2),@Cuenta),2))
set @Cuenta=@Cuenta+1
else
Begin
set @Existe=0
set
@NuevoID=@Prefijo+RIGHT('0'+Convert(varchar(02),@cuenta),2)
end
end
close cursor_ID
deallocate cursor_ID
return @NuevoID
END
GO
--Right :Devuelve la parte derecha de una cadena de caracteres
-- con el nmero de caracteres especificado.
select RIGHT('010'+'05',4)

--- ***LEFT JOIN
SELECT C.CustomerID,c.FirstName,C.LastName,
O.OrderDate,O.OrderAmount ,
R.RefundDate,R.RefundAmount
FROM CUSTOMERS C
LEFT JOIN ORDERS O ON C.CustomerID=O.CustomerID
LEFT JOIN REFUNDS R ON O.OrderID=R.OrderID
--WHERE O.CustomerID IS NOT NULL AND R.RefundID IS NULL
ORDER BY C.CustomerID,O.OrderID,R.RefundID
-- *** RIGHT JOIN
SELECT C.CustomerID,c.FirstName,C.LastName,
O.OrderDate,O.OrderAmount ,
R.RefundDate,R.RefundAmount
FROM REFUNDS R
RIGHT JOIN ORDERS O ON R.OrderID=O.OrderID
RIGHT JOIN CUSTOMERS C ON O.CustomerID=C.CustomerID
ORDER BY C.CustomerID,O.OrderID,R.RefundID
---
SELECT C.CustomerID,c.FirstName,C.LastName,
O.OrderDate,O.OrderAmount ,
R.RefundDate,R.RefundAmount
FROM CUSTOMERS C
LEFT JOIN (REFUNDS R
RIGHT JOIN ORDERS O ON O.OrderID=R.OrderID)
ON C.CustomerID=O.CustomerID

-- Creacion de tabla Personas con los datos de Sales.SalesPerson
use AdventureWorks2012
go
select *
into Personas
from Sales.SalesPerson
go
select * from Personas
-- Creacion de la Tabal MisRegistrosElimandos
create table MisRegistrosEliminados
(
MiFechayHora datetime,
MisRegistros int
)
go
--Triger para llevar la cuenta de fecha y hora, ms numero de
-- de registros eliminados.
create trigger tgr_MisEliminados
on Personas
for delete
as
insert into MisRegistrosEliminados values(getDate(),@@ROWCOUNT)
return
go


--BDvENTAS
create database BDVentas
use BDVentas
-- ***
create table CLIENTES
(
ClienteID int identity(1, 1) not null,
Nombre varchar(50),
Email varchar(30)
)on [primary]
go
alter table CLIENTES
With nocheck ADD
constraint [PK_Clientes]
primary key clustered
(
ClienteID
)on [primary]
go
--
create table VENDEDORES
(
VendedorID int identity(1, 1) not null,
Nombre varchar(50),
Comision decimal(6, 2)
)on [primary]
go
alter table VENDEDORES
With nocheck ADD
constraint [PK_Vendedores]
primary key clustered
(
VendedorID
)on [primary]
go
-- **
create table PRODUCTOS
(
ProductoID int identity(1, 1) not null,
Descripcion varchar(50),
Medida varchar(30),
PrecioUnitario money not null,
Stock int
)on [primary]
go
alter table PRODUCTOS
With nocheck ADD
constraint [PK_Productos]
primary key clustered
(
ProductoID
)on [primary]
Go

create table PEDIDOS
(
PedidoID int identity(1, 1) not null,
ClienteID int not null foreign key references CLIENTES(ClienteID),
VendedorID int not null foreign key references
VENDEDORES(VendedorID) ,
Fecha datetime
)on [primary]
go
alter table PEDIDOS
With nocheck ADD
constraint [PK_Pedidos]
primary key clustered
(
PedidoID
)on [primary]
go
--
create table [DETALLE DE PEDIDOS]
(
PedidoID int not null foreign key references PEDIDOS(PedidoID),
ProductoID int not null foreign key references
PRODUCTOS(ProductoID),
Cantidad int not null,
PrecioUnitario money
)on [primary]
go
alter table [DETALLE DE PEDIDOS]
With nocheck ADD
constraint [PK_DetallePedidos]
primary key clustered
(
PedidoID,
ProductoID
)on [primary]
go

SELECT * FROM VEHICULOS
SELECT VEH_placa as Placa, 'Carga en kilos'=VHE_carga_max*1000 from VEHICULOS
SELECT * FROM PROPIETARIOS

SELECT P.PRO_expediente FROM PROPIETARIOS P WHERE P.PRO_procedencia='TRUJILLO'
AND P.PRO_estado_civil='C'

SELECT P.PRO_expediente AS 'N Expediente',
P.PRO_nombres+' '+P.PRO_apellidos as 'Nombre Completo'
FROM PROPIETARIOS P
WHERE P.PRO_procedencia='TRUJILLO'
ORDER BY P.PRO_apellidos DESC
-- Obtener todas las parejas de nmeros de expedientes
-- de los propietarios y la ciudad de procedencia; tales
-- que ellos sean de la misma ciudad d procedencia

SELECT P1.PRO_expediente,P2.PRO_expediente, P1.PRO_procedencia
FROM PROPIETARIOS P1, PROPIETARIOS P2
WHERE P1.PRO_procedencia=P2.PRO_procedencia and
P1.PRO_expediente<P2.PRO_expediente

select count(*) from propietarios

select count (distinct PRO_expediente) from CONTRATOS

select count(*) FROM PROPIETARIOS WHERE PRO_estado_civil='C'

select sum(VHE_carga_max*1000) from vehiculos
where VEH_procedencia='PIURA'

--uso de group by
-- numero de expediente de cada propietario y la cantidad de vehiculos
alquilados
SELECT P.PRO_expediente, 'N Vehculos'=COUNT(C.PRO_expediente)
FROM PROPIETARIOs P, CONTRATOS C
WHERE P.PRO_expediente=C.PRO_expediente
group by P.PRO_expediente
--uso de having
select VEH_placa from CONTRATOS
group by VEH_placa
having count(*)>1
-- caracteristicas avanzadas
select PRO_apellidos+' '+PRO_nombres as 'Nombre Completo'from PROPIETARIOS WHERE
PRO_apellidos like 'R%'

select 'Nombre Completo'=PRO_nombres+' '+PRO_apellidos
from PROPIETARIOS
WHERE PRO_expediente IN (SELECT PRO_expediente from CONTRATOS)

SELECT distinct(PRO_nombres+' '+PRO_apellidos) as 'Nombre Completo'
FROM PROPIETARIOS P
INNER JOIN CONTRATOS C
ON P.PRO_expediente=C.PRO_expediente

SELECT 'Nombre Completo'=PRO_nombres+' '+PRO_apellidos
FROM PROPIETARIOS
WHERE PRO_expediente IN
(
SELECT PRO_expediente
from CONTRATOS
WHERE VEH_placa in
(SELECT VEH_placa from VEHICULOS
WHERE VEH_marca='TOYOTA')
)


SELECT VEH_placa
from VEHICULOS
WHERE VHE_carga_max > (select max(VHE_carga_max)*0.75 from vehiculos)

SELECT PRO_expediente
FROM PROPIETARIOS
WHERE PRO_estado_civil='C'
UNION
SELECT PRO_expediente
FROM CONTRATOS
WHERE year(CON_fecha_termino)=year(getdate())

TRIGGER INSERTAR PRESTAMOS

alter trigger InsertarPrestamos
on MOVE_LIBROS
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @estadoLector char(01)
DECLARE @disponibilidad char(01)

SELECT @estadoLector=(SELECT LEC_estado from LECTORES L
INNER JOIN inserted i on
L.LEC_dni=i.LEC_dni)

SELECT @disponibilidad =(SELECT EJE_estado from EJEMPLARES E
inner join inserted IJ on
E.EJE_numero = IJ.EJE_numero WHERE E.LIB_codigo=IJ.LIB_codigo)

if @disponibilidad = '1' and @estadoLector ='4'
begin
UPDATE EJEMPLARES
SET EJE_disponibilidad='2'
FROM EJEMPLARES E
inner join MOVE_LIBROS M
ON E.EJE_numero=M.EJE_numero WHERE
E.LIB_codigo=M.LIB_codigo
UPDATE LECTORES
SET LEC_estado='3'
FROM LECTORES L inner join
MOVE_LIBROS M
ON L.LEC_dni=M.LEC_dni
end
else
begin
if @disponibilidad='2'
BEGIN
RAISERROR('El libro esta prestado',10,1)
ROLLBACK TRANSACTION
END
if @estadoLector='1'
BEGIN
RAISERROR('El lector tiene libro prestado
fuera de la fecha',10,1)
ROLLBACK TRANSACTION
END
if @estadoLector ='2'
BEGIN
RAISERROR('El lector esta
castigado',10,1)
ROLLBACK TRANSACTION
END
if @estadoLector='3'
BEGIN
RAISERROR('El lector tiene un libro
prestado',10,1)
ROLLBACK TRANSACTION
END
end
end
GO

TRIGGER PARA DEVOLUCIONES
alter trigger devolucionPrestamos
ON MOVE_LIBROS
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @estadoLibro char(01)
DECLARE @fechaDevuelto datetime
DECLARE @fechaDevolver datetime

select @estadoLibro = (select MOV_estadolibro
from inserted )
select @fechaDevuelto = (select MOV_fechadevuelto
from inserted )
select @fechaDevolver =(select MOV_fechadevolver
from inserted)
if (@estadoLibro = '1')
BEGIN
UPDATE EJEMPLARES
SET EJE_disponibilidad = '1'
from inserted I
INNER JOIN EJEMPLARES E
on E.LIB_codigo =I.LIB_codigo
and E.EJE_numero=I.EJE_numero

IF (@fechaDevuelto <= @fechaDevolver )
BEGIN
UPDATE LECTORES
SET LEC_estado='4' -- Habilitado
FROM inserted I
inner join LECTORES L
on I.LEC_dni=L.LEC_dni
END
ELSE
BEGIN
UPDATE LECTORES
SET LEC_estado='1'
from inserted I
inner join LECTORES L
on I.LEC_dni=L.LEC_dni
END
END
else
BEGIN
ROLLBACK TRANSACTION
RAISERROR ('Libro en mal estado',10,1)

END
END
Go
TRIGGER CALCULAR COMISIONES
use BDVentas
create trigger CalcularComisiones
on [DETALLE DE PEDIDOS]
for insert
as
Begin
declare @Cantidad int
select @Cantidad=Cantidad from inserted
declare @Stock int
select @Stock=Stock from PRODUCTOS P
inner join inserted i
on P.ProductoID=i.ProductoID
if @Cantidad<=@Stock
Begin
-- Actualizar Stock
UPDATE PRODUCTOS
SET Stock=Stock-@Cantidad
from PRODUCTOS PP
inner join inserted i
on PP.ProductoID=i.ProductoID
-- Calcular la comisin del Vendedor
UPDATE VENDEDORES
SET
Comision=Comision+0.5/100*(@Cantidad*i.PrecioUnitario)
FROM VENDEDORES V
inner join PEDIDOS PE
on V.VendedorID=PE.VendedorID
inner join inserted i
on PE.PedidoID=i.PedidoID
END
else
Begin
Raiserror('Error-Stock insuficiente',16,2)
rollback transaction
End
END


use BDSERVICIOS
go
if OBJECT_ID('dbo.FnFibonacci','FN') is not null
drop function dbo.FnFibonacci
go
create function dbo.FnFibonacci(@Numero int)
returns int
Begin
declare @Fib int
if @Numero=1 or @Numero=2
set @Fib=1
else
set @Fib=dbo.FnFibonacci(@Numero-1)+dbo.FnFibonacci(@Numero-2)
return (@Fib)
END
go
--Prueba function Fnfibonacci para @numero =6
use BDSERVICIOS
go
declare @numero int
set @numero=6
select @Numero as Numero, dbo.FnFibonacci(@Numero) as 'Valor de Fibonacci'
go
--Creacin del Trigger CrearUsuarios
use BDSERVICIOS
create trigger CrearUsuarios
on EMPLEADOS
for insert
as
begin
declare @EmpleadoID int
declare @ApellidoPat varchar(30)
declare @ApellidoMat varchar(30)
declare @Nombre varchar(30)
-- Obtener los datos que se insertaran
select @EmpleadoID=EmpleadoID,
@ApellidoPat=ApellidoPat,
@ApellidoMat=ApellidoMat
from inserted
declare @Ulogin varchar(20)
set @Ulogin=SUBSTRING(@ApellidoPat,1,1)+
SUBSTRING(@ApellidoMat,1,1)+@Nombre
declare @tamao int
set @tamao=LEN(@Ulogin)
declare @contrasea varchar(08)
set @contrasea=dbo.FnFibonacci(@tamao)
--insertar el nuevo usuario
insert into USUARIOS(UsuarioID,ULogin,Contrasea)
values(@EmpleadoID,@Ulogin,@contrasea)
end
go
select * from empleados
insert into EMPLEADOS(ApellidoPat,ApellidoMat,Nombre,DNI)
VALUES('gonzales','gavidia','l','70504152')


create trigger ControlAlquiler
on DETALLE_ALQUILER
for insert
as
BEGIN
declare @Disponiblidad varchar(20)
select @Disponiblidad=V.VEH_estado from
VEHICULOS V
inner join inserted i
on i.VEH_codigo=V.VEH_codigo
if @Disponiblidad='Disponible'
BEGIN
UPDATE VEHICULOS
SET VEH_estado='Alquilado'
FROM VEHICULOS VE
inner join inserted j
on VE.VEH_codigo=j.VEH_codigo

UPDATE DETALLE_ALQUILER
SET
DET_importe=DA.DET_km_contratado*DA.DET_precio_km,

DET_fechaDevolucion=DATEADD(dd,DA.DET_num_dias,A.ALQ_fecha)
FROM ALQUILER A
inner join DETALLE_ALQUILER DA
on A.ALQ_codigo=DA.ALQ_codigo
inner join inserted e
on DA.VEH_codigo=e.VEH_codigo
where DA.ALQ_codigo=e.ALQ_codigo

UPDATE DETALLE_ALQUILER
SET DET_monto_garantia=0.2*D.DET_importe
FROM DETALLE_ALQUILER D
inner join inserted t
on D.VEH_codigo=t.VEH_codigo
where D.ALQ_codigo=t.ALQ_codigo

END
else
Begin
Raiserror('Error-El vehiculo esta alquilado',16,2)
rollback transaction
End
END

--SELECT DATEADD(dd,2,getDate())


use CONTMATRICULAS
create trigger ControlDetalleMatriculas
on DET_MATRICULAS
for insert
as
Begin
declare @CuposLibres int
select @CuposLibres=CP.SEC_nro_cupos_libres
from inserted i
inner join SECCIONES_PROGRAMADAS CP
ON i.SEC_numero=CP.SEC_numero
WHERE i.CUR_codigo=CP.CUR_codigo

if @CuposLibres > 0
BEGIN
UPDATE SECCIONES_PROGRAMADAS
SET SEC_nro_cupos_libres=SEC_nro_cupos_libres-1
FROM SECCIONES_PROGRAMADAS SP
inner join inserted j
on SP.SEC_numero=j.SEC_numero
WHERE SP.CUR_codigo=j.CUR_codigo

UPDATE DET_MATRICULAS
SET DET_vac_ocupada=S.SEC_total_vacantes-
S.SEC_nro_cupos_libres
FROM SECCIONES_PROGRAMADAS S
inner join inserted e
on S.SEC_numero=e.SEC_numero
where S.CUR_codigo=e.[CUR_codigo]
END
else
Begin
Raiserror('Error-Numero de Cupos Libres
completos',16,2)
rollback transaction
End
end
go

Anda mungkin juga menyukai