jueves, 17 de noviembre de 2016

Se crean todos los procedimientos

(6 horas)

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