Implementación de los SP: Listar Movimientos y Logout
Fecha: 18 de abril 2026
Hora de inicio: 6:00 p.m.
Hora de finalización: 8:00 p.m.
Horas trabajadas: 2h
Después de implementar los SPs de Login e InsertarEmpleado, el siguiente paso era completar los SPs necesarios para las funcionalidades de consulta de movimientos y cierre de sesión. Este trabajo fue más sencillo dado que ambos SP son bastante más simples que los creados más temprano.
Actividades realizadas
6:00 p.m. - 7:20 p.m.
Implementación de ListarMovimientos
Este SP es uno de los más importantes en términos de funcionalidad de negocio, ya que permite a los usuarios consultar el historial de movimientos (ganancias y disfrutes de vacaciones) de un empleado específico. A diferencia de SPs anteriores que devuelven un solo resultset, ListarMovimientos devuelve dos resultsets: primero los datos básicos del empleado, y luego la lista de todos sus movimientos. También es improtante notar que en esta caso no hubo registro en bitácora porque en el enunciado no había un evento relacionado exactamente con esto.
El flujo del SP es:
Primer SELECT - datos del empleado: Se consulta la tabla Empleado filtrando por id y verificando que sea un empeado activo. Se devuelven tres columnas.
Segundo SELECT- lista de movimientos: Se consulta la tabla Movimiento con dos INNER JOINs:
JOIN a TipoMovimieno para obtener el nombre del tipo de movimiento (ej: "Venta de vacaciones", "Disfrute de vacaciones")
JOIN a Usuario para obtener el username de la persona que registró el movimiento.
El resultado se ordena por fecha DESC (fechas más recientes primero), de modo que el usuario ve el historial del más nuevo al más antiguo.
7:20 p.m. - 8:00 p.m.
Implementación de Logout
Este SP es el más simple del proyecto. Su única función es registrar en BitacoraEvento que el usuario cerró sesión. A diferencia de otros SPs, no hya lógica compleja.
El flujo es:
Recibe el id del usuario (que viene de session [id_usuario] en Flask) y la IP del cliente.
Llama a RegistrarBitacora con evento tipo 4 y una descripción vacía (ya que logout no requiere detalles adicionales).
Una observación: no se valida que el usuario exista antes de hacer logout. Esto porque el id viene de la sesión de Flask que solo se crea después de un login exitoso, por lo que el usuario ya fue validado en ese momento.
Errores encontrados
Error 1: Navegación entre múltiples resultsets en pyodbc con ListarMovimientos
Descripción: Al ejecutar ListarMoviemientos desde Python, pyodbc devolvía datos pero era difícil saber cuál era el primer resultset, cuál el segundo y cuál el resultcode
Causa: SQL Server devuelve tres resultsets en orden:
- Los datos del empleado (1 fila)
- Los movimientos del empleado (N filas)
- El SELECT @outresultCode (1 fila)
Sin una estrategia clara de navegación, el código Python podría leer los datos en el orden incorrecto o intentar aplicar fetchcall en un resultset que solo tiene una fila.
Solución: Usar cursor.next() explícitamente para navegar entre resultsets en orden:
Este patrón es más simple que el While True usado en Login (donde hay múltiples llamadas a bitácora intercaladas), ya que aquí sabemos exactamente cuántos resultsets hay y en qué orden vienen.
Forma de trabajo del equipo
Buenas prácticas descubiertas
- Los SPs de lectura pura (SELECT sin INSERT/UPDATE/DELETE) pueden ser más simples. No necesitan transacciones, no necesitan registrar en bitácora si no está definido en los requerimientos, y pueden enfocarse puramente en devolver datos.
- Cuando un SP devuelve múltiples resultsets, la navegación en Python debe ser explícita.
- Los JOINs permiten obtener datos de múltiples tablas en una sola consulta. En ListarMovimientos, los JOINs a TipoMovimeinto y Usuario evitaron tener que hacer tres consultas separadas.
Referencias consultadas
- Microsoft Docs — INNER JOIN: https://learn.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql
- Microsoft Docs — ORDER BY DESC: https://learn.microsoft.com/en-us/sql/t-sql/queries/select-order-by-transact-sql
- pyodbc Documentation — Multiple result sets: https://github.com/mkleehammer/pyodbc/wiki
- Flask Documentation — Session management: https://flask.palletsprojects.com/en/stable/
- Flask Documentation — request.remote_addr: https://flask.palletsprojects.com/en/stable/api/#flask.request.remote_addr
- https://youtu.be/a4sMtXZjmHk?si=8ERfx7vsUxCPywMj
Comentarios
Publicar un comentario