Sesión #4

 Sesión #4, duración 5 horas 7:00pm-12mn

En esta sesión se trabajó en la creación del SP de cargar XML, el mismo funcionó y cargó los datos en 427ms.

ALTER PROCEDURE CargarDatosDesdeXML
    @xmlData XML
AS
BEGIN
    BEGIN TRANSACTION;
    BEGIN TRY
        -- Insertar en la tabla Puesto
        INSERT INTO dbo.Puesto (Nombre, SalarioxHora)
        SELECT
            Puesto.value('@Nombre', 'VARCHAR(128)'),
            Puesto.value('@SalarioxHora', 'MONEY')
        FROM @xmlData.nodes('/Datos/Puestos/Puesto') AS T(Puesto);

        -- Insertar en la tabla TipoEvento
        INSERT INTO dbo.TipoEvento (Id, Nombre)
        SELECT
            TipoEvento.value('@Id', 'INT'),
            TipoEvento.value('@Nombre', 'VARCHAR(128)')
        FROM @xmlData.nodes('/Datos/TiposEvento/TipoEvento') AS T(TipoEvento);

        -- Insertar en la tabla TipoMovimiento
        INSERT INTO dbo.TipoMovimiento (Id, Nombre, TipoAccion)
        SELECT
            TipoMovimiento.value('@Id', 'INT'),
            TipoMovimiento.value('@Nombre', 'VARCHAR(128)'),
            TipoMovimiento.value('@TipoAccion', 'VARCHAR(128)')
        FROM @xmlData.nodes('/Datos/TiposMovimientos/TipoMovimiento') AS T(TipoMovimiento);

        -- Insertar en la tabla Usuario
        INSERT INTO dbo.Usuario (Id, Username, Pass)
        SELECT
            Usuario.value('@Id', 'INT'),
            Usuario.value('@Nombre', 'VARCHAR(128)'),
            Usuario.value('@Pass', 'VARCHAR(128)')
        FROM @xmlData.nodes('/Datos/Usuarios/usuario') AS T(Usuario);

        -- Insertar en la tabla Empleado
        INSERT INTO dbo.Empleado (IdPuesto, ValorDocumentoIdentidad, Nombre, FechaContratacion)
        SELECT
            (SELECT Id FROM dbo.Puesto WHERE Nombre = Empleado.value('@Puesto', 'VARCHAR(128)')),
            Empleado.value('@ValorDocumentoIdentidad', 'VARCHAR(128)'),
            Empleado.value('@Nombre', 'VARCHAR(128)'),
            Empleado.value('@FechaContratacion', 'DATE')
        FROM @xmlData.nodes('/Datos/Empleados/empleado') AS T(Empleado);

        -- Insertar en la tabla Movimiento
        INSERT INTO dbo.Movimiento (IdEmpleado, IdTipoMovimiento, Fecha, Monto, NuevoSaldo, IdPostByUser, PostInIP, PostTime)
        SELECT
            (SELECT Id FROM dbo.Empleado WHERE ValorDocumentoIdentidad = Movimiento.value('@ValorDocId', 'VARCHAR(128)')),
            (SELECT Id FROM dbo.TipoMovimiento WHERE Nombre = Movimiento.value('@IdTipoMovimiento', 'VARCHAR(128)')),
            Movimiento.value('@Fecha', 'DATETIME'),
            Movimiento.value('@Monto', 'INT'),
            Movimiento.value('@Monto', 'INT'),  -- Ajustar el nuevo saldo correctamente según la lógica
            (SELECT Id FROM dbo.Usuario WHERE Username = Movimiento.value('@PostByUser', 'VARCHAR(128)')),
            Movimiento.value('@PostInIP', 'VARCHAR(64)'),
            Movimiento.value('@PostTime', 'DATETIME')
        FROM @xmlData.nodes('/Datos/Movimientos/movimiento') AS T(Movimiento);

        -- Insertar en la tabla Error
        INSERT INTO dbo.Error (Codigo, Descripcion)
        SELECT
            Error.value('@Codigo', 'INT'),
            Error.value('@Descripcion', 'VARCHAR(128)')
        FROM @xmlData.nodes('/Datos/Error/error') AS T(Error);

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;
        -- Manejar el error
        INSERT INTO dbo.DBErrors (UserName, Number, State, Severity, Line, [Procedure], Message, DateTime)
        VALUES (
            SYSTEM_USER,
            ERROR_NUMBER(),
            ERROR_STATE(),
            ERROR_SEVERITY(),
            ERROR_LINE(),
            ERROR_PROCEDURE(),
            ERROR_MESSAGE(),
            GETDATE()
        );
    END CATCH;
END;
GO

También se creó el SP que inserta el empleado, el mismo ya existía del semestre pasado, por lo cual solo se mejoró el mismo y ahora funciona:

CREATE PROCEDURE [dbo].[InsertarEmpleado]
    @Puesto VARCHAR(128) ,
    @ValorDocumentoIdentidad VARCHAR(128),  
    @Nombre VARCHAR(128),
    @FechaContratacion DATE,
    @Username VARCHAR(128),
    @PostInIP VARCHAR(64),
    @PostTime DATETIME,
    @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;
    END

    ELSE

    BEGIN
    IF EXISTS (SELECT 1 FROM dbo.Empleado WHERE ValorDocumentoIdentidad = @ValorDocumentoIdentidad)
    BEGIN
        SET @OutResultCode=50004;
    END

    ELSE
    BEGIN
        DECLARE @IdPuesto INT;
        SELECT @IdPuesto = Id FROM dbo.Puesto WHERE Nombre = @Puesto;
        BEGIN TRANSACTION;
       
        INSERT INTO dbo.Empleado
        (
            IdPuesto,
            ValorDocumentoIdentidad,  
            Nombre,
            FechaContratacion
        )
        VALUES
        (
            @IdPuesto,
            @ValorDocumentoIdentidad,  
            @Nombre,
            @FechaContratacion
        );
        SET @OutResultCode=0;
        BEGIN
        COMMIT TRANSACTION;
        BEGIN
   
        SELECT @OutResultCode AS OutResultCode;
        INSERT INTO dbo.bitacoraEvento(
        IdTipoEvento,
        IdUsuario,
        Fecha,
        Descripcion,
        PostInIP,
        PostTime
    ) VALUES (
        6,
        (SELECT Id FROM dbo.Usuario WHERE Username = @Username),
        GETDATE(),
        'Insercion no exitosa',
        @PostInIP,
        @PostTime
    );

    END
        END
    END--2DO ELSE
    END--1ER ELSE


    IF @OutResultCode=0
    BEGIN
        SELECT @OutResultCode AS OutResultCode;  
    END
    ELSE
    IF @OutResultCode=50004
    BEGIN
   
        SELECT @OutResultCode AS OutResultCode;
        INSERT INTO dbo.bitacoraEvento(
        IdTipoEvento,
        IdUsuario,
        Fecha,
        Descripcion,
        PostInIP,
        PostTime
    ) VALUES (
        5,
        (SELECT Id FROM dbo.Usuario WHERE Username = @Username),
        GETDATE(),
        'Insercion no exitosa',
        @PostInIP,
        @PostTime
    );

    END
    ELSE
    IF @OutResultCode=50005
    BEGIN
        SELECT @OutResultCode AS OutResultCode;
        BEGIN
   
        INSERT INTO dbo.bitacoraEvento(
        IdTipoEvento,
        IdUsuario,
        Fecha,
        Descripcion,
        PostInIP,
        PostTime
    ) VALUES (
        5,
        (SELECT Id FROM dbo.Usuario WHERE Username = @Username),
        GETDATE(),
        'Insercion no exitosa',
        @PostInIP,
        @PostTime
    );

    END  
    END

    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;



Comentarios

Entradas populares de este blog

Sesión #9