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