Creación de procedimientos almacenados: ActualizarEmpleado e InsertarMovimiento

 Fecha: lunes 20 de abril de 2026

Hora de inicio: 11:45 a.m.

Hora de finalización: 4:36 p.m.

Horas trabajadas: 2 h 38 min

El plan para esta sesión era implementar los dos SPs que me faltaban: ActualizarEmpleado e InsertarMovimiento. Fue la sesión más larga hasta ahora porque ambos SP son los más complejos que me correspondían, especialmente InsertarMovimiento.

Actividades realizadas

12:00 p.m. – 1:17 p.m. — SP: ActualizarEmpleado

Este SP permite editar el documento de identidad, nombre y puesto de un empleado existente. La estructura la fui pensando sobre la marcha, lo que hizo que tardara un poco más que los anteriores.

Lo primero que definí fue que necesitaba dos SELECT al inicio, uno para obtener los datos actuales del empleado (para la descripción de la bitácora) y otro para obtener el nombre del nuevo puesto que se está asignando. Ese segundo SELECT no era obvio al principio, pero me di cuenta de que si solo guardaba el id del nuevo puesto no podría construir una descripción legible en la bitácora.

Lo segundo fue las validaciones con IF EXISTS. Lo que hace es verificar si existe algún otro empleado activo con el mismo documento o nombre antes de proceder con el UPDATE, excluyendo siempre al propio empleado que se está editando.

Un detalle de diseño que me pareció importante fue que la bitácora se registra siempre al final, independientemente de si la operación fue exitosa o no, y la descripción incluye tanto los datos anteriores como los nuevos.

Una vez terminado lo probé desde SSMS verificando los tres casos: actualización exitosa, documento y nombre duplicados.

3:15 p.m. – 4:36 p.m. — SP: InsertarMovimiento

Este fue el SP más complejo que me tocó implementar. La lógica tiene varias capas y tuve que investigar algunas cosas antes de escribirlo.

Lo primero fue entender bien cómo debía funcionar la lógica de crédito y débito. El SP recibe un @inIdTipoMovimiento y con base en eso obtiene el campo TipoAccion de la tabla TipoMovimiento, que puede ser 'Credito' o 'Debito'. Dependiendo de ese valor, suma o resta el monto al saldo actual para calcular el nuevo saldo. Parecía simple pero tuve que pensar bien la estructura del IF para que los dos casos quedaran correctamente cubiertos.

Lo segundo fue la validación del saldo negativo. Si el nuevo saldo calculado resulta menor que cero, el SP no procede con la inserción y registra el intento fallido en bitácora. Eso significaba que la transacción solo debía abrirse si el saldo era válido.

Lo tercero fue que dentro de la transacción hay dos operaciones: primero el INSERT en la tabla Movimiento y luego el UPDATE del saldo en Empleado. Tuve que asegurarme de que ambas estuvieran dentro del mismo BEGIN TRANSACTION / COMMIT TRANSACTION para garantizar que si una fallaba, la otra también se revirtiera.

Un detalle que me generó duda fue el CAST(@inPostTime AS DATE) para el campo Fecha del movimiento. El SP recibe @inPostTime como DATETIME, pero la fecha del movimiento debe guardarse solo como DATE, sin la parte de la hora. Investigué cómo hacer esa conversión y la solución fue simplemente castear el DATETIME a DATE al momento del INSERT.

Lo probé verificando los dos casos principales: un movimiento de crédito con saldo válido y un intento de débito que dejara el saldo negativo.

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