Entrada 8 (sp_UpdateEmpleado y sp_GetEmpleadoById v2)

  Fecha: 23/04/2026

Inicio: [1:42] | Fin: [2:33] || Total: [51 minutos]

Presentes: Sebastián Ramírez Abarca

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
¿QUÉ HICIMOS HOY?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se avanzó con los store procedures, se terminó la primera versión de sp_UpdateEmpleado, no está probado.
Correción en el nombre del parámetro @ValorDocumentoIdentidad, le faltaba el in al inicio.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PROBLEMAS ENCONTRADOS Y CÓMO SE RESOLVIERON
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Me parece que avancé lento porque me puse a adelantar porque no podía dormir aunque tampoco estaba del todo despierto.
S: Intenté con mojarme la cara cada cierto tiempo y beber agua fría de vez en cuando.

2. Sintaxis incorrecta cerca de ';'.  A la espera CATCH, CONVERSATION, o bien TRY.
y Sintaxis incorrecta cerca de 'GO'.
S: No había escrito END CATCH para cerrar el catch

2. Noté que en sp_GetEmpleadoById me faltó ponerle el in al parámetro @ValorDocumentoIdentidad.
S: Se solucionó cambiando en todas sus apariciones a @inValorDocumentoIdentidad.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DUDAS Y DIVERGENCIAS DE CRITERIO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. No hubo dudas ni divergencias en esta sesión.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AVANCE DEL CÓDIGO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sp_UpdateEmpleado:
USE VacacionesDB;
GO

-- =====================================================
-- SP: Actualizar un empleado
-- =====================================================
DROP PROCEDURE IF EXISTS sp_UpdateEmpleado;
GO

CREATE PROCEDURE sp_UpdateEmpleado
    @inValorDocumentoIdentidadAntes VARCHAR(32),
    @inValorDocumentoIdentidadDespues VARCHAR(32),
    @inNombreAntes VARCHAR(128),
    @inNombreDespues VARCHAR(128),
    @inIdPuestoAntes INT,
    @inIdPuestoDespues INT,
    @inIdUsuario INT,
    @inIpPostIn VARCHAR(64),
    @inPostTime DATETIME,
    @outResultCode INT OUTPUT
AS
BEGIN
   
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @idEmpleado INT
        , @nombrePuestoAntes VARCHAR(128)
        , @nombrePuestoDespues VARCHAR(128)
        , @saldoVacaciones DECIMAL(10,2)
        , @idTipoEventoSuccess INT
        , @idTipoEventoFail INT
        , @descripcion VARCHAR(512);

    SET @outResultCode = 0;

    BEGIN TRY
       
        SELECT @idTipoEventoSuccess = t.id
        FROM dbo.TipoEvento t
        WHERE Nombre = 'Update exitoso';

        SELECT @idTipoEventoFail = t.id
        FROM dbo.TipoEvento t
        WHERE Nombre = 'Update no exitoso';

        -- Obtener id de empleado y saldoVacaciones
        SELECT
            @idEmpleado = e.id
            , @saldoVacaciones = e.SaldoVacaciones
        FROM dbo.Empleado e
        WHERE e.ValorDocumentoIdentidad = @inValorDocumentoIdentidadAntes
            AND e.EsActivo = 1;

        -- Obtener nombres de puestos para la bitacora
        SELECT @nombrePuestoAntes = p.Nombre
        FROM dbo.Puesto p
        WHERE p.id = @inIdPuestoAntes;

        SELECT @nombrePuestoDespues = p.Nombre
        FROM dbo.Puesto p
        WHERE p.id = @inIdPuestoDespues;

        -- Validar ValorDocumentoIdentidad no duplicado
        IF EXISTS (
            SELECT 1
            FROM dbo.Empleado e
            WHERE e.ValorDocumentoIdentidad = @inValorDocumentoIdentidadDespues
                AND e.EsActivo = 1
                AND e.id <> @idEmpleado -- que no sea el mismo empleado
        )
        BEGIN
            SET @outResultCode = 50006

            SET @descripcion =
                'Error: ' + (SELECT Descripcion FROM Error WHERE Codigo = 50006)
                + ' | DocAntes: '    + @inValorDocumentoIdentidadAntes
                + ' | NombreAntes: ' + @inNombreAntes
                + ' | PuestoAntes: ' + ISNULL(@nombrePuestoAntes, '')
                + ' | DocDespues: '    + @inValorDocumentoIdentidadDespues
                + ' | NombreDespues: ' + @inNombreDespues
                + ' | PuestoDespues: ' + ISNULL(@nombrePuestoDespues, '')
                + ' | Saldo: ' + CAST(@saldoVacaciones AS VARCHAR(20));

            INSERT INTO dbo.BitacoraEvento (idTipoEvento,Descripcion, idUsuario, IpPostIn, PostTime)
            VALUES (@idTipoEventoFail, @descripcion, @inIdUsuario, @inIpPostIn, @inPostTime);

            RETURN;
        END

        -- Validar nombre no duplicado
        IF EXISTS (
            SELECT 1
            FROM dbo.Empleado e
            WHERE e.Nombre = @inNombreDespues
                AND e.EsActivo = 1
                AND e.id = @idEmpleado
        )
        BEGIN
            SET @outResultCode = 50007

            SET @descripcion =
                'Error: ' + (SELECT Descripcion FROM Error WHERE Codigo = 50007)
                + ' | DocAntes: '    + @inValorDocumentoIdentidadAntes
                + ' | NombreAntes: ' + @inNombreAntes
                + ' | PuestoAntes: ' + ISNULL(@nombrePuestoAntes, '')
                + ' | DocDespues: '    + @inValorDocumentoIdentidadDespues
                + ' | NombreDespues: ' + @inNombreDespues
                + ' | PuestoDespues: ' + ISNULL(@nombrePuestoDespues, '')
                + ' | Saldo: ' + CAST(@saldoVacaciones AS VARCHAR(20));

            INSERT INTO dbo.BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
            VALUES (@idTipoEventoFail, @descripcion, @inIdUsuario, @inIpPostIn, @inPostTime);

            RETURN;
        END

        -- Update:
        BEGIN TRANSACTION;

            UPDATE dbo.Empleado
            SET ValorDocumentoIdentidad = @inValorDocumentoIdentidadDespues
                , Nombre = @inNombreDespues
                , idPuesto = @inIdPuestoDespues
            WHERE id <> @idEmpleado;

            SET @descripcion =
                'DocAntes: '    + @inValorDocumentoIdentidadAntes
                + ' | NombreAntes: ' + @inNombreAntes
                + ' | PuestoAntes: ' + ISNULL(@nombrePuestoAntes, '')
                + ' | DocDespues: '    + @inValorDocumentoIdentidadDespues
                + ' | NombreDespues: ' + @inNombreDespues
                + ' | PuestoDespues: ' + ISNULL(@nombrePuestoDespues, '')
                + ' | Saldo: ' + CAST(@saldoVacaciones AS VARCHAR(20));

            INSERT INTO BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
            VALUES (@idTipoEventoSuccess, @descripcion, @inIdUsuario, @inIpPostIn, @inPostTime);

        COMMIT TRANSACTION;

        SET @outResultCode = 0;

    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

        INSERT INTO dbo.DBError (UserName, Number, State, Severity, Line, [Procedure], Message, DateTime)
        VALUES (
            SYSTEM_USER
            , ERROR_NUMBER()
            , CAST(ERROR_STATE() AS VARCHAR(32))
            , CAST(ERROR_SEVERITY() AS VARCHAR(32))
            , ERROR_LINE()
            , ISNULL(ERROR_PROCEDURE(), 'sp_UpdateEmpleado')
            , ERROR_MESSAGE()
            , GETDATE()
        );

        SET @descripcion =
            'Error: ' + (SELECT Descripcion FROM Error WHERE Codigo = 50008)
            + ' | DocAntes: '    + @inValorDocumentoIdentidadAntes
            + ' | NombreAntes: ' + @inNombreAntes
            + ' | PuestoAntes: ' + ISNULL(@nombrePuestoAntes, '')
            + ' | DocDespues: '    + @inValorDocumentoIdentidadDespues
            + ' | NombreDespues: ' + @inNombreDespues
            + ' | PuestoDespues: ' + ISNULL(@nombrePuestoDespues, '')
            + ' | Saldo: ' + CAST(@saldoVacaciones AS VARCHAR(20));

        INSERT INTO BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
        VALUES (@idTipoEventoFail, @descripcion, @inIdUsuario, @inIpPostIn, @inPostTime);

        SET @outResultCode = 50008;
   
    END CATCH

END;
GO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MORALEJAS / BUENAS PRÁCTICAS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. De ser posible, no codear cuando no se está dormido pero tampoco realmente despierto.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRÓXIMA SESIÓN: ¿QUÉ SIGUE?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Todavía por definir, no estoy pensando bien.

Comentarios

Entradas más populares de este blog

Entrada 16 (Controlador de movimientos)

Entrada 20 (Lógica de insertarMovimientos, conectarla y probarla)

Entrada 21 (Análisis de resultados)