Entrada 4 (Pruebas y Creación de SP de Error)

 #Bitácora de Sesión

Fecha: 17/04/2026

 Inicio: [15:30] | Fin: [17:30] || Total: [2 horas]

 Presentes: Matías Benavides Sandoval =

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

¿QUÉ HICIMOS HOY?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Se creó el procedimiento almacenado `sp_GetError` para consultar descripciones desde la tabla `Error`.

Se ejecutó el SP en SQL Server y se validó su comportamiento con un código existente y otro inexistente.

Se confirmó que el catálogo de errores devuelve `outResultCode = 0` cuando encuentra el código y `50008` cuando no existe.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PROBLEMAS ENCONTRADOS Y CÓMO SE RESOLVIERON

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 1. Error al registrar detalle técnico en DBError.

Error observado: "Msg 2628 String or binary data would be truncated" en `DBError.Message`.

Solución: ampliar columna con a 512.

 2. Falla de llave foránea al insertar bitácora dentro de `sp_InsertMovimiento`.

Causa: el SP usaba ids fijos (13 y 14) para `TipoEvento`, pero en BD los ids reales eran distintos.

Solución: ajustar el SP para buscar ids de `TipoEvento` por nombre (`Intento de insertar movimiento` y `Insertar movimiento exitoso`) en tiempo de ejecución.

 3. Consulta de error inexistente en `sp_GetError`.

Resultado observado: `outResultCode = 50008` cuando se probó un código que no existe en la tabla `Error`.

Solución: el SP quedó diseñado para devolver `50008` cuando no encuentra coincidencia, manteniendo el comportamiento esperado.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DUDAS Y DIVERGENCIAS DE CRITERIO

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 No hubo dudas en esta sesion, fue solo de avaze del codigo 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

AVANCE DEL CÓDIGO

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Quedó creado y validado `sp_GetError`.

USE VacacionesDB;
GO

-- =====================================================
-- SP 3: Obtener descripcion de error por codigo
-- =====================================================
DROP PROCEDURE IF EXISTS sp_GetError;
GO

CREATE PROCEDURE sp_GetError
    @Codigo INT,
    @outResultCode INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
        IF EXISTS (SELECT 1 FROM [Error] WHERE Codigo = @Codigo)
        BEGIN
            SELECT
                Codigo,
                Descripcion
            FROM [Error]
            WHERE Codigo = @Codigo;

            SET @outResultCode = 0;
        END
        ELSE
        BEGIN
            SET @outResultCode = 50008;
        END;
    END TRY
    BEGIN CATCH
        INSERT INTO DBError ([UserName], [Number], [State], [Severity], [Line], [Procedure], [Message], [DateTime])
        VALUES (
            SYSTEM_USER,
            ERROR_NUMBER(),
            CAST(ERROR_STATE() AS VARCHAR(32)),
            CAST(ERROR_SEVERITY() AS VARCHAR(32)),
            ERROR_LINE(),
            ISNULL(ERROR_PROCEDURE(), 'sp_GetError'),
            ERROR_MESSAGE(),
            GETDATE()
        );

        SET @outResultCode = 50008;
    END CATCH
END;

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

MORALEJAS / BUENAS PRÁCTICAS

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Conviene probar cada SP con un caso válido y uno inválido para validar tanto salida exitosa como códigos de error (para no encontrar sorpresas de que pase algo inesperado a la hora de la vdd).

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PRÓXIMA SESIÓN: ¿QUÉ SIGUE?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Seguir con el siguiente bloque del módulo actual

Comentarios

Entradas más populares de este blog

Entrada 16 (Controlador de movimientos)

Entrada 20 (Lógica de insertarMovimientos, conectarla y probarla)

Entrada 21 (Análisis de resultados)