Creación de ListarPuestos y ListarEmpleados
Hora de inicio: 8:00 a.m.
Hora de finalización: 11:30 a.m.
Horas trabajadas: 3 h 30 min
Con la estructura de tablas creada en Azure SQL Database, el siguiente paso era implementar los primeros stored procedures que formarían la base de la capa de datos de la aplicación.
En la Tarea 1 habíamos aprendido sobre cómo trabajar con SPs desde Python usando pyodbc. En esta tarea, el desafío era aplicar esos conocimientos de forma consistente a través de múltiples SPs más complejos, manteniendo el estándar que el profesor había indicado.
Actividades realizadas
10:00 a.m. - 1:30 p.m.
Se implementaron dos SPs iniciales (quitando CargarDatos):ListarEmpleados y ListarPuestos. Aunque ambos son operaciones de lectura relativamente simples (solo hacen SELECT), fueron fundamentales para establecer los patrones que se aplicarían en SPs más complejos como InsertarEmpleado y Login
Patrón 1: SET NOCOUNT ON
Desde la Tarea 1, ya habíamos descubierto que cuando un SP contiene operaciones como INSERT, UPDATE o DELETE, SQL Server internamente genera mensajes que dicen "X filas afectadas". Estos mensajes son información de control que normalmente el usuario no necesita ver, pero pyodbc los interpreta como resultsets válidos, causando que la lectura de resultados se desordene.
Por ejemplo, si un SP hace un INSERT y luego un SELECT, sin SET NOCOUNT ON, pyodbc recibe:
- Mensaje: "1 fila afectada" (interpretado como resultset)
- El recordset del SELECT
- El SELECT @resultCode
Sin SET NOCOUNT ON, pyodbc puede terminar leyendo el primero cuando quería el segundo, causando errores como "No results. Previous SQL was not a query".
BEGIN TRY/CATCH y manejo de errores
El profesor indicó explícitamente en la rúbrica que todo SP debe implementar manejo de errores usando BEGIN TRY/CATCH. La idea es que si algo falla en la ejecución del SP (por ejemplo, una violación de constraint, un timeout, un error de conversión de datos), el SP no simplemente falle, sino que capture ese error, lo registre en la tabla DBERROR.
En ListarEmpleados, aunque es una consulta simple, el patrón se implementó igual:
Patrón 3: Variables internas y devolución de resultCode
Con la la Tarea 1 descubrimos que pyodbc no maneja parámetros OUTPUT de forma directa. Por ello se decidió declarar como variable interna las varibales de retorno.
Implementación específica de cada SP
ListarEmplados es el SP que devuelve la lista de todos los empleados activos, ordenados por nombre (R2) . El profe indicó que esta lista se usaría en la página principal de la aplicación con un filtro (por nombre o cédula), el filtro también se implementó en el SP.
Se probaron ambos SPs en SSMS ejecutándolos directamente para verificar que devolvieran los datos esperados. Luego se crearon scripts de prueba en Python para validar que pyodbc pudiera leerlos correctamente sin errores de parsing.
Errores encontrados
No hubo errores significativos en esta etapa, ya que los patrones clave habían sido descubiertos, documentados y ampliamente probados en la Tarea 1. La implementación de estos dos SPs fue más bien un ejercicio de aplicar esos patrones conocidos de forma consistente y disciplinada, consolidando el estándar que se mantendría en SPs posteriores más complejos como InsertarEmpleado, Login y CargarDatos.
Sin embargo, fue importante recordar y aplicar nuevamente:
- No olvidar SET NOCOUNT ON (sino fallaría en SPs posteriores con INSERT/UPDATE)
- Siempre usar el patrón BEGIN TRY/CATCH, incluso en SPs simples
- Devolver resultCode mediante SELECT, no mediante OUTPUT parameters
Referencias consultadas
- Microsoft Docs — SET NOCOUNT: https://learn.microsoft.com/en-us/sql/t-sql/statements/set-nocount-transact-sql
- Microsoft Docs — BEGIN TRY CATCH: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql
- Microsoft Docs — ERROR_NUMBER(), ERROR_MESSAGE(), etc.: https://learn.microsoft.com/en-us/sql/t-sql/functions/error-transact-sql
- pyodbc Documentation: https://github.com/mkleehammer/pyodbc/wiki
- Tutorial: Working with Stored Procedures in Python and SQL Server: https://youtu.be/example
- Documentación y notas de la Tarea 1 sobre patrones pyodbc
Comentarios
Publicar un comentario