Está en la página 1de 59

FACULTAD DE INGENIERIA, ARQUITECTURA

Y URBANISMO

INGENIERIA DE SISTEMAS

IMPLEMENTACIÓN DE BASE DE DATOS –


A

DISEÑO E IMPLEMENTACIÓN DE BASE DE


DATOS RELACIONAL

Autores:
DIANA KATHERINE GARCIA CHOZO

NICOLETTE ISIS PACHECO CONTRERAS

MIGUEL ANGEL MAQUEN MUJICA

MIRIAN ADINA CRUZ HERRERA

Docente:
DÍAZ VIDARTE, MIGUEL ORLANDO
RAZÓN SOCIAL DE LA ORGANIZACIÓN

Induamerica Chiclayo SAC

DESCRIPCION DE LA EMPRESA

Somos la empresa arrocera más


importante del Perú, poseemos
tres plantas industriales ubicadas
en Lambayeque, Rioja y Bellavista,
siendo esa última la más grande y
con tecnología de punta única en
el país. Contamos con certificación
HACCP que es la garantía de la
inocuidad de nuestros productos,
lo cual nos ha permitido ser los
mayores proveedores de todas las
cadenas de supermercados y
además incursionar en el mercado
externo con mucho éxito.

Contamos con un amplio portafolio de productos compuesto por reconocidas marcas en el


mercado tradicional y en el canal moderno donde ofrecemos productos embolsados en diferentes
formatos.

Induamerica es socio estratégico del agricultor nacional y también nos preocupamos por el
cuidado del medio ambiente, invirtiendo en tecnología que minimice la contaminación ambiental.

VISION

Ser la empresa arrocera líder en el Perú y en el mundo.

MISIÓN

Gestionamos la integración y mejora permanente de la cadena de valor del arroz, mediante


procesos eficientes, servicios y productos de calidad; generando valor para nuestros grupos de
interés
MODELO RELACIONAL DE LA BASE DE DATOS PROPUESTA (EN SQL SERVER)
DICCIONARIO DE DATOS

TABLAS
Columnas Definición
Asignacion Son las asignaciones de los empleados a los proyectos
Departamento Departamentos o áreas en que está organizada la empresa
Dependiente Personas que dependen de los empleados de la empresa
Distrito Distritos de las provincias de la región Lambayeque
Empleado Empleados de la empresa
Hora Horas desde las 7:00am hasta las 8:00pm, con intervalos de una
hora, y que son consideradas las horas en que pueden comenzar una
jornada de trabajo diaria dedicada a un proyecto
LineaHorario Los días y horas en que los integrantes se reúnen para trabajar en el
proyecto
Provincia Provincias de la región Lambayeque
Proyecto Proyectos que ha realizado o está realizando la empresa

Column(s) of “Asignacion” Table


Columna Tipo de Dato Null/Not Null PK FK Definición
Número de
seguro social del
nss_Emp char(9) NOT NULL Yes Yes empleado
asignado
Es el Número del
Número_ Pro smallint NOT NULL Yes Yes
proyecto asignado.
Horas semanales
que el empleado le
dedica al proyecto.
Un empleado no
debe exceder las 40
horasSem_ Asi decimal(4,2) NOT NULL No No
horas semanales de
dedicación a un
proyecto. Por
defecto es 20 horas.
Indica si el
empleado
asignado esjefe
del proyecto:

jefePro _Asi bit NOT NULL No No - Si esjefe tendrá


como valor UNO (1)
- Si no esjefe tendrá
como valor CERO (O)
Column(s) of "Departamento" Table

Columna Tipo de Dato Null/Not Null PK FK Definición

numero_Dep tinyint NOT NULL Yes No Número con que se


identifica el
departamento
Nombre_Dep char(l5) NOT NULL No No Nombre del departamento

nss_Emp char(9) NULL No Yes Número de seguro social del


empleado que es gerente del
departamento.

fechaini Ger_Dep smalldatetime NULL No No Fecha en que el empleado


empezó a gerenciar el
departamento ,

vigencia_Dep bit NOT NULL No No Vigencia del departamento.


Indica si está vigente (1) o no
vigente (O).

Column(s) of "Dependiente" Table

Columna Tipo de Dato Null/Not Null PK FK Definición

Número de seguro social que está a


nss_Emp char(9) NOT NULL Yes Yes cargo del Dependiente

Número de Dependiente en
numero_Depe tinyint NOT NULL Yes No función al empleado

nombres _ Depe varchar(50) NOT NULL No No Nombres del Dependiente


apellidoPat_ Dep varchar(50) NOT NULL No No Apellido paterno del dependiente
e
apellidoMat_ De varchar(50) NOT NULL No No Apellido materno del dependiente
pe
Sexo_ Deoe bit NOT NULL No No Sexo del dependiente

fechaNac_ Depe smalldatetime NOT NULL No No Fecha de nacimiento del dependiente


Relación de parentesco del
parentesco_ dependiente con el empleado que lo
char(1O) NOT NULL No No
Depe tiene a su cargo.

Column(s) of "Distrito" Table


Columna Tipo de Dato Null/Not Null PK FK Definición
codigo _Dis tinyint NOT NULL Yes No Codigo que identifica a un distrito
Nombre_ Dis char(30) NOT NULL No No Nombre del distrito

Código de la provincia donde está


Codigo_Prov tinyint NOT NULL No Yes ubicado el distrito

Column(s) of "Empleado" Table

Columna Tipo de Dato Null/Not Null PK FK Definición

Número de seguro social con


nss_Emp char(9) NOT NULL Yes No que se identifica al empleado

Nombres_Emp char(l5) NOT NULL No No Nombres del empleado


apellidoPat_ Em
char(l5) NOT NULL No No Apellido paterno del empleado
n
apellidoMat_ Em
char(l5) NOT NULL No No Apellido materno del empleado
p

Número del documento


dni_Emp char(8) NOT NULL No No nacional de identidad (DNI)

Fecha de nacimiento del empleado.


Debe ser mayor de 18 años y como
fechaNac_Emp smalldatetime NOT NULL No No máximo debe tener 65 años de edad.

Telefonos_ Emp char(6) NULL No No Número de los teléfonos del empleado

Direccion_ Emp varchar(50) NOT NULL No No Dirección del empleado

Sexo_Emp bit NOT NULL No No Sexo del empleado


Es el salario del empleado y debe ser
salario_Emp smallmoney NULL No No entre 800 y 8000 nuevos soles.

Fecha en que ingresó a trabajar a la


fechalng_Emp smalldatetime NOT NULL No No empresa el empleado

La situación laboral del empleado:


- Contratado (C)

situacion_Emp char(l) NOT NULL No No - Nombrado (N)

El estado actual del empleado, puede


ser:
- Activo (A)
estado_Emp char(l) NOT NULL No No - Cesante (C)

- Vacaciones (V)

Número del departamento donde


numero_Dep tinyint NULL No Yes trabaja el empleado

Número de seguro social del


nss_EmpS char(9) NULL No Yes empleado supervisor

codigo Dis tinyint NOT NULL No Yes Código del distrito donde vive el
empleado

Column(s) of "Hora" Table

Columna Tipo de Dato Null/Not Null PK FK Definición

Codigo_ Hor tinyint NOT NULL Yes No Código con que se identifica la hora

Nombre_ Hor char(5) NULL No No Nombre de la hora


Column(s) of "LineaHorario" Table
Columna Tipo de Dato Null/Not Null PK FK Definición

Código que identifica a una única fila


codigo_LiH integer IDENTITY Yes No de línea de horario

Es el número con que se identifica


un proyecto. Debe ser autogenerado
Numero_ Pro smallint NOT NULL No Yes por el mismo DBMS.

Hora de inicio en el día asignado para


codigo_Hor tinyint NOT NULL No Yes un proyecto.

Día en que los empleados asignados a


un proyecto deberán trabajar en ello.
dia _LiH char(2) NULL No No Solo se trabaja de lunes a viernes.
El número de horas a partir de la hora
de inicio en que los empleados
Horas_ LiH tinyint NULL No No asignados se tomaran para dedicarse
al proyecto.

Column(s) of "Provincia" Table

Columna Tipo de Dato Null/Not Null PK FK Definición

Codigo_ Prov tinyint NOT NULL Yes No Código que identifica a una provincia

Nombre_ Prov char(30) NOT NULL No No Nombre de la provincia


Column(s) of "Proyecto" Table
Columna Tipo de Dato Null/Not Null PK FK Definición

Es el número con que se identifica un


proyecto. Debe ser autogenerado por
Numero_ Pro smallint IDENTITY Yes No el mismo DBMS.

Nombre_ Pro varchar(50) NOT NULL No No Nombre del proyecto

Estado actual en que se encuentra


el proyecto y puede ser:
-Ejecución (E)
Estado_ Pro char(l) NOT NULL No No -Terminado (T)
-Suspendido (S)

Número del departamento que está cargo


numero_Dep tinyint NOT NULL No Yes del proyecto
presupuesto _Pro smallmoney NOT NULL No No Presupuesto estimado del proyecto
Fechalni_ Pro smalldatetime NOT NULL No No Fecha de inicio del proyecto
fechaFin_ Pro smalldatetime NOT NULL No No Fecha de finalización del proyecto

Código del distrito donde está ubicado


codigo_Dis tinyint NOT NULL No Yes el proyecto
PROCEDIMIENTOS ALMACENADOS

---------------------------------------------------------------------------------------------------

-- 1. Listar el nombre completo de los empleados

CREATE PROCEDURE pa_NombEmpleado

AS

BEGIN

SELECT apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

FROM Empleado

ORDER BY apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

END

execute pa_NombEmpleado

select*from Empleado

-----------------------------------------------------------------------------------------------------

--2. crear un procedimiento para mostrar la cantidad de empleados por año y mes de nacimiento

ALTER PROCEDURE pa_listarEmpleadosPorAñoMesDeNacimiento

AS

BEGIN
SET LANGUAGE Spanish;

SELECT datepart(yyyy,fechaNac_Emp) AS AÑO, DATENAME(mm,fechaNac_Emp) AS MES,

COUNT(*) AS EMPLEADOS

FROM Empleado

GROUP BY DATEPART(yyyy,fechaNac_Emp),DATENAME (mm,fechaNac_Emp)

ORDER BY año, mes

END

EXECUTE pa_listarEmpleadosPorAñoMesDeNacimiento

select*from Empleado

--------------------------------------------------------------------------------------------------------

--3. Modificar el procedimiento anterior considerando el año de nacimiento

alter procedure pa_listarEmpleadosAñoMesDeNacimiento

as

begin

select datepart (yyyy, fechaNac_Emp) as AÑO,

count(*)as Empleados

from Empleado

group by datepart(yyyy, fechaNac_Emp)

order by Año

end

execute pa_listarEmpleadosAñoMesDeNacimiento

--------------------------------------------------------------------------------------------------------
--4. Listar número de departamento en específico 5 de finanzas

create procedure pa_deparespec

as

select e.nombres_Emp , e.numero_Dep , dep.nombre_Dep from Empleado e inner join


Departamento dep on e.numero_Dep=dep.numero_Dep

where dep.numero_Dep='5'

exec pa_deparespec

----------------------------------------------------------------------------------------------------------------------------

--5. Listar Dependientes que nacieron 1995

CREATE PROCEDURE pa_NacidEnUnAñoDet

AS

BEGIN

SELECT apellidoPat_Depe, apellidoMat_Depe, nombres_Depe, fechaNac_Depe

from Dependiente

where fechaNac_Depe between '1995/10/25' and '1995/11/25'

end

execute pa_NacidEnUnAñoDet

select*from Dependiente

select*from Empleado

-------------------------------------------------------------------------------------------------------------------

-- 6. Listar el número de seguro social y el nombre completo de los empleados que trabajan en
un proyecto en especifico
ALTER PROCEDURE pa_listaEmpPorProy

@num smallint

AS

BEGIN

SELECT e.nss_Emp, apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

from Empleado e inner join Asignacion a on e.nss_Emp=a.nss_Emp

where numero_Pro= @num

order by apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

end

execute pa_listaEmpPorProy 10

select*from Asignacion

---------------------------------------------------------------------------------------------------

--7. Mostrar número de proyecto, numero de departamento, presupuesto y codigo de distrito


que estén entre 1 y 5

alter PROCEDURE Pa_Proyecto_presu

AS

BEGIN

SELECT numero_Pro, numero_Dep, presupuesto_Pro, codigo_Dis

from Proyecto

where codigo_Dis between '1' and '5'

order by numero_Pro, numero_Dep, presupuesto_Pro, codigo_Dis

end
execute Pa_Proyecto_presu

------------------------------------------------------------------------------------------------------------------------------

-- 8. Listar los datos de los dependientes de un empleado, dado su número de seguro social

alter procedure pa_depenPorEmp

@nss char(9)

as

begin

select rtrim(apellidoPat_Depe) + ' ' + rtrim (apellidoMat_Depe) + ' ' + rtrim


(nombres_Depe)+ ' ' fechaNac_Depe, sexo_Depe, parentesco_Depe

from Dependiente

where nss_Emp=@nss

order by apellidoPat_Depe, apellidoMat_Depe, nombres_Depe

end

execute pa_depenPorEmp '987654321'

select*from Dependiente

------------------------------------------------------------------------------------------------

--9. Mostrar los 3 proyectos que tienen más empleados asignados, con sus debidos presupuestos
y su fecha de inicio del proyecto

alter procedure pa_ProyConMasEmp

as

begin

select top 3 m.numero_Pro, nombre_Pro, presupuesto_Pro, estado_Pro, fechaIni_Pro,

numero_Dep, count(*)as empleados


from Proyecto m inner join Asignacion a on m.numero_Pro=a.numero_Pro

group by m.numero_Pro, nombre_Pro, presupuesto_Pro, estado_Pro, fechaIni_Pro,

fechaFin_Pro, numero_Dep

order by count(*) asc

end

execute pa_ProyConMasEmp

-----------------------------------------------------------------------------------------------

--10. Mostrar los n proyectos que tienen más empleados asignados, con sus respectivos
presupuestos

create procedure pa_proyMasEmpAsig

@num int

as

begin

select top(@num) m.numero_Pro, nombre_Pro, presupuesto_Pro, estado_Pro,


fechaIni_Pro, fechaFin_Pro,

numero_Dep, count(*)as empleados

from Proyecto m inner join Asignacion a on m.numero_Pro=a.numero_Pro

group by m.numero_Pro, nombre_Pro, presupuesto_Pro, estado_Pro, fechaIni_Pro,


fechaFin_Pro, numero_Dep

order by count(*) desc

end

execute pa_proyMasEmpAsig 5

-------------------------------------------------------------------------------------------

--11. Dado un estado específico, listar los proyectos que se encuentran en ese estado y
considerar el nombre del departamento al que pertenecen
alter procedure pa_proyectoPorEstado

@estado char(1)

as

begin

select m.numero_pro, nombre_Pro,

m.numero_Dep, estado_Pro

from Proyecto m inner join Departamento d on m.numero_Dep=d.numero_Dep

where estado_Pro=@estado

end

execute pa_proyectoPorEstado 'E'

-----------------------------------------------------------------------------------------------

--12. Dado el número de un mes mostrar el número de empleados. por medio de un parámetro
de salida, que han ingresado en ese mes sin importar el año al que corresponde.

alter procedure pa_NumIngMes

@mes varchar(15), @num int output

as

begin

declare @nom varchar(15)

set @num=(select count(*)

from Empleado

where month (fechaIng_Emp)=@mes)

end

declare @ingresos int

execute pa_NumIngMes '2', @ingresos output


select CANTIDAD_DE_EMPLEADOS_INGRESADOS=@ingresos

select *FROM Empleado

--------------------------------------------------------------------------------------------

--13. Listar cantidad de dependientes por rango de edades

ALTER procedure pa_CantDepRanEdad

as

begin

select 'MENORES DE 21' AS RANGO, count(*) as DEPENDIENTES

from Dependiente

where DATEDIFF(yy,fechaNac_Depe, getdate())<=20

end

execute pa_CantDepRanEdad

-----------------------------------------------------------------------------------------------------

--14. Dado un número de seguro social, mostrar nombre completo del empleado, nombre
completo y parentesco de sus dependientes

create procedure pa_NomEmDep

@nss char(9)

as

begin

select apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

from Empleado

where nss_Emp=@nss
select apellidoPat_Depe, apellidoMat_Depe, nombres_Depe, parentesco_Depe

from Dependiente

where nss_Emp=@nss

end

execute pa_NomEmDep '123456789'

------------------------------------------------------------------------------------------

--15. Modificando el ejercicio anterior

alter procedure pa_NombEmpDep

@nss char(9)

as

begin

select apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

from Empleado

where nss_Emp=@nss

if exists(select*from Dependiente where nss_Emp=@nss)

select apellidoPat_Depe, apellidoMat_Depe, nombres_Depe, parentesco_Depe

from Dependiente

where nss_Emp=@nss

else

select 'NO TIENE DEPENDIENTES' as MENSAJE

END

EXECUTE pa_NombEmpDep '015897129'

----------------------------------------------------------------------------------------------------
--16. Numero de apellidos paternos y maternos que se repitan de acuerdo al texto ingresado

create procedure pa_NumApell

@apellido char(15), @n1 smallint output, @n2 smallint output

as

begin

select @n1=count(*)

from Empleado

where apellidoPat_Emp like '%' + rtrim(@apellido) + '%'

select @n2=count(*)

from Empleado

where apellidoMat_Emp like '%' + rtrim(@apellido)+ '%'

end

declare @x smallint, @y smallint

execute pa_NumApell 'Castillo', @x output, @y output

select @x as RepeticionApellidoPaterno, @y as RepeticionApellidoMaterno

------------------------------------------------------------------------------------------------------------------

--17. Dado una fecha de inicio y una de fin, mostrar los empleados que nacieron dentro de ese
rango de fechas

alter procedure pa_EmpPorFechNac

@fechaIn smalldatetime, @fechaFin smalldatetime

as

begin

select nss_Emp, apellidoPat_Emp, apellidoMat_Emp, nombres_Emp, fechaNac_Emp

from Empleado
where fechaNac_Emp between @fechaIn and @fechaFin

order by apellidoPat_Emp, apellidoMat_Emp, nombres_Emp

end

execute pa_EmpPorFechNac '01/01/1970', '01/12/1985'

---------------------------------------------------------------------------------------------------------------

--18. crear un procedimiento para mostrar nombre de Proyectos, presupuesto y nombre de


distrito

create procedure pa_nomProy

as

begin

select nombre_Pro, presupuesto_Pro, nombre_Dis

from Proyecto p right join Distrito d on p.codigo_Dis=d.codigo_Dis

where codigo_Prov=1

end

execute pa_nomProy

---------------------------------------------------------------------------------------------------

--19.- crear un PA que muestre los proyectos y los días por las horas trabajadas

create procedure pa_dia_porhora

@horas int= 0

as

begin
if not exists (select * from LineaHorario LH where LH.horas_LiH = @horas )

print ' ingrese horas validas '

else

SELECT pro.nombre_Pro , lih.dia_LiH , lih.horas_LiH FROM LineaHorario lih

inner join Proyecto pro on lih.numero_Pro=pro.numero_Pro

where lih.horas_LiH=@horas

end

exec pa_dia_porhora @horas= 2

select*from LineaHorario

select*from Proyecto

-----------------------------------------------------------------------------------------------

--20. Dado un código de provincia, mostrar la cantidad de empleados que viven en cada distrito
de esa provincia.

alter procedure pa_EmpXProv

@prov varchar(20)

as

begin

select p.nombre_Prov PROVINCIA, count(*) CANTIDAD

from Provincia p inner join Distrito d on p.codigo_Prov=d.codigo_Prov and


p.codigo_Prov=@prov

inner join Empleado e on d.codigo_Dis=e.codigo_Dis

group by p.nombre_Prov

end

execute pa_EmpXProv @prov = 3

select *from Provincia where codigo_Prov = 1

select*from Provincia
select*from Distrito

select*from Empleado

FUNCIONES
--1. crea una función que muestre los nombres del proyecto en mayúscula

create function fu_nomb_may (@nompr varchar (50))

returns varchar (50)

as

begin

return (upper (@nompr))

end

select numero_Pro ,dbo.fu_nomb_may(nombre_Pro) NOM_PROYECT_MAYUSCULA from


Proyecto

-------------------------------------------------------------------------------------------------------

--2. crea una función que obtenga el salario final de cada empleado

create FUNCTION F_empleado (@sala smallmoney ) RETURNS money

AS

BEGIN

declare @salario smallmoney

set @salario=@sala-120

declare @empl varchar (20)

return @salario
END

select nombres_Emp, salario_Emp, dbo. F_empleado(salario_Emp) Salario_Final from Empleado

-------------------------------------------------------------------------------------------------------------------

--3. crear una función que devuelva el presupuesto de un proyecto

create FUNCTION F_PRESU (@ID INT ) RETURNS int

AS

BEGIN

declare @pre smallmoney

set @pre= (select presupuesto_Pro from Proyecto where numero_Pro=@ID)

return @pre

END

select dbo.F_PRESU(5) as PRESUPUESTO_DE_PROY

------------------------------------------------------------------------------------------------------

--4.- Muestre los empleados hombres nombrados

create function F_Emp_Nom

( @nom char(15)) returns varchar (20)

as

begin

declare @nombre char(15)=@nom

return @nom
end

select dbo.F_Emp_Nom (nombres_Emp)HOMBRES_NOMBRADOS from Empleado where


sexo_Emp=1 and situacion_Emp='N'

select*from Empleado

--------------------------------------------------------------------------------------------------

--5. CREAR UNA FUNCION QUE BRINDANDO LOS NOMBRES, APELLIDOS Y TELEFONO GENERE UN
CODIGO CON LA SIGUIENTE ESTRUCTURA

-- (ABCD-123)

CREATE FUNCTION gene_codigo (@nombre varchar (50), @apellido varchar (50), @telefono
varchar (15)) RETURNS varchar (15)

AS

BEGIN

DECLARE @CAMPONOMBRE VARCHAR (2) = substring (@nombre, 1,2)

DECLARE @CAMPOAPELLIDO VARCHAR (2) = substring (@apellido, 1,2)

DECLARE @CAMPOTELEFONO VARCHAR (6) = @telefono

RETURN upper (@CAMPONOMBRE+@CAMPOAPELLIDO+ '-' +@CAMPOTELEFONO)

END

SELECT dbo.gene_codigo (nombres_Emp, apellidoPat_Emp, telefonos_Emp)


CODIGOS_GENERADOS FROM Empleado

select * from Empleado


---------------------------------------------------------------------------------------------------------

--6. CREAR UNA FUNCION QUE Muestre el nombre DE DEPARTAMENTOS el resultado debe estar
ordenado por el nombre de manera ascendente

create function F_NomVigDep (@nom varchar(15)) returns varchar(50)

as

begin

declare @nombre varchar(15)= @nom

return @nombre

end

select dbo.F_NomVigDep (nombre_Dep) NOMBRE_DEPARTAMENTO from Departamento ORDER


BY nombre_Dep ASC

select*from Empleado

select*from Departamento

-----------------------------------------------------------------------------------------------------------------------

--7. crear una función que en basa a los nombres se genere un correo personalizado para cada
empleado

create function f_generacorreo ( @nombre varchar (50), @apellidos varchar (50))

returns varchar (150)

as

begin

declare @name varchar (50) = @nombre

declare @surname varchar (50) = @apellidos


declare @correo varchar (150)= lower (RTRIM(@name)+RTRIM( @surname)
+'@gmail.com')

return @correo

end

select dbo.f_generacorreo (nombres_Emp, apellidoPat_Emp) CORREO from Empleado

---------------------------------------------------------------------------------------------------------

--8. Función que me devuelve la edad de un empleado, cuando se conoce el ID de empleado.

create function fn_edad (@empleado int)

returns integer

as

begin

declare @edad integer

set @edad=(SELECT CONVERT(int,datediff(day,fechaNac_Emp,getdate())/365.25)

from Empleado where nss_Emp=@empleado)return @edad

end;

select dbo.fn_edad(000258973) EDAD

----------------------------------------------------------------------------------------------------------------

--9. CREAR UNA FUNCION QUE DADA UNA FECHA EN ESPECIFICO RETORNE EL NOMBRE DEL MES
Y EL NOMBRE DEL DIA EN INGLES

SELECT * FROM Proyecto

CREATE FUNCTION FN_NOMBRE_FECHA (@FECHA DATE ) RETURNS VARCHAR (100)


AS

BEGIN

DECLARE @annio varchar (20)= datename (year , @FECHA)

DECLARE @mes varchar (20)= datename (MONTH , @FECHA)

DECLARE @dia varchar (20)= datename (day , @FECHA)

return @dia + ' of ' + @mes + ' of the ' + @annio

END

select dbo.FN_NOMBRE_FECHA (fechaIni_Pro) NOMBRE_MES_DIA_EN_INGLES FROM Proyecto

------------------------------------------------------------------------------------------------------------------------

--10. crear una función que según el tipo de dato muestre los nombres y apellidos de la persona
genero

CREATE FUNCTION FN_LISTA_GENERO (@TIPO CHAR(15)) RETURNS VARCHAR (100)

AS

BEGIN

DECLARE @parente char (15)= @TIPO

DECLARE @nombre varchar (100)

set @nombre = (select nombres_Depe from Dependiente where


parentesco_Depe=@parente)

DECLARE @apellido varchar (100)

set @apellido= (select apellidoPat_Depe from Dependiente where


parentesco_Depe=@parente)

return concat (@nombre , @apellido)

END

select dbo.FN_LISTA_GENERO (parentesco_Depe)FROM Dependiente


-----------------------------------------------------------------------------------------------------------------------

--11. Crear una función que devuelva el nombre completo de los empleados que pertenecen a un
determinado distrito (ID_DISTRITO).

CREATE FUNCTION FN_NombreEmpleado(@Zona int)

RETURNS @NombreEmpleado Table (nombres_emp Varchar(50))

AS

BEGIN

Declare @Nombre Varchar(50)

Insert Into @NombreEmpleado

Select (nombres_Emp + ' ' + apellidoPat_Emp+' '+apellidoMat_Emp)

From Empleado Where codigo_Dis=@Zona

RETURN

END

SELECT * From FN_NombreEmpleado(2)

-----------------------------------------------------------------------------------------------------------------

--12. Mostrar el máximo presupuesto y el mínimo presupuesto de los proyectos que están
ubicados en el distrito de Chiclayo

create function F_NumReg (@dis char(30)) returns varchar (50)

as

begin

declare @distrito char(30)=@dis

declare @maxpresu int = (SELECT TOP 1 P.presupuesto_Pro FROM Proyecto P INNER JOIN Distrito
D on
P.codigo_Dis = D.codigo_Dis where D.nombre_Dis = @distrito ORDER BY P.presupuesto_Pro
DESC)

declare @minpresu int = (SELECT TOP 1 P.presupuesto_Pro FROM Proyecto P INNER JOIN Distrito
D on

P.codigo_Dis = D.codigo_Dis where D.nombre_Dis = @distrito ORDER BY P.presupuesto_Pro ASC)

return (' MAXIMO '+STR (@maxpresu)+' , MINIMO '+STR (@minpresu))

end

SELECT dbo.F_NumReg ('José Leonardo Ortiz') as MAX_Y_MIN_PRES

----------------------------------------------------------------------------------------------------------------------

-- 13. DEVOLVER LA FEHA DE NACIMIENTO EN PALABRAS DE LOS DEPENDIENTES

CREATE FUNCTION FECHA_PALABRAS(@FECHA DATE)RETURNS VARCHAR (50)

AS

BEGIN

DECLARE @MES VARCHAR(50)=DATENAME(MONTH,@FECHA)

DECLARE @DIA VARCHAR(20)=DAY(@FECHA)

DECLARE @ANNIO VARCHAR(20)=YEAR(@FECHA)

RETURN @DIA + ' DE'+ UPPER(@MES)+ ' DEL '+@ANNIO

END

SELECT dbo.FECHA_PALABRAS (fechaNac_Depe) FECHA_NAC_DEPENDIENTE FROM Dependiente

select*from Dependiente
--14. Crear una función que ingrese “E” (empleado), "P" (Proyecto) y
"D", (departamento) y muestre el Nombre Completo.

CREATE FUNCTION fn_ingrese (@tipo char(1))


RETURNS @fn_personas TABLE
(nombre varchar(61) NOT NULL)
AS
BEGIN
IF upper(@tipo) = 'E'
INSERT @fn_personas SELECT nombres_Emp+' '+apellidoPat_Emp+ ' '+apellidoMat_Emp
FROM Empleado
ELSE IF upper(@tipo) = 'P'
INSERT @fn_personas SELECT nombre_Pro
FROM Proyecto
ELSE IF UPPER(@TIPO) = 'D'
INSERT @fn_personas SELECT nombre_Dep
FROM Departamento
RETURN
END
select * from dbo. fn_ingrese('D')

-- 15. Función que devuelve la dirección del Dependiente pasándole el codigo del mismo

create or alter function fn_direccion(@numdiir int)

returns varchar (100)

as

begin

return (select direccion_Emp from Empleado where nss_Emp=@numdiir )

end

SELECT dbo.fn_direccion ('000258973' ) DIRECCION_EMPLLEADO

VISTAS
-- 1. Crear una vista que permita dar por cada distrito, el número de proyectos
-- que se tienen.

CREATE VIEW proyectos_por_distrito (CODIGO_DIST, numero_Pro) as


(select c.codigo_Dis, COUNT(*)

from Proyecto p, Distrito c


where p.codigo_Dis = c.codigo_Dis
group by c.codigo_Dis);

select*from proyectos_por_distrito

select*from Proyecto

select*from Distrito

----------------------------------------------------------------------------------------------

-- 2. creamos una vista que muestre los datos de un dependiente y su parentesco del empleado

create view vista_empleados


AS
SELECT (e.nombres_Emp+' '+e.apellidoPat_Emp+' '+e.apellidoMat_Emp) as 'Nombres de
Empleado',
(d.nombres_Depe+' '+ d.apellidoPat_Depe+' '+ d.apellidoMat_Depe) as 'Dependiente de
Empleado',
d.parentesco_Depe as 'Parentesco'
FROM Empleado AS e JOIN Dependiente AS d
ON e.nss_Emp = d.nss_Emp ;
GO

select *from vista_empleados

------------------------------------------------------------------------------------------------------------

-- 3. crear una vista que solo contenga el nombre del proyecto, la fecha de inicio y fin del
proyecto de un distrito determinado

create view V_NOMPR_FECHA_DIS


as
select nombre_Dis DISTRITO ,nombre_Pro NOMBRE_PROYECTO ,fechaIni_Pro , fechaFin_Pro
from Proyecto , Distrito
where Distrito.nombre_Dis= 'Eten'

SELECT * from V_NOMPR_FECHA_DIS

select* from Distrito


select * from Dependiente

select * from Proyecto

-------------------------------------------------------------------------------------------------------------------------------
-- 4. crea una vista que muestre el total de las horas por proyecto

CREATE VIEW v_total_horas_pro


as
select pro.nombre_Pro, sum (li.horas_LiH) TOTAL_HORAS
from Proyecto pro, LineaHorario li where pro.numero_Pro=li.numero_Pro
group by pro.nombre_Pro

select * from v_total_horas_pro

SELECT* FROM Asignacion


SELECT * FROM Departamento
select * from LineaHorario

--------------------------------------------------------------------------------------------------------------

-- 5. crear una vista que muestre la fecha de nacimiento de los empleados que nacieron en 1980
al 1990 del distrito de chongoyape

create view v_dis


as
select apellidoPat_Emp,nombre_Dis , fechaNac_Emp from Empleado , Distrito
where (fechaNac_Emp between '1980' and '1990' ) and (nombre_Dis='Chongoyape')

select * from v_dis

--------------------------------------------------------------------------------------------------------------------------------

-- 6. crea una vista que muestre el departamento con su respectivo proyecto del dia lunes cuyo
presupuesto sea menor a 5000

create view v_depar_proy


as
select (nombre_Pro + ' esta en el ' + nombre_Dep ) as PROYECTO_DEPARTAMENTO ,
dia_LiH , fechaIniGer_Dep, presupuesto_Pro
from Proyecto as p join LineaHorario as lh on p.numero_Pro=lh.numero_Pro
inner join Departamento de on p.numero_Dep=de.numero_Dep
where (dia_LiH like 'LU') and presupuesto_Pro < 50000.00

select * from v_depar_proy

----------------------------------------------------------------------------------------------------------------------------

--7. crear vista que muestre datos de varias tablas

create view Empleados


AS
SELECT d.numero_Dep, nombre_Dep, e.nss_Emp, e.sexo_Emp,
situacion_Emp, fechaNac_Emp, FechaIng_Emp from Departamento d inner join
Empleado e on d.numero_Dep=e.numero_Dep
where estado_Emp in ('A','V')

select*from Empleados

---------------------------------------------------------------------------------------

-- 8. Modificando la vista anterior, añadiendo el sexo, la situación, el estado y nombre de distrito


de cada empleado

create view Empleados_Mod


AS
SELECT d.numero_Dep, nombre_Dep, e.nss_Emp,
case e.sexo_Emp when 1 then 'Masculino' else 'Femenino' end as sexo, case situacion_Emp
when 'N' then 'Nombrado' else 'Contratado' end as situacion,
case estado_Emp when 'V' then 'Vacaciones' else 'Activo' end as estado,
fechaNac_Emp, fechaIng_Emp, salario_Emp, nombre_Dis
from((Departamento d inner join Empleado e on d.numero_Dep=e.numero_Dep)
inner join Distrito d2 on d2.codigo_Dis =e.codigo_Dis inner join Provincia p on p.codigo_Prov=
d2.codigo_Prov)
where estado_Emp in('A', 'V')

select*from Empleados_Mod

-------------------------------------------------------------------------------------------

-- 9. crear una vista que concatene los campos de nombres, apellidos de la tabla dependientes y
mostrar en una lista, únicamente
-- de los que pertenecen al distrito Chiclayo

create view Distrito_Dep


as
select concat(h.nombres_Depe, ' ' ,h.apellidoPat_Depe) NOMBRES_COMPLETOS,
d.nombre_Dis DISTRITO from Dependiente h
inner join Empleado e on h.nss_Emp=e.nss_Emp inner join Distrito d
on e.codigo_Dis=d.codigo_Dis where d.nombre_Dis='Chiclayo'

select*from Distrito_Dep

select*from Dependiente

-----------------------------------------------------------------------------------------------------------------------------------

-- 10. Mostrar el codigo del seguro social de los empleados que estan de vacaciones

create view Empl_Vacaciones


as
select s.nss_Emp SEGURO_SOCIAL, e.estado_Emp ESTADO
from Departamento d inner join Empleado e
on d.numero_Dep= e.numero_Dep inner join Asignacion s on e.nss_Emp=s.nss_Emp
where e.estado_Emp='V'

select*from Empl_Vacaciones

select*from Asignacion
select*from Empleado

-----------------------------------------------------------------------------------------------------------------------------------
-

-- 11. ---crear una vista donde me muestre de que distrito pertenecen los proyectos y el tiempo o
años de duración

create view tiempo_proyecto


AS
SELECT nombre_pro as 'Proyecto’, nombre_dis as 'Distrito',
DATEDIFF(year,fechaIni_Pro, fechaFin_Pro) as 'AÑOS DE DURACION'
from Proyecto p join distrito d on p.codigo_Dis=d.codigo_Dis;
GO

select * from tiempo_proyecto

---------------------------------------------------------------------------------------------------------
--12. crear una vista que nos muestre los presupuestos de los proyectos
-- que se encuentran perteneciendo al día lunes, además incluir el nombre
-- de los proyectos

create view rango_proyectos


as
select pr.nombre_Pro NOMBRE_PROYECTO, pr.presupuesto_Pro PRESUPUESTO,lh.dia_LiH
DIA from Proyecto pr inner join LineaHorario lh on pr.numero_Pro = lh.numero_Pro
inner join Hora hr on lh.codigo_Hor = hr.codigo_Hor where lh.dia_LiH = 'LU'

select * from rango_proyectos

--13. CREAR UNA VISTA QUE MUESTRE LA LISTA DE EMPLEADOS QUE PERTENECEN AL
DEPARTAMENTO DE MARKETING,
--ADEMAS INCLUIR EL NOMBRE DEL DISTRITO QUE TIENE COMO LUGAR DE RESIDENCIA

CREATE VIEW LIST_EMPLEADO


AS
SELECT Em.nombres_Emp, Em.apellidoPat_Emp, Em.apellidoMat_Emp, Ds.nombre_Dis
FROM Departamento dp inner join Empleado Em on dp.nss_Emp = Em.nss_Emp
inner join Distrito Ds on Em.codigo_Dis = Ds.codigo_Dis where dp.nombre_Dep =
'Marketing'

select * from LIST_EMPLEADO

--14. CREAR UNA VISTA QUE SE MUESTRE SEGUN EL AÑO DETALLES COMO, DNI, NUMERO DE
PROYECTO.

CREATE VIEW NUMERO_PROYECT


AS
SELECT A.numero_Pro NUMERO_PROYECTO, mp.fechaIng_Emp FECHA_INGRESO,
mp.dni_Emp DNI FROM Empleado mp inner join Asignacion A on mp.nss_Emp = A.nss_Emp inner
join Proyecto P
on A.numero_Pro = p.numero_Pro where YEAR (mp.fechaIng_Emp) = 1990 and
A.numero_Pro = 11

SELECT * FROM NUMERO_PROYECT

--15. CREAR UNA VISTA QUE MUESTRE LOS NOMBRES DE LOS PROYECTOS, PROVINCIA Y
PRESUPUESTO
--SEGUN LA BUSQUEDA DE COINCIDENCIA, DONDE LOS NOMBRES EMPIEZEN CON LA PALABRA
'PROYECTO'.
CREATE VIEW PROYECT
AS
SELECT nombre_Pro NOMBRE_PROYECTO, Pr.nombre_Prov PROVINCIA, P.presupuesto_Pro
PRESUPUESTO FROM Proyecto P inner join Distrito D on P.codigo_Dis = D.codigo_Dis
inner join Provincia Pr on D.codigo_Prov = Pr.codigo_Prov where nombre_Pro Like
'Producto%'

SELECT * FROM PROYECT

TRIGGER

--1-- Trigger que no permita borra más de un proyecto.

CREATE OR ALTER TRIGGER PROYECTO_DEL


ON Proyecto
FOR DELETE
AS
BEGIN
DECLARE @CON INT
SELECT @CON = (SELECT COUNT(*) FROM deleted)
IF @CON>=1
ROLLBACK TRANSACTION
RAISERROR('NO SE PUEDE BORRAR MÁS DE UN PRODUCTO', 16, 1)
END
DELETE FROM Proyecto WHERE numero_Pro=1 AND numero_Pro=3

--2-- Trigger que no permite modificar el nombre de un Proyecto

CREATE OR ALTER TRIGGER N0_UPDATE


ON Proyecto
FOR UPDATE
AS
BEGIN
IF UPDATE (nombre_Pro)
PRINT 'NO PUEDE MODIFICAR EL NOMBRE DEL PROYECTO'
ROLLBACK TRANSACTION
END

UPDATE Proyecto SET nombre_Pro='Universidad' WHERE numero_Pro=2

--3-- Trigger que no permita eliminar una línea de horario.

CREATE OR ALTER TRIGGER NO_DELETE


ON LineaHorario
FOR DELETE
AS
BEGIN
DECLARE @DIA CHAR(2)
SELECT @DIA = dia_LiH FROM deleted
IF @DIA='LU'
PRINT 'NO PUEDE ELIMINAR ESTA LINEA DE HORARIO'
ROLLBACK TRANSACTION
END

DELETE FROM LineaHorario WHERE dia_LiH='LU'

--4--Trigger que almacena en una tabla ALTO_SUELDO, a los clientes que sean registrados con un
sueldo superior a 3500

CREATE TABLE ALTO_SUELDO


(nombres_Emp char(15) NOT NULL ,
apellidoPat_Emp char(15) NOT NULL ,
dni_Emp char(8) NOT NULL ,
salario_Emp smallmoney,
fecha_registro datetime
)
GO
CREATE OR ALTER TRIGGER INSERT_NOT
ON Empleado
FOR INSERT
AS
BEGIN
DECLARE @NOMBRE CHAR (15), @APELLIDO_P CHAR (15), @DNI CHAR(8), @SUELDO
SMALLMONEY
SELECT @NOMBRE = nombres_Emp FROM inserted
SELECT @APELLIDO_P = apellidoPat_Emp FROM inserted
SELECT @DNI = dni_Emp FROM inserted
SELECT @SUELDO = salario_Emp FROM inserted
IF @SUELDO>=3500
BEGIN
INSERT INTO ALTO_SUELDO VALUES
(@NOMBRE,@APELLIDO_P,@DNI,@SUELDO,GETDATE())
PRINT 'REGISTRO EXITOSO'
END
ELSE
PRINT 'REGISTRO DE EMPLEADO EXITOSO'
END

SELECT * FROM ALTO_SUELDO


INSERT INTO
Empleado(nss_Emp,nombres_Emp,apellidoPat_Emp,apellidoMat_Emp,dni_Emp,fechaNac_Emp,tel
efonos_Emp,direccion_Emp,sexo_Emp,salario_Emp,fechaIng_Emp,numero_Dep,situacion_Emp,es
tado_Emp,codigo_Dis) VALUES
('040328973','WilLy','Santos','Percha','191447','02/12/1985','365123','San Juan
3213,Chiclayo',1,3600,'12/04/1990',1,'C','A',2);

--5--Trigger que restringe que el valor del presupuesto de un proyecto no sea mayor a 70000

CREATE OR ALTER TRIGGER NO_PERM


ON Proyecto
FOR INSERT
AS
BEGIN
DECLARE @MONTO SMALLMONEY
SELECT @MONTO = presupuesto_Pro FROM inserted
IF @MONTO>=50000

ROLLBACK TRANSACTION
PRINT 'YA NO SE LES PERMITE DESFILFARRAR EL DINERO EN PROYECTOS MUY
COSTOSOS LOS CUALES INCLUSO HACEN MAL'
END
INSERT INTO
Proyecto(numero_Pro,nombre_Pro,estado_Pro,numero_Dep,presupuesto_Pro,fechaIni_Pro,fechaF
in_Pro,codigo_Dis) VALUES (22,'Capacitación a gerentes de
departamento','T',6,122000,'19/05/2013','15/12/2013',26)

--6--Un trigger que permita controlar el registro de una hora,


--se deberá evaluar que la hora a registrar sea mayor que las cero horas.

create TRIGGER validar_hora


ON Hora
FOR INSERT
AS
IF (select nombre_Hor from inserted)<='00:00'
BEGIN
ROLLBACK TRANSACTION
PRINT 'No puede registrar monto Cero'
END
ELSE
PRINT 'Hora registrado correctamente'
GO

insert into Hora(codigo_Hor,nombre_Hor) values(16,'23:00')

--7--un Trigger que permita mostrar un mensaje cada vez que

--se inserte o actualice un registro en la tabla asignación.

Create trigger mensaje_registro


On Asignacion
for insert, update
As
begin
Print 'Actualizado correctamente'
end

Update Asignacion set horasSem_Asi=18


where nss_Emp='016807220'
go

--8-- crear un trigger que permita actualizar la tabla HOra ingresando un nuevo registro,

----- cada nuevo registro debe ir incrementando en 1

CREATE trigger TR_HORA

on Hora

for INSERT
as

begin

DECLARE @idHora int

declare @nombre varchar (20)

select @idHora = codigo_Hor from inserted

select @nombre= nombre_Hor from inserted

update hl set nombre_Hor = @nombre from Hora hl where @idHora=codigo_Hor

end

select * from Hora

INSERT INTO Hora values (17 , 16.00)

--9-- TRIGGER QUE NO PERMITA EL REGISTRO DE UN EMPLEADO CON EL MISMO NOMBRE Y


APELLIDOS
CREATE OR ALTER TRIGGER NO_INSERT
ON Empleado
FOR INSERT
AS
BEGIN
DECLARE @NOMBRE VARCHAR (50)
DECLARE @APELLIDO_P VARCHAR (50)
DECLARE @APELLIDO_M VARCHAR (50)
DECLARE @INS INT
SELECT @NOMBRE=nombres_Emp FROM inserted
SELECT @APELLIDO_P=apellidoPat_Emp FROM inserted
SELECT @APELLIDO_M=apellidoMat_Emp FROM inserted

SELECT @INS=COUNT (*) FROM Empleado WHERE nombres_Emp=@NOMBRE AND


apellidoPat_Emp=@APELLIDO_P AND apellidoMat_Emp=@APELLIDO_M
IF @INS-1>=1
BEGIN
ROLLBACK TRANSACTION
PRINT 'EMPLEADO YA ESTA REGISTRADO'
END
END
INSERT INTO
Empleado(nss_Emp,nombres_Emp,apellidoPat_Emp,apellidoMat_Emp,dni_Emp,fechaNac_Emp,
telefonos_Emp,direccion_Emp,sexo_Emp,salario_Emp,fechaIng_Emp,numero_Dep,situacion_Em
p,estado_Emp,codigo_Dis) VALUES
('999998599','Pedro','Díaz','Marquina','18162345','01/10/1967',NULL,'Sorgo 450, Higueras,
MX',1,2570,'01/11/1996',5,'N','A',1);

select * from Empleado where nombres_Emp = 'Pedro'

--10-- TRIGGER QUE ALMACENA LOS DATOS DEL NUEVO EMPLEADO EN TABLA TRABAJADOR
NUEVO
--LA TABLA DEBERA CONTENER EL NOMBRE COMPLETO, DNI, SEXO

CREATE TABLE trabajador_nuevo (

Nombre VARCHAR (50),


apellido_p VARCHAR (50),
apellido_m VARCHAR (50),
dni INT,
sexo bit,
salario smallmoney,
Direccion varchar (100),
fecha_Ing date
)

ALTER TRIGGER nuevo_empleado


ON Empleado
FOR INSERT
AS
BEGIN
DECLARE @Nombre VARCHAR (50)
DECLARE @apellido_p VARCHAR (50)
DECLARE @apellido_m VARCHAR (50)
DECLARE @dni INT
DECLARE @sexo bit
DECLARE @salario smallmoney
DECLARE @Direccion varchar (100)
DECLARE @fecha_ing date

SET @Nombre = (SELECT nombres_Emp FROM Inserted)


SET @apellido_p = (SELECT apellidoPat_Emp FROM Inserted)
SET @apellido_m = (SELECT apellidoMat_Emp FROM Inserted)
SET @dni = (SELECT dni_Emp FROM Inserted)
SET @sexo = (SELECT sexo_Emp FROM Inserted)
SET @salario = (SELECT salario_Emp FROM Inserted)
SET @Direccion = (SELECT direccion_Emp FROM Inserted)
SET @fecha_ing = (SELECT GETDATE())
INSERT INTO trabajador_nuevo (nombre, apellido_p, apellido_m, dni, sexo, salario, Direccion,
fecha_Ing)
VALUES (@Nombre, @apellido_p, @apellido_m, @dni, @sexo, @salario, @Direccion,
@fecha_ing)
END
INSERT INTO
Empleado(nss_Emp,nombres_Emp,apellidoPat_Emp,apellidoMat_Emp,dni_Emp,fechaNac_Emp,
telefonos_Emp,direccion_Emp,sexo_Emp,salario_Emp,fechaIng_Emp,numero_Dep,situacion_Em
p,estado_Emp,codigo_Dis)
VALUES('222912499','Elianaa','Vasquezz','Becerril','18168345','01/10/1967',NULL,'Sorgo 460,
Higueras, MX',0,2300,'01/11/1996',5,'N','A',1);

select * from trabajador_nuevo

--11--CREAR UN TRIGGER QUE NO PERMITA ELIMINAR NINGUNA TABLA DE LA BASE DE DATOS

CREATE TRIGGER no_eliminar_tabla


ON database
FOR DROP_TABLE
AS
BEGIN
PRINT 'NO SE PERMITE ELIMINAR LA TABLA'
ROLLBACK TRANSACTION
END

DROP TABLE trabajador_nuevo

--12-- CREAR UN TRIGGER QUE NO PERMITA ELIMINAR LA INFORMACION


-- QUE EXISTE EN LOS REGISTROS DE LA TABLA NUEVO TRABAJADOR

ALTER TRIGGER no_borrar_tr_nuevo


on trabajador_nuevo
for delete
as
begin
declare @NTrabajador varchar (50)
select @NTrabajador= Nombre from deleted
if @NTrabajador = 'Eliana'
ROLLBACK TRANSACTION
print 'NO SE PUEDE ELIMINAR ESTE TRABAJADOR'
end

delete from trabajador_nuevo where Nombre = 'Eliana'

select * from trabajador_nuevo

--13-- DESARROLLAR UN TRIGGER QUE PERMITA, VISUALIZAR NOMBRES DE USUARIO QUE


REALIZO
--UN CAMBIO EN LA TABLA DETALLE_CAMBIO

create table detalles_cambios


(id int identity primary key,
usuario varchar (50),
operacion varchar (30),
fecha varchar (40))

create TRIGGER detall_modifi


ON detalles_cambios
for insert

AS
BEGIN
declare @nombre varchar (50)
select @nombre = usuario from inserted
declare @operacion varchar (100)
select @operacion = operacion from inserted
print 'CAMBIO REALIZADO POR '+@nombre+' operacion '+@operacion
END

INSERT INTO detalles_cambios (usuario, operacion, fecha) values (SYSTEM_USER,'insercion de


datos', GETDATE())

select * from detalles_cambios

--14--. Crear un trigger que dentro de una tabla edad almacene el nombre, apellido y edad de un
nuevo empleado registrado

CREATE TABLE EDAD(NOMBRE varchar(50), Apellido_Pat varchar(50), edad int)

create or alter trigger Dis_Edad


on Empleado
FOR insert
AS
BEGIN
declare @fecha date, @fecha_nac date
Declare @nom varchar(50), @apell_Pat varchar(50), @edad INT
select @fecha=getdate ()
select @fecha_nac= fechaNac_Emp from inserted
select @nom= nombres_Emp from inserted
select @apell_Pat= apellidoPat_Emp from inserted
SELECT @edad = (year(@fecha)- year(@fecha_nac))

insert into EDAD(NOMBRE, Apellido_Pat, edad) values (@nom, @apell_Pat, @edad)


END
INSERT INTO Empleado
(nss_Emp,nombres_Emp,apellidoPat_Emp,apellidoMat_Emp,dni_Emp,fechaNac_Emp,telefonos_
Emp,direccion_Emp,
sexo_Emp,salario_Emp,fechaIng_Emp,numero_Dep,situacion_Emp,estado_Emp,codigo_Dis)
VALUES('999725999','Piter','Dayes','Mercado','18198345','01/10/1994',NULL,'Sorgo 452,
Higueras, MX',1,2570,'01/11/2012',5,'N','A',1)

SELECT * FROM EDAD

--15-- TRIGGER QUE NO PERMITA ACTUALIZAR O MODIFICAR LOS NOMBRES DE LOS


DEPARTAMENTOS
--YA REGISTRADOS EN LA BASE DE DATOS
create trigger TR_actualizar_DEPARTAMENTO
on Departamento
for update
as
begin
print 'NO SE PUEDE CAMBIAR EL DEPARTAMENTO'
rollback transaction
end
select * from Departamento

update Departamento set nombre_Dep= 'Recurso HUmanos' where nombre_Dep='Ventas'

INDICES

SET STATISTICS IO ON

CREATE UNIQUE NONCLUSTERED INDEX NOM_DEP ON Departamento(nombre_Dep)

2
CREATE NONCLUSTERED INDEX FECH_GER ON Departamento (fechaIniGer_Dep)

EXECUTE sp_helpindex Departamento


select * from Departamento

3
CREATE INDEX NOM_DEPE ON Dependiente (nombres_Depe)
4
CREATE INDEX fecha_nac ON Dependiente (fechaNac_Depe)

5
CREATE NONCLUSTERED INDEX ape_pat ON Dependiente (apellidoPat_Depe)

6
CREATE NONCLUSTERED INDEX ape_mat ON Dependiente (apellidoMat_Depe)

EXECUTE sp_helpindex Dependiente


select * from Dependiente

7
CREATE UNIQUE INDEX NOM_DIS ON Distrito (nombre_Dis)

EXECUTE sp_helpindex Distrito


select * from Distrito

8
CREATE INDEX DNI_EMP ON Empleado (dni_Emp)

9
CREATE NONCLUSTERED INDEX Telefono ON Empleado (direccion_Emp)

10
CREATE NONCLUSTERED INDEX Direccion ON Empleado (direccion_Emp)

EXECUTE sp_helpindex Empleado


select * from Empleado

11
CREATE INDEX Hora ON Hora (nombre_Hor)

EXECUTE sp_helpindex Hora


select * from Hora

12
CREATE NONCLUSTERED INDEX Dia ON LineaHorario (dia_LiH)

EXECUTE sp_helpindex LineaHorario


select * from LineaHorario

13
CREATE UNIQUE INDEX Nom_pro ON Provincia (nombre_Prov)

EXECUTE sp_helpindex Provincia


select * from Provincia
14
CREATE UNIQUE NONCLUSTERED INDEX Nom_Proy ON Proyecto (nombre_Pro)

15
CREATE NONCLUSTERED INDEX presupuesto ON Proyecto (presupuesto_Pro)

EXECUTE sp_helpindex Proyecto


select * from Proyecto

16
CREATE INDEX Horas ON Asignacion (horasSem_Asi)

EXECUTE sp_helpindex Asignacion


select * from Asignacion

-----
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS

EXECUTE sp_helpindex Proyecto


select * from Asignacion

CURSORES

1. CURSOR QUE MUESTRA LOS DATOS DEL DEPENDIENTE TAL COMO NUNERO DE SEGURO
SOCIAL, NOMBRE, PARENTESCO

DECLARE @nss_Emp char(9), @nomDep char(30), @parent char(10)

declare Depe Cursor


for select d.nss_Emp, d.nombres_Depe, d.parentesco_Depe from Dependiente d

open Depe
fetch next from Depe into @nss_Emp, @nomDep, @parent

PRINT '--------------------------------------------------------------------------------------------'
PRINT 'N° SEGURO SOCIAL'+SPACE(5)+'NOMBRE DEPENDIENTE'+ SPACE(12)+ 'PARENTESCO'+
SPACE(15)
PRINT '--------------------------------------------------------------------------------------------'

WHILE @@FETCH_STATUS=0

BEGIN
PRINT @nss_Emp+space(15)+ @nomDep+ space(2)+ @parent
fetch next from Depe into @nss_Emp, @nomDep, @parent
END

CLOSE Depe

DEALLOCATE Depe

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS

-----------------------------------------------------------------------------------------------------------------------------------
-----------

--2. ¿CURSOR QUE REPORTE EL TOTAL DE PROYECTOS EN ESTADO E ?

DECLARE CUR_PROPRE CURSOR


FOR SELECT P.nombre_Pro,P.presupuesto_Pro FROM Proyecto P
WHERE P.estado_Pro='E'

OPEN CUR_PROPRE
DECLARE @NOMBRE CHAR(50), @PRE CHAR(20), @TOTAL INT =0
FETCH NEXT FROM CUR_PROPRE INTO @NOMBRE, @PRE

PRINT 'NOMBRE DEL PROYECTO'+SPACE(53)+'PRESUPUESTO'


PRINT '-------------------------------------------------------------------------------------------'

WHILE @@FETCH_STATUS=0
BEGIN
SET @TOTAL+=1
PRINT @NOMBRE+SPACE(20)+str (@PRE)
FETCH NEXT FROM CUR_PROPRE INTO @NOMBRE, @PRE
END
PRINT '-------------------------------------------------------------------------------------------'
PRINT 'TOTAL DE PROYECTOS ES: ' + CAST(@TOTAL AS CHAR(10))
CLOSE CUR_PROPRE
DEALLOCATE CUR_PROPRE

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS

------------------------------------------------------------------------------------------------------------
---3. CURSOR QUE MUESTRE LOS PROYECTOS POR DEPARTAMENTO DENTRO DE UN RANGO DEL
AÑO 2013 AL 2014

DECLARE CUR_DEPA CURSOR


FOR SELECT D.nombre_Dep, D.numero_Dep FROM Departamento D
OPEN CUR_DEPA
DECLARE @DEPA CHAR (15), @IDDEPA INT
FETCH NEXT FROM CUR_DEPA INTO @DEPA, @IDDEPA
PRINT '*******************'
PRINT 'DEPARTAMENTO'+ SPACE(23) + 'NOMBRE PROYECTO'
PRINT '*******************'
WHILE @@FETCH_STATUS=0
BEGIN
declare CUR_POYECTO cursor
for select P.nombre_Pro from Proyecto P WHERE
(P.numero_Dep=@IDDEPA) and (P.fechaIni_Pro between '2013' and '2014')

open CUR_POYECTO
DECLARE @NOM_PROY char (20)
fetch next from CUR_POYECTO INTO @NOM_PROY

WHILE @@FETCH_STATUS=0
begin
print @DEPA + SPACE(20)+ @NOM_PROY
FETCH NEXT FROM CUR_POYECTO INTO @NOM_PROY
end

close CUR_POYECTO

deallocate CUR_POYECTO
FETCH NEXT FROM CUR_DEPA INTO @DEPA, @IDDEPA
END

CLOSE CUR_DEPA

DEALLOCATE CUR_DEPA

--------------------------------------------------------------------------------------------------------------------------------
--4. CURSOR QUE MUESTRE EL DISTRITO CON SU RESPECTIVA PROVINCIA

DECLARE DISTPRO CURSOR

FOR SELECT D.nombre_Dis, P.nombre_Prov FROM Distrito D


INNER JOIN Provincia P ON P.codigo_Prov = D.codigo_Prov

DECLARE @nombDis char(30), @nomProv char (30)

open DISTPRO
FETCH NEXT FROM DISTPRO INTO @nombDis, @nomProv

PRINT '*******************'
PRINT 'DISTRITO'+ SPACE(23) + 'PROVINCIA'
PRINT '*******************'

WHILE @@FETCH_STATUS=0
BEGIN

PRINT @nombDis+ @nomProv


FETCH NEXT FROM DISTPRO INTO @nombDis, @nomProv
END

CLOSE DISTPRO
DEALLOCATE DISTPRO

SELECT*FROM Distrito

----------------------------------------------------------------------------------------------------------------------------
--5. CURSOR QUE MUESTRE DISTRITOS POR PROVINCIA CON UN CURSOR ANIDADO

DECLARE PROVINCIA CURSOR


FOR SELECT p.nombre_Prov, p.codigo_Prov FROM Provincia P

OPEN PROVINCIA
DECLARE @PROV CHAR(20), @COD INT
FETCH NEXT FROM PROVINCIA INTO @PROV, @COD

WHILE @@FETCH_STATUS=0
BEGIN
PRINT '-----------------------------------------------------'
PRINT UPPER(@PROV)
PRINT '-----------------------------------------------------'

DECLARE DISTRITO CURSOR


FOR SELECT d.nombre_Dis FROM Distrito d WHERE d.codigo_Prov=@COD

OPEN DISTRITO
DECLARE @DIST CHAR(40)
FETCH NEXT FROM DISTRITO INTO @DIST

WHILE @@FETCH_STATUS=0
BEGIN
PRINT SPACE(3)+@DIST
FETCH NEXT FROM DISTRITO INTO @DIST
END

CLOSE DISTRITO
DEALLOCATE DISTRITO

FETCH NEXT FROM PROVINCIA INTO @PROV, @COD

END

CLOSE PROVINCIA
DEALLOCATE PROVINCIA

-----------------------------------------------------------------------------------------------------------------------------
--6. CURSOR QUE MUESTRE EL TOTAL DE HORAS QUE MUESTRE EL TOTAL DE HORAS DE
ASIGNACIÓN TRABAJADAS EN LOS PROYECTOS POR EMPLEADO

DECLARE @IDEMP CHAR(5), @NOMBEMP CHAR(50), @ASIG CHAR(10), @ETOTAL INT=0,


@SUMATOTAL INT

DECLARE CUR_SUELDO CURSOR


FOR SELECT Em.nss_Emp,(Em.apellidoPat_Emp + apellidoMat_Emp + Em.nombres_Emp),
A.horasSem_Asi
FROM Empleado Em INNER JOIN Asignacion A ON Em.nss_Emp = A.nss_Emp OPEN CUR_SUELDO

SET @SUMATOTAL = (SELECT SUM(a.horasSem_Asi) FROM Asignacion a)

FETCH CUR_SUELDO INTO @IDEMP, @NOMBEMP, @ASIG

PRINT REPLICATE ('-', 100)


PRINT 'ID EMPLEADO' + SPACE(10) + 'APELLIDOS Y NOMBRES DEL EMPLEADO' + SPACE(10) +
'HORAS TRABAJADOS EN PROYECTO'
PRINT REPLICATE ('-', 100)

WHILE @@FETCH_STATUS=0
BEGIN
SET @ETOTAL +=1
PRINT @IDEMP + SPACE(15) + @NOMBEMP + SPACE(5) + @ASIG

FETCH CUR_SUELDO INTO @IDEMP, @NOMBEMP, @ASIG


END

PRINT '--------------------------------------------------------------------------------------------------------'
PRINT 'TOTAL DE HORAS POR ASIGNACION ES: ' + CAST(@ETOTAL AS CHAR(4)) + SPACE(30) +
'TOTAL DE HORAS:' + SPACE(2) +
CAST(@SUMATOTAL AS CHAR(10))

CLOSE CUR_SUELDO

DEALLOCATE CUR_SUELDO

------------------------------------------------------------------------------------------------------------------------------
--7. CURSOR QUE MUESTRE LA CANTIDAD DE LOS EMPLEADOS NOMBRADOS Y CONTRATADOS
EN EL DISTRITO DE

DECLARE CUR_SITUACIONEMPLEADO CURSOR

FOR SELECT E.nss_Emp, E.nombres_Emp, DIS.nombre_Dis ,E.situacion_Emp ,


CASE
WHEN E.situacion_Emp LIKE 'N' THEN 'NOMBRADO'
when E.situacion_Emp LIKE 'C' THEN 'CONTRATADO'
ELSE 'OTRO'
END AS [SITUACION EN PALABRAS]
FROM Empleado E INNER JOIN Distrito DIS ON E.codigo_Dis=DIS.codigo_Dis where
DIS.nombre_Dis='La Victoria'
ORDER BY [SITUACION EN PALABRAS]

OPEN CUR_SITUACIONEMPLEADO

DECLARE @CODIGOEMP CHAR (5), @NOMB CHAR(30), @DISTRITO CHAR (30), @SITU
CHAR (10), @SITUEMPLE CHAR (10),@SIEM CHAR (10),
@CONT INT =0,@TOTA INT =0 , @CONTN INT=0

FETCH CUR_SITUACIONEMPLEADO INTO @CODIGOEMP , @NOMB , @DISTRITO , @SITU


,@SITUEMPLE
SET @SIEM = @SITUEMPLE

PRINT REPLICATE('-',80)
PRINT 'SITUACION:'+ SPACE(25)+ @SIEM
PRINT REPLICATE(' ',80)

PRINT 'CODIGO'+ SPACE(13)+'NOMBRE'+SPACE(23)+'DISTRITO'+SPACE(15)+'SITUACION'


PRINT REPLICATE('-',80)

WHILE @@FETCH_STATUS=0
BEGIN
SET @TOTA +=1

IF @SITUEMPLE=@SIEM

BEGIN

PRINT @CODIGOEMP+SPACE(12)+@NOMB+
SPACE(1)+@DISTRITO+SPACE(1) +@SITU
SET @CONT+=1

END

ELSE
BEGIN
PRINT REPLICATE('-',80)
PRINT 'TOTAL DE EMPLEADO CON SITUACION '+ @SIEM +'ES: '+
CAST(@CONT AS CHAR(5))
PRINT REPLICATE('-',80)
PRINT 'SITUACION: '+ + SPACE(25) + @SITUEMPLE
PRINT ''
PRINT 'CODIGO'+
SPACE(13)+'NOMBRE'+SPACE(23)+'DISTRITO'+SPACE(15)+'SITUACION'
PRINT REPLICATE('-',80)
SET @SIEM =@SITUEMPLE
SET @TOTA =@CONT
SET @CONT=0

END
FETCH CUR_SITUACIONEMPLEADO INTO @CODIGOEMP , @NOMB , @DISTRITO ,
@SITU ,@SITUEMPLE
END
PRINT REPLICATE('-',80)
PRINT 'TOTAL DE EMPLEADO CON SITUACION ' + @SIEM+ ' ES '+SPACE(5) + CAST(@CONT AS
CHAR(5))
PRINT REPLICATE('-',80)
PRINT ''
PRINT 'TOTAL DE EMPLEADOS CONTRATADOS Y NOMBRADOS: ' + CAST(@TOTA AS CHAR(5))

CLOSE CUR_SITUACIONEMPLEADO
DEALLOCATE CUR_SITUACIONEMPLEADO

--------------------------------------------------------------------------------------------------------------------------------
--8. CURSOR QUE MUESTRE LA DIRECCIÓN DEL EMPLEADO CON SU RESPECTIVO SEGURO SOCIAL
Y NUMERO DE DNI

DECLARE DIR_EMP CURSOR


FOR SELECT nss_Emp, direccion_Emp, dni_Emp FROM Empleado

OPEN DIR_EMP
DECLARE @SEGSOC CHAR(9), @DIR CHAR(50), @DNI CHAR(8)

FETCH NEXT FROM DIR_EMP INTO @SEGSOC, @DIR, @DNI

BEGIN

PRINT
'================================================================================
======'
PRINT 'SEGURO SOCIAL' + SPACE(15) + 'DIRECCIÓN DEL EMPLEADO' + SPACE(25) + 'N°
DNI'
PRINT
'================================================================================
======'

END
WHILE @@FETCH_STATUS=0

BEGIN
PRINT @SEGSOC + SPACE(15) + @DIR + SPACE(2) + @DNI
FETCH NEXT FROM DIR_EMP INTO @SEGSOC, @DIR, @DNI
END

CLOSE DIR_EMP

DEALLOCATE DIR_EMP

ANEXOS
1.- PROCEDIMIENTOS ALMACENADOS
2.- FUNCIONES

CREA UNA FUNCIÓN QUE OBTENGA EL SALARIO FINAL DE CADA EMPLEADO


CREAR UNA FUNCION QUE, BRINDANDO LOS NOMBRES, APELLIDOS Y TELEFONO GENERE UN
CODIGO CON LA SIGUIENTE ESTRUCTURA -- (ABCD-123)
3.- VISTAS
4.- TRIGGERS

También podría gustarte