Implementación de funcionalidad: Consultar Empleado
Fecha: viernes 24 de abril de 2026
Hora de inicio: 2:30 p.m.
Hora de finalización: 7:45 p.m.
Horas trabajadas: 3 h 02 min
El plan para esta sesión era implementar la
funcionalidad completa de consultar empleado: la función en la capa lógica, el
controlador y la vista. Johana ya había terminado su parte de capa lógica y
presentación días antes, así que yo había esperado a que estuviera lista para
arrancar con la mía, tal como lo acordamos.
Actividades realizadas
2:30 p.m. – 3:20 p.m. — Función consultar_empleado (capa lógica)
Comencé escribiendo la función consultar_empleado
en Python. Esto era bastante similar a lo que hice en la tarea 1, así que no
partí desde cero: repasé el código de la tarea anterior para refrescar cómo se
hacían las llamadas a SPs con pyodbc y cómo se manejaban los resultsets.
La función abre la conexión, ejecuta el SP con
cursor.execute, lee el primer resultset con cursor.fetchone para obtener los
datos del empleado, y luego llama a cursor.nextset() para avanzar al segundo
resultset donde viene el código de resultado. Si algo falla a nivel de base de
datos, el except pyodbc.Error captura el error y retorna 50008.
Un detalle que había aprendido en la tarea 1 y
que apliqué aquí es que cursor.nextset() es necesario cuando el SP retorna más
de un SELECT, cosa que ConsultarEmpleado hace.
3:20 p.m. – 3:55 p.m. — Ajustar valor por defecto en parámetros OUTPUT
Antes de poder probar cualquier cosa de la capa lógica, me topé con el primer error serio del día. Al conectar la función Python con el SP ConsultarEmpleado y hacer la primera prueba, la app devolvía "error de base de datos" (código 50008) sin más detalle.

Img1: Error de base de datos al consultar un empleado.
Como el bloque except estaba capturando
el error silenciosamente, agregué un print para ver
el mensaje real, el cual fue este:
('42000', "Procedure or function
'ConsultarEmpleado' expects parameter '@outResultCode', which was not
supplied.")
El problema era que los SPs ConsultarEmpleado,
EliminarEmpleado, ActualizarEmpleado y RegistrarIntentoEliminarEmpleado tenían
el parámetro @outResultCode INT OUTPUT sin valor por defecto, entonces SQL
Server lo exigía obligatoriamente. pyodbc no tiene forma de pasar parámetros
OUTPUT de esa forma, así que SQL Server los rechazaba.
La solución fue agregar = 0 como valor por defecto en los cuatro SPs. Lo hice de dos formas: primero con ALTER PROCEDURE directamente en SSMS para que el cambio quedara activo en la base de datos de Azure de inmediato, y luego actualicé el script en el repositorio para que quedara consistente. El diff en el repositorio muestra exactamente ese cambio: de @outResultCode INT OUTPUT a @outResultCode INT = 0 OUTPUT.

Img2: Ajuste de valor por defecto en los parámetros de salida.
3:55 p.m. – 4:47 p.m. — Vista consultar_empleado_view (controlador)
Implementé la vista en el controlador. La
lógica es la siguiente: valida que haya sesión activa, obtiene el id_empleado
desde los parámetros de la URL, llama a consultar_empleado, y si el resultado
no es exitoso obtiene el mensaje de error con obtener_mensaje_error y redirige
al listado con un flash. Si todo va bien, renderiza el template con los datos
del empleado.
Al probar esta parte me apareció el siguiente
error:
werkzeug.routing.exceptions.BuildError: Could
not build url for endpoint 'auth.logout'. Did you mean
'auth.logout_view' instead?
La causa era que en el HTML que había escrito
usé url_for('auth.logout') pero la función en el controlador de autenticación
se llama logout_view. Lo corregí cambiando el nombre del endpoint en el HTML.
7:00 p.m. – 7:32 p.m. — Crear vista consultar_empleado (HTML)
Antes de programar el HTML, diseñé la vista en
Figma usando como referencia el Figma que Johana había preparado para el
proyecto, donde están definidos los estilos y componentes que usa el resto de
la aplicación. Eso me permitió tener claro qué estructura necesitaba antes de
escribir una sola línea de HTML.
Para el código tomé como base las vistas de
Johana para mantener consistencia visual. Sin embargo, en el primer intento
cometí este error:
Error: vista sin estilos
La página cargaba completamente sin estilos.
La causa era que el <link> del CSS apuntaba a styles.css pero el archivo
correcto se llama estilos.css. Lo corregí cambiando el nombre en el url_for.
7:32 p.m. – 7:45 p.m. — Configurar botón Consultar en index
El último ajuste fue conectar el botón
"Consultar" en la vista del listado de empleados para que redirigiera
correctamente a consultar_empleado_view pasando el id_empleado por la URL. Con
esto la funcionalidad quedó completamente integrada y probada.
Forma de trabajo del equipo
Johana y yo habíamos acordado que ella
avanzaría primero con su parte de capa lógica y presentación, y yo esperaría
para arrancar con la mía una vez que tuviera las bases listas, pues parte de mi
trabajo dependía del de ella. Nos mantuvimos en contacto por WhatsApp durante
la sesión para coordinar dudas puntuales.
Referencias:
- Tarea programada 1.
- Cursor — mssql-python wiki
- Connecting to and querying SQL Server with Python

Comentarios
Publicar un comentario