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
Publicar un comentario