Sesión #7

 Duración 3 horas y media. 1:00pm - 4:30pm

Se realizó el SP de Insertar empleado, corrigiendo el realizado anteriormente ya que este presentaba fallas a la hora de registrar los errores en la Bitácora de eventos. Esto se corrigió al ver que la cantidad de ENDs no era igual a la cantidad de BEGINs, esto ocacionaba que nunca entrara a la condición ELSE que añade el evento a la bitácora.

La versión corregida del SP es la siguiente: 

ALTER PROCEDURE [dbo].[InsertarEmpleado]
    @Puesto VARCHAR(128),
    @ValorDocumentoIdentidad VARCHAR(128),  
    @Nombre VARCHAR(128),
    @FechaContratacion DATE,
    @Username VARCHAR(128),
    @PostInIP VARCHAR(64),
    @OutResultCode INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        SET @OutResultCode = 0;
       
        IF EXISTS (SELECT 1 FROM dbo.Empleado WHERE Nombre = @Nombre)
        BEGIN
            SET @OutResultCode = 50005;

            INSERT INTO dbo.bitacoraEvento(
                IdTipoEvento,
                IdUsuario,
                Fecha,
                Descripcion,
                PostInIP,
                PostTime
            ) VALUES (
                5,
                (SELECT Id FROM dbo.Usuario WHERE Username = @Username),
                GETDATE(),
                'Error: Nombre duplicado en la inserción del empleado',
                @PostInIP,
                GETDATE()
            );
        END
        ELSE
        BEGIN
            IF EXISTS (SELECT 1 FROM dbo.Empleado WHERE ValorDocumentoIdentidad = @ValorDocumentoIdentidad)
            BEGIN
                SET @OutResultCode = 50004;

                INSERT INTO dbo.bitacoraEvento(
                    IdTipoEvento,
                    IdUsuario,
                    Fecha,
                    Descripcion,
                    PostInIP,
                    PostTime
                ) VALUES (
                    5,
                    (SELECT Id FROM dbo.Usuario WHERE Username = @Username),
                    GETDATE(),
                    'Error: Documento de identidad duplicado en la inserción del empleado',
                    @PostInIP,
                    GETDATE()
                );
            END
            ELSE
            BEGIN
                DECLARE @IdPuesto INT;
                SELECT @IdPuesto = Id FROM dbo.Puesto WHERE Nombre = @Puesto;
               
                IF @IdPuesto IS NULL
                BEGIN
                    SET @OutResultCode = 50008;
                END
                ELSE
                BEGIN
                    BEGIN TRANSACTION;

                    INSERT INTO dbo.Empleado (IdPuesto, ValorDocumentoIdentidad, Nombre, FechaContratacion)
                    VALUES (@IdPuesto, @ValorDocumentoIdentidad, @Nombre, @FechaContratacion);

                    INSERT INTO dbo.bitacoraEvento(
                        IdTipoEvento,
                        IdUsuario,
                        Fecha,
                        Descripcion,
                        PostInIP,
                        PostTime
                    ) VALUES (
                        6,
                        (SELECT Id FROM dbo.Usuario WHERE Username = @Username),
                        GETDATE(),
                        'Inserción exitosa del empleado',
                        @PostInIP,
                        GETDATE()
                    );

                    COMMIT TRANSACTION;
                    SET @OutResultCode = 0;
                END
            END
        END

        SELECT @OutResultCode AS OutResultCode;

    END TRY
    BEGIN CATCH
        IF XACT_STATE() <> 0
        BEGIN
            ROLLBACK TRANSACTION;
        END

        INSERT INTO dbo.DBErrors VALUES (
            SUSER_SNAME(),
            ERROR_NUMBER(),
            ERROR_STATE(),
            ERROR_SEVERITY(),
            ERROR_LINE(),
            ERROR_PROCEDURE(),
            ERROR_MESSAGE(),
            GETDATE()
        );

        SET @OutResultCode = 50008;
        SELECT @OutResultCode AS OutResultCode;
    END CATCH;

    SET NOCOUNT OFF;
END;
GO

También para acceder de manera correcta a los puestos y que estos se muestren en una barra desplegable, se creó un SP peuqeño que unicamente obtiene los nombres de la tabla puestos

CREATE PROCEDURE [dbo].[GetPuestos]
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
    SELECT Nombre FROM dbo.Puesto;
    END TRY
    BEGIN CATCH
        INSERT INTO dbo.DBErrors VALUES (
            SUSER_SNAME(),
            ERROR_NUMBER(),
            ERROR_STATE(),
            ERROR_SEVERITY(),
            ERROR_LINE(),
            ERROR_PROCEDURE(),
            ERROR_MESSAGE(),
            GETDATE()
        );
    END CATCH;
    SET NOCOUNT Off;
END;
GO

Así mismo, se creó un SP de la misma naturaleza para acceder a los errores en la tabla Error, esto permite que a la hora de capturar un OutResultCode diferente a 0, se ejecute este SP para obenter el error correspondiente.

CREATE PROCEDURE [dbo].[GetError]
    @Codigo INT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
    SELECT Descripcion FROM dbo.Error
    WHERE Codigo = @Codigo;
    END TRY
    BEGIN CATCH
        INSERT INTO dbo.DBErrors VALUES (
            SUSER_SNAME(),
            ERROR_NUMBER(),
            ERROR_STATE(),
            ERROR_SEVERITY(),
            ERROR_LINE(),
            ERROR_PROCEDURE(),
            ERROR_MESSAGE(),
            GETDATE()
        );
    END CATCH;
    SET NOCOUNT Off;
END;
GO

Finalmente se realzó la capa de presentación de insertar empleado que hubo que realizarle una modificación a la presentada el semestre pasado para que la misma mostrara los mensajes de error obtenidos del Servidor, esto mediante el uso del framework AJAX, que permite una interacción fácil de archivos JSON entre el servidor y el cliente.






Comentarios

Entradas populares de este blog

Sesión #9