Hola Ezequiel, no encuentro error, veamos el codigo por partes:
- Selecciona el Plan y la Version que se encuentra el alumno en la fecha de inscripción a examen y lo guarda en vcPlan y vcVersion
BEGIN
-- inicializo con OK, porque puede ser que termine sin llegar al final
LET iStatus = 1 ;
LET vcMsg = '800320' ;
Let dFecha = to_date( pFecha, "%d-%m-%Y");
-- recupero el (plan, version) actual de la carrera
EXECUTE PROCEDURE sp_plan_de_alumno (pUnidadAcademica, pCarrera, pLegajo, dFecha ) INTO vcPlan, vcVersion;
IF (vcPlan IS NULL OR vcVersion IS NULL) THEN
LET iStatus = -1 ;
LET vcMsg = '800361' || ',' || pLegajo;
RETURN iStatus, vcMsg ;
END IF ;
- A continuación verifica si la materia en la que se esta inscribiendo a examen es del plan actual del alumno o de un plan anterior que ya no existe mas en su plan actual.
En el caso que suceda esto, se verifica si la institución permite inscribirse a rendir examen en de una materia de un plan anterior, sin lo lo permite sale con error.
Si se permite rendir examen de una materia de un plan anterior, entonces busca en que plan y version cursó esa materia y lo guarda estos datos en vcPlan y vcVersion (reemplazando el valor del plan y version actual del alumno del punto 1)
-- Verifico si la materia es del Plan Actual del Alumno, sino recupero plan y versoin con que la cursó
-- Esto solo si la Unidad Academica permite Rendir materias de Planes Anteriores.
IF (SELECT COUNT(*) FROM sga_atrib_mat_plan
WHERE unidad_academica = pUnidadAcademica
AND carrera = pCarrera
AND plan = vcPlan
AND version = vcVersion
AND materia = pMateria) = 0 THEN
LET vcRendirPlanAnt = 'N';
-- Verifico si el alumno puede rendir materias de planes anteriores.
EXECUTE PROCEDURE sp_param_sistema('rendir_regul_planes_anteriores') INTO vcRendirPlanAnt;
IF vcRendirPlanAnt <> 'S' THEN
-- Error. la materia no es del Plan Actual del Alumno y no puede rendir materias de planes anteriores.
LET iStatus = -1 ;
LET vcMsg = '800000, La materia ' || pMateria || ' no es del Plan Actual del Alumno ' || pLegajo;
RETURN iStatus, vcMsg ;
END IF;
-- Recupero Plan y Version con que regularizo la materia.
EXECUTE PROCEDURE sp_planver_uregmat (pUnidadAcademica, pCarrera, pLegajo, pMateria) INTO vcPlan, vcVersion;
IF vcPlan IS NULL OR vcVersion IS NULL THEN
LET iStatus = -1 ;
LET vcMsg = '800000, No se regularizó la Materia en algún Plan anterior del Alumno ' || pLegajo;
RETURN iStatus, vcMsg ;
END IF;
END IF;
- Este es el código que confunde…
Aqui se analiza con que plan y version se controlaran las correlativas, si con las correlativas definidas en el plan y version actual del alumno (controla_correlativas_actuales = S) o con el plan y version con la que cursó (ultima cursada vigente y aprobada) de la materia
-
En el caso que controla_correlativas_actuales = S, entonces no entra en este codigo y evalua las correlativas con lo que esta cargado en vcPlan y vcVersion (ya sea los datos actuales, o si la materia no es del plan actual, los datos de plan y version de la ultima cursada vigente aprobada que fue recuperada en el punto 2)
-
En el caso que controla_correlativas_actuales = N, entonces busca la ultima cursada vigente y aprobada de la materia usando el mismo proceso del punto 2 y si la encuentra entonces asigna estos valores a vcPlan y vcVersion
Quizas aqui es donde parezca código repetido, pero solo se daria si la materia no es del plan actual del alumno y controla_correlativas_actuales = N. Se supone que si se cumple esto, las dos veces que se llama al procedure sp_planver_uregmat debe devolver el mismo resultado!!!
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- veo si se acepta controlar correlativas con el plan, version con el que curso la materia
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
EXECUTE PROCEDURE sp_param_sistema('controla_correlativas_actuales') INTO sValorParam ;
IF sValorParam = 'N' THEN
-- No controla con las correlativas del Plan-Version Actual. Busco ultima regularidad de la materia
EXECUTE PROCEDURE sp_planver_uregmat (pUnidadAcademica, pCarrera, pLegajo, pMateria) INTO vcPlanRegular, vcVersionRegular;
IF vcPlanRegular IS NOT NULL AND vcVersionRegular IS NOT NULL THEN
-- No tiene una cursada de la materia en un plan anterior, entonces asigno el plan version actual.
LET vcPlan = vcPlanRegular;
LET vcVersion = vcVersionRegular;
END IF;
END IF;
LET falloCorrelativa = 'N';
- A partir de aqui ya se realiza el control de correlativas buscando las correlativas definidas en el plan y version de plan definidos en vcPlan y vcVersion.
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Controlo las correlatividades de la materia para Aprobar
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++