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