Implementación de Funciones y Cursores en Transact-SQL para Gestión Deportiva

Inglés4,08 KB

1. Función Escalar: Determinación del Estado de Convocatoria

La siguiente función definida por el usuario (UDF), denominada fn_EstadoConvocatoria, evalúa la condición de un jugador para un encuentro deportivo a partir de tres criterios: lesiones activas, sanciones disciplinarias y fatiga acumulada.

CREATE FUNCTION fn_EstadoConvocatoria (@JugID INT)
RETURNS VARCHAR(50) AS
BEGIN
    DECLARE @Resultado VARCHAR(50) = 'DISPONIBLE';
    DECLARE @Edad INT, @Minutos INT, @Lesionado INT, @Sancionado INT;

    -- 1. Comprobar lesiones activas
    SELECT @Lesionado = COUNT(*) 
    FROM Lesiones 
    WHERE JugadorID = @JugID AND FechaFin IS NULL;

    -- 2. Comprobar sanción (último partido registrado)
    SELECT TOP 1 @Sancionado = COUNT(*) 
    FROM Tarjetas 
    WHERE JugadorID = @JugID AND Color = 'Roja' 
    ORDER BY FechaPartido DESC;

    -- 3. Comprobar fatiga acumulada
    SELECT @Edad = Edad, @Minutos = MinutosJugados 
    FROM Jugadores 
    WHERE JugadorID = @JugID;

    -- Evaluación de condiciones
    IF @Lesionado > 0
        SET @Resultado = 'LESIONADO';
    ELSE IF @Sancionado > 0
        SET @Resultado = 'SANCIONADO';
    ELSE IF @Edad > 34 AND @Minutos > 3000
        SET @Resultado = 'DESCANSO RECOMENDADO';

    RETURN @Resultado;
END;
GO

2. Script Transact-SQL: Ajuste Automático de Masa Salarial mediante Cursores

El siguiente bloque evalúa la masa salarial por equipo mediante cursores anidados. Si una plantilla supera el tope establecido en 10.000.000, aplica una reducción progresiva del 10 % a los salarios más altos de forma descendente hasta cumplir con el límite financiero.

DECLARE @EqID INT, @EqNom VARCHAR(50), @SumaSalarios FLOAT, @Exceso FLOAT,
        @JugID INT, @JugSueldo FLOAT, @ReduccionTotal FLOAT;

-- Cursor principal: Recorrido de equipos
DECLARE curEquipos CURSOR FOR 
    SELECT EquipoID, NombreEquipo 
    FROM Equipos;

OPEN curEquipos;
FETCH NEXT FROM curEquipos INTO @EqID, @EqNom;

WHILE @@FETCH_STATUS = 0 
BEGIN
    SELECT @SumaSalarios = SUM(Sueldo) 
    FROM Jugadores 
    WHERE EquipoID = @EqID;
    
    SET @ReduccionTotal = 0;

    -- Validación de superación del tope salarial (10.000.000)
    IF @SumaSalarios > 10000000 
    BEGIN
        SET @Exceso = @SumaSalarios - 10000000;
        PRINT 'Equipo ' + @EqNom + ' supera el límite por ' + CAST(@Exceso AS VARCHAR);

        -- Cursor secundario: Ajuste individual ordenado por mayor salario
        DECLARE curAjuste CURSOR FOR 
            SELECT JugadorID, Sueldo 
            FROM Jugadores 
            WHERE EquipoID = @EqID 
            ORDER BY Sueldo DESC;

        OPEN curAjuste;
        FETCH NEXT FROM curAjuste INTO @JugID, @JugSueldo;

        WHILE @@FETCH_STATUS = 0 AND @SumaSalarios > 10000000 
        BEGIN
            -- Reducción del 10% sobre el salario actual
            UPDATE Jugadores 
            SET Sueldo = Sueldo * 0.9 
            WHERE JugadorID = @JugID;
            
            SET @ReduccionTotal = @ReduccionTotal + (@JugSueldo * 0.1);
            SET @SumaSalarios = @SumaSalarios - (@JugSueldo * 0.1);

            FETCH NEXT FROM curAjuste INTO @JugID, @JugSueldo;
        END;

        CLOSE curAjuste;
        DEALLOCATE curAjuste;
        
        PRINT '   Reducción aplicada: ' + CAST(@ReduccionTotal AS VARCHAR);
    END;

    FETCH NEXT FROM curEquipos INTO @EqID, @EqNom;
END;

CLOSE curEquipos;
DEALLOCATE curEquipos;

Puntos Clave del Proceso

  • Determinación de disponibilidad: Prioriza el descarte por motivos de salud (lesión), seguido de restricciones disciplinarias (sanción) y, finalmente, gestión de carga física (edad y minutos jugados).
  • Control presupuestario iterativo: Emplea cursores de T-SQL para iterar sobre conjuntos de datos jerárquicos (equipos y jugadores) permitiendo modificaciones registro a registro según el umbral financiero fijado.

Descargar

PDF Word HTML