Se programaron de forma muy habil los siguientes procedimientos:
Este procedimiento se encarga de agregar nuevos temas a la base de datos. Para que este procedimiento sea exitoso, tiene que agregar el tema y además crear una notificación para que pueda ser solicitado por los usuarios.
CREATE PROCEDURE WNSP_AgregarTema
@inCodigo varchar(2),
@inNombre varchar(100)
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
IF NOT EXISTS (SELECT 1 FROM dbo.Temas WHERE Cod = @inCodigo)
BEGIN
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Tema int
BEGIN TRANSACTION Transaccion
--Insertamos el nuevo tema
INSERT INTO [dbo].[Temas]
([Cod]
,[Nombre]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inCodigo
,@inNombre
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
--Insertamos notificaciones para ese tema
SELECT @ID_Tema = ID FROM dbo.Temas WHERE Cod = @inCodigo
INSERT INTO [dbo].[Notificaciones]
([IDTipoFk]
,[Fk_Tema]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(1
,@ID_Tema
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
Así también este otro procedimiento de agregar subtemas
CREATE PROCEDURE WNSP_AgregarSubtema
@inCodigo varchar(3),
@inNombre varchar(100),
@inCodTema varchar(2)
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
IF NOT EXISTS (SELECT 1 FROM dbo.Subtemas WHERE Cod = @inCodigo)
BEGIN
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Subtema int
DECLARE @ID_Tema int
SELECT @ID_Tema = ID FROM dbo.Temas WHERE Cod = @inCodTema
BEGIN TRANSACTION Transaccion
--Insertamos el nuevo subtema
INSERT INTO [dbo].[Subtemas]
([Cod]
,[Nombre]
,[Fk_Tema]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inCodigo
,@inNombre
,@ID_Tema
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
--Insertamos notificaciones para ese subtema
SELECT @ID_Subtema = ID FROM dbo.Subtemas WHERE Cod = @inCodigo
INSERT INTO [dbo].[Notificaciones]
([IDTipoFk]
,[Fk_Subtema]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(2
,@ID_Subtema
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
Y este otro siver para agregar autores
CREATE PROCEDURE WNSP_AgregarAutor
@inNombre varchar(50),
@inEmail varchar(50)
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
IF NOT EXISTS (SELECT 1 FROM dbo.Autores WHERE Email = @inEmail)
BEGIN
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Autor int
BEGIN TRANSACTION Transaccion
--Insertamos el nuevo autor
INSERT INTO [dbo].[Autores]
([Nombre]
,[Email]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inNombre
,@inEmail
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
--Insertamos notificaciones para ese autor
SELECT @ID_Autor = ID FROM dbo.Autores WHERE Email = @inEmail
INSERT INTO [dbo].[Notificaciones]
([IDTipoFk]
,[Fk_Autor]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(3
,@ID_Autor
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
El siguiente lo creamos para agregar usuarios que reciban notificaciones
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_AgregarUsuario
@inNombre varchar(50),
@inEmail varchar(50)
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
IF NOT EXISTS (SELECT 1 FROM dbo.Usuarios WHERE Email = @inEmail)
BEGIN
BEGIN TRANSACTION Transaccion
--Insertamos el nuevo autor
INSERT INTO [dbo].[Usuarios]
([Nombre]
,[Email]
,[Activo]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inNombre
,@inEmail
,'True'
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
ELSE
BEGIN
BEGIN TRANSACTION Transaccion
--Actualizamos su estado a True
UPDATE [dbo].[Usuarios]
SET [Activo] = 'True'
,[PostIn] = @IPCLIENT
,[PostBy] = CURRENT_USER
,[PostDate] = CURRENT_TIMESTAMP
WHERE Email = @inEmail
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
El que viene acá abajo se usa para calificar noticias:
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_CalificarNoticia
@inCalificacion int,
@inFecha date,
@inEmailUsuario varchar(50),
@inIDNoticia int
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Usuario int
SELECT @ID_Usuario = ID FROM dbo.Usuarios WHERE Email = @inEmailUsuario
IF NOT EXISTS (SELECT 1 FROM dbo.Calificaciones WHERE Fk_Usuario = @ID_Usuario AND Fk_Noticia = @inIDNoticia)
BEGIN
BEGIN TRANSACTION Transaccion
INSERT INTO [dbo].[Calificaciones]
([Calificacion]
,[Fecha]
,[Fk_Usuario]
,[Fk_Noticia]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inCalificacion % 6
,@inFecha
,@ID_Usuario
,@inIDNoticia
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
ELSE
BEGIN
BEGIN TRANSACTION Transaccion
UPDATE [dbo].[Calificaciones]
SET [Calificacion] = @inCalificacion % 6
,[Fecha] = @inFecha
,[PostIn] = @IPCLIENT
,[PostBy] = CURRENT_USER
,[PostDate] = CURRENT_TIMESTAMP
WHERE Fk_Usuario = @ID_Usuario
AND Fk_Noticia = @inIDNoticia
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
Este es para comentar las noticias
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_ComentarNoticia
@inComentario varchar(500),
@inFecha date,
@inEmailUsuario varchar(50),
@inIDNoticia int
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Usuario int
SELECT @ID_Usuario = ID FROM dbo.Usuarios WHERE Email = @inEmailUsuario
BEGIN TRANSACTION Transaccion
INSERT INTO [dbo].[Comentarios]
([Comentario]
,[Fecha]
,[Fk_Usuario]
,[Fk_Noticia]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inComentario
,@inFecha
,@ID_Usuario
,@inIDNoticia
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
El siguiente aumenta el contador de visitas de una noticia
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_VisitarNoticia
@inIDNoticia int
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
BEGIN TRANSACTION Transaccion
UPDATE [dbo].[Noticias]
SET [Visitas] = [Visitas] + 1
,[PostIn] = @IPCLIENT
,[PostBy] = CURRENT_USER
,[PostDate] = CURRENT_TIMESTAMP
WHERE ID = @inIDNoticia
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
El siguiente se hizo para poder solicitar notificaciones
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_SolicitarNotificaciones
@inEmailUsuario varchar(50),
@inTipoElemento int,
@inNombreElemento varchar(50)
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Elemento int
DECLARE @ID_Notificacion int
DECLARE @ID_Usuario int
SELECT @ID_Usuario = ID FROM dbo.Usuarios WHERE Email = @inEmailUsuario
--Si es tipo Tema
IF @inTipoElemento = 1
BEGIN
SELECT @ID_Elemento = ID FROM dbo.Temas WHERE Cod = @inNombreElemento
SELECT @ID_Notificacion = ID FROM dbo.Notificaciones WHERE IDTipoFk = @inTipoElemento AND Fk_Tema = @ID_Elemento
BEGIN TRANSACTION Transaccion
INSERT INTO [dbo].[NotificacionesXUsuarios]
([Fk_Usuario]
,[Fk_Notificacion]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@ID_Usuario
,@ID_Notificacion
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
--Si es tipo Subtema
ELSE IF @inTipoElemento = 2
BEGIN
SELECT @ID_Elemento = ID FROM dbo.Subtemas WHERE Cod = @inNombreElemento
SELECT @ID_Notificacion = ID FROM dbo.Notificaciones WHERE IDTipoFk = @inTipoElemento AND Fk_Subtema = @ID_Elemento
BEGIN TRANSACTION Transaccion
INSERT INTO [dbo].[NotificacionesXUsuarios]
([Fk_Usuario]
,[Fk_Notificacion]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@ID_Usuario
,@ID_Notificacion
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
--Si es tipo Autor
ELSE IF @inTipoElemento = 3
BEGIN
SELECT @ID_Elemento = ID FROM dbo.Autores WHERE Email = @inNombreElemento
SELECT @ID_Notificacion = ID FROM dbo.Notificaciones WHERE IDTipoFk = @inTipoElemento AND Fk_Autor = @ID_Elemento
BEGIN TRANSACTION Transaccion
INSERT INTO [dbo].[NotificacionesXUsuarios]
([Fk_Usuario]
,[Fk_Notificacion]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@ID_Usuario
,@ID_Notificacion
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
Este SP es muy sencillo. Se encarga de crear una nueva portada diaria
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_GenerarPortada
@inFecha date
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Portada int
BEGIN TRANSACTION Transaccion
--Se inserta una entrada para una nueva portada
INSERT INTO [dbo].[Portadas]
([Fecha]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inFecha
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
SET @ID_Portada = SCOPE_IDENTITY()
--Se insertan las ultimas 5 noticias
INSERT INTO [dbo].[NoticiasXPortadas]
([Activo]
,[OrdenDespliegue]
,[Fk_Portada]
,[Fk_Noticia]
,[PostIn]
,[PostBy]
,[PostDate])
SELECT TOP (5) 'True'
,'D'
,@ID_Portada
,N.ID
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP
FROM dbo.Noticias N
ORDER BY N.ID DESC
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
Esta es una función generadora de texto que será enviado por la simulación de correo electrónico
USE [III Proyecto - WebNews]
GO
CREATE FUNCTION WNFN_TextoEnvio (@inID_Usuario int, @inID_Autor int, @inID_Tema int, @inID_Subtema int, @inID_Noticia int, @inFecha date)
RETURNS varchar(max)
AS
BEGIN
DECLARE @outputTexto varchar(max)
DECLARE @NombreUsuario varchar(50)
DECLARE @EmailUsuario varchar(50)
DECLARE @NombreAutor varchar(50)
DECLARE @NombreTema varchar(100)
DECLARE @NombreSubtema varchar(100)
DECLARE @TituloNoticia varchar(200)
SELECT @NombreUsuario = Nombre, @EmailUsuario = Email FROM dbo.Usuarios WHERE ID = @inID_Usuario
SELECT @NombreAutor = Nombre FROM dbo.Autores WHERE ID = @inID_Autor
SELECT @NombreTema = Nombre FROM dbo.Temas WHERE ID = @inID_Tema
SELECT @NombreSubtema = Nombre FROM dbo.Subtemas WHERE ID = @inID_Subtema
SELECT @TituloNoticia = Titulo FROM dbo.Noticias WHERE ID = @inID_Noticia
SET @outputTexto = 'Para: ' + @NombreUsuario + ' (' + @EmailUsuario + ')' + CHAR(13)+CHAR(10) +
'Fecha: ' + CONVERT(varchar(8), @inFecha, 101) + CHAR(13)+CHAR(10) +
CHAR(13)+CHAR(10) +
'El autor ' + @NombreAutor + ' ha publicado una nueva noticia titulada:' + CHAR(13)+CHAR(10) +
char(9) + @TituloNoticia + CHAR(13)+CHAR(10) +
'basado en la subcategoria ' + @NombreSubtema + ' de la categoria de ' + @NombreTema + '.' + CHAR(13)+CHAR(10) +
'Lo invitamos a enterarse de los detalles de esta noticia visitando nuestro noticiero web.' + CHAR(13)+CHAR(10) +
'Atte: nacion.com'
RETURN @outputTexto
END
GO
Por último, el siguiente SP será quien inserta las nuevas noticias y además notificará por medio de el envio de correo electrónico a los usuarios que hallan solicitado notificaciones sobre ese tema, subtema o autor.
USE [III Proyecto - WebNews]
GO
CREATE PROCEDURE WNSP_AgregarNoticia
@inTitulo varchar(200),
@inTexto varchar(MAX),
@inFecha date,
@inEmailAutor varchar(50),
@inCodSubtema varchar(3)
AS
BEGIN
BEGIN TRY
SET LANGUAGE Spanish
SET NOCOUNT ON
DECLARE @IPCLIENT VARCHAR(15)
SELECT @IPCLIENT = CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
DECLARE @ID_Subtema int
DECLARE @ID_Autor int
DECLARE @ID_Tema int
DECLARE @ID_Noticia int
SELECT @ID_Subtema = ID, @ID_Tema = Fk_Tema FROM dbo.Subtemas WHERE Cod = @inCodSubtema
SELECT @ID_Autor = ID FROM dbo.Autores WHERE Email = @inEmailAutor
BEGIN TRANSACTION Transaccion
--Se inserta la noticia
INSERT INTO [dbo].[Noticias]
([Titulo]
,[Texto]
,[Fecha]
,[Visitas]
,[Fk_Autor]
,[Fk_Subtema]
,[PostIn]
,[PostBy]
,[PostDate])
VALUES
(@inTitulo
,@inTexto
,@inFecha
,0
,@ID_Autor
,@ID_Subtema
,@IPCLIENT
,CURRENT_USER
,CURRENT_TIMESTAMP)
SET @ID_Noticia = SCOPE_IDENTITY()
--Se mandan las notificaciones
INSERT INTO [dbo].[Envios]
([TextoEnvio]
,[Fecha]
,[Fk_Usuario]
,[Fk_Noticia]
,[PostIn]
,[PostBy]
,[PostDate])
SELECT dbo.WNFN_TextoEnvio(U.ID, @ID_Autor, @ID_Tema, @ID_Subtema, @ID_Noticia, @inFecha), @inFecha, U.ID, @ID_Noticia, @IPCLIENT, CURRENT_USER, CURRENT_TIMESTAMP
FROM dbo.Usuarios U, dbo.NotificacionesXUsuarios X, dbo.Notificaciones N
WHERE U.ID = X.Fk_Usuario
AND X.Fk_Notificacion = N.ID
AND (N.Fk_Autor = @ID_Autor
OR N.Fk_Subtema = @ID_Subtema
OR N.Fk_Tema = @ID_Tema)
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN Transaccion
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN Transaccion
END
END CATCH
END
GO
No hay comentarios:
Publicar un comentario