Creación de procedimientos almacenados: ConsultarEmpleado, EliminarEmpleado y RegistrarIntentoEliminarEmpleado

Fecha: domingo 19 de abril de 2026

Hora de inicio: 8:45 a.m.

Hora de finalización: 1:42 p.m.

Horas trabajadas: 1 h 57 min

El plan para esta sesión era implementar tres de los SPs que me correspondían para el módulo de empleados: consultar, eliminar y registrar el intento de eliminación. Fue una sesión larga pero con pausas, no trabajé de corrido.

Actividades realizadas

8:45 a.m. – 9:25 a.m. — SP: ConsultarEmpleado

Antes de escribir el código, me detuve a investigar varias cosas que necesitaba para este SP y que no había usado antes. La principal fue INNER JOIN, que aparece en el SELECT para traer el nombre del puesto desde la tabla Puesto relacionándola con Empleado a través de IdPuesto. Sabía conceptualmente qué era un join, pero nunca lo había escrito en un SP, así que busqué ejemplos y me aseguré de entender la sintaxis antes de continuar.

Otra cosa que tuve que investigar fue cómo construir el string de descripción para la bitácora. Para esto, combiné CAST para convertir valores numéricos a texto e ISNULL para evitar que la concatenación falle si algún campo viene nulo.

Una vez terminado lo probé desde SSMS para verificar ambos casos: un empleado que existe y uno que no.

10:40 a.m. – 11:31 a.m. — SP: EliminarEmpleado

Este SP lo construí usando ConsultarEmpleado como base para el borrado lógico. El tiempo entre commits se explica porque hubo pausas y porque tuve que investigar varias cosas nuevas para mí.

Lo primero fue entender BEGIN TRANSACTION y COMMIT TRANSACTION. Nunca los había usado y era la primera vez que escribía una transacción. Lo que aprendí es que envolver el UPDATE dentro de una transacción garantiza que si algo falla en medio de la operación, el cambio no quede a medias.

Lo segundo fue el UPDATE en sí, también nuevo para mí en el contexto de un SP.

Lo tercero, y lo que más me costó entender, fue XACT_STATE() en el bloque CATCH. Lo vi en un recurso que encontré y lo implementé. Lo que hace es verificar el estado de la transacción activa antes de intentar hacer el ROLLBACK, si XACT_STATE() es distinto de cero, significa que hay una transacción activa (ya sea confirmable o no confirmable), y solo entonces se ejecuta el ROLLBACK.

También tuve que investigar ROLLBACK TRANSACTION, que va de la mano con lo anterior.

Una vez terminado lo probé, verificando el borrado de un empleado existente y el intento sobre uno que no existía.

1:15 a.m. – 1:42 p.m. — SP: RegistrarIntentoEliminarEmpleado

Este SP no estaba en el plan original, surgió cuando analicé el requerimiento R7 de trazabilidad. El requerimiento indica que se debe registrar en bitácora el "intento de borrado", que corresponde al momento en que el sistema le muestra al usuario la alerta de confirmación, antes de que confirme o cancele. El problema es que ese evento ocurre en un momento diferente al borrado real, y mezclar ambas responsabilidades en EliminarEmpleado me parecía confuso. Terminé tomando la decisión de separarlo en un SP propio.

La estructura es similar a los anteriores, pues hace un SELECT para obtener los datos del empleado, construye la descripción de la bitácora con esos datos y llama a RegistrarBitacora con el tipo de evento 9 ("Intento de borrado"). Si el empleado no existe o ya está inactivo, simplemente no registra nada.

El tiempo entre el commit de EliminarEmpleado y este fue también por pausas, no porque el SP fuera especialmente complejo, ya tenía el patrón claro de los anteriores.

Lo probé para verificar que el registro en bitácora quedara correcto.

Forma de trabajo del equipo

Nos mantuvimos en contacto por WhatsApp para coordinarnos sobre el estado general del proyecto.

Referencias:

Comentarios

Entradas más populares de este blog

Creación del SP de Cargar Datos

Implementación de funcionalidades: Editar Empleado y Eliminar Empleado

Implementación de funcionalidad: Consultar Empleado