Hola,
esta operación verifica que en la cuenta de alumnos no haya ninguno que tenga una cursada vigente. Ese reporte se basa en el SP sp_pos_insc_curs.
Verificándolo vemos que no se controlan correlatividades (comunes y especiales). ¿Hubo algún motivo para no chequear ese dato?
Saludos
Juan
Les dejo abajo el código: uso Guarani 2.7.0
CREATE PROCEDURE "dba".sp_pos_insc_curs( pUnidadAcademica LIKE sga_planes.unidad_academica, pCarrera LIKE sga_planes.carrera DEFAULT NULL, pPlan LIKE sga_planes.plan DEFAULT NULL, pMateria LIKE sga_materias.materia , pSede LIKE sga_sedes.sede)
RETURNING varchar(5), varchar(5), varchar(255), varchar(15), varchar(5), varchar(5), varchar(255), char(1),varchar(5), varchar(255);
-- RETORNO: unidad_academica, carrera, carrera.nombre, legajo, plan, materia, materia.nombre, estado
-- Variables para el manejo de excepciones
DEFINE vcUa LIKE sga_planes.unidad_academica;
DEFINE vcCarreraEs LIKE sga_planes.carrera;
DEFINE vcCarreraNombre LIKE sga_carreras.nombre;
DEFINE vcPlanEs LIKE sga_planes.plan;
DEFINE vcVersionEs LIKE sga_planes.version_actual;
DEFINE vcMateriaNombre LIKE sga_atrib_mat_plan.nombre_materia;
DEFINE vcLegajo LIKE sga_alumnos.legajo;
DEFINE vd_vigente LIKE sga_det_acta_curs.fin_vigencia_regul;
DEFINE vdFechaRegularidad DATE;
DEFINE vVigente CHAR(1);
DEFINE vcNomSede VARCHAR(255);
DEFINE vcSede LIKE sga_sedes.sede;
-- Variables para el manejo de excepciones
DEFINE SQLErr integer;
DEFINE ISAMError integer;
DEFINE errorInfo varchar(76);
-- Si hay algun error
ON EXCEPTION SET SQLErr, ISAMError, errorInfo
RAISE EXCEPTION SQLErr, ISAMError, errorInfo;
END EXCEPTION;
BEGIN
-- inicializo los valores de los parametros.
IF pCarrera = '' THEN
LET pCarrera = NULL;
END IF;
IF pPlan = '' THEN
LET pPlan = NULL;
END IF;
IF pSede = '' THEN
LET pSede = NULL;
END IF;
-- Obtengo el nombre de la sede
-- SELECT sga_sedes.nombre
-- INTO vcNomSede
-- FROM sga_sedes
-- WHERE sga_sedes.sede = pSede;
-- solo se ingreso la materia.
IF pCarrera IS NULL AND pPlan IS NULL THEN
-- traigo las carrera/plan que contienen a la materia seleccionada.
FOREACH
SELECT sga_atrib_mat_plan.carrera,
sga_atrib_mat_plan.plan,
sga_atrib_mat_plan.version,
sga_atrib_mat_plan.nombre_materia,
sga_carreras.nombre
INTO vcCarreraEs,
vcPlanEs,
vcVersionEs,
vcMateriaNombre,
vcCarreraNombre
FROM sga_atrib_mat_plan,
sga_carreras,
sga_planes
WHERE sga_atrib_mat_plan.unidad_academica = pUnidadAcademica
AND sga_atrib_mat_plan.materia = pMateria
AND sga_carreras.unidad_academica = sga_atrib_mat_plan.unidad_academica
AND sga_carreras.carrera = sga_atrib_mat_plan.carrera
AND sga_planes.unidad_academica = sga_atrib_mat_plan.unidad_academica
AND sga_planes.carrera = sga_atrib_mat_plan.carrera
AND sga_planes.plan = sga_atrib_mat_plan.plan
AND sga_planes.version_actual = sga_atrib_mat_plan.version
AND sga_planes.estado <> 'B'
AND sga_planes.estado <> 'N'
ORDER BY sga_atrib_mat_plan.carrera, sga_atrib_mat_plan.plan
-- traigo los alumnos activos en la carrera/plan seleccionada.
FOREACH SELECT legajo, vw_alumnosactivos.sede, sga_sedes.nombre INTO vcLegajo, vcSede, vcNomSede
FROM vw_alumnosactivos, sga_sedes
WHERE unidad_academica = pUnidadAcademica
AND carrera = vcCarreraEs
AND plan = vcPlanEs
AND regular = 'S'
AND (pSede is null or vw_alumnosactivos.sede = pSede)
AND vw_alumnosactivos.sede = sga_sedes.sede
-- verifico que no tenga la cursada vigente.
LET vVigente = 'N';
FOREACH SELECT sga_cursadas.fin_vigencia_regul, sga_cursadas.fecha_regularidad
INTO vd_vigente, vdFechaRegularidad
FROM sga_cursadas
WHERE sga_cursadas.unidad_academica = pUnidadAcademica
AND sga_cursadas.carrera = vcCarreraEs
AND sga_cursadas.plan = vcPlanEs
AND sga_cursadas.legajo = vcLegajo
AND sga_cursadas.materia = pMateria
AND sga_cursadas.resultado in ('A','P')
AND NVL(sga_cursadas.fin_vigencia_regul, TODAY) >= TODAY
ORDER BY sga_cursadas.fecha_regularidad DESC
LET vVigente = 'S';
-- Ubico un foreach, proque puede tener mas de una cursada activa para la misma materia
EXIT FOREACH;
END FOREACH;
IF vVigente = 'N' THEN
-- No tiene una cursada vigente. Puede Cursarla.
RETURN pUnidadAcademica, vcCarreraEs, vcCarreraNombre, vcLegajo, vcPlanEs, pMateria, vcMateriaNombre, 'A' ,vcSede, vcNomSede WITH RESUME; END IF;
END FOREACH;
END FOREACH;
-- solo ingreso la carrera sin el plan.
ELIF pPlan IS NULL THEN
-- traigo los plan (distintos de B y N) que contienen a la carrera/materia seleccionada.
FOREACH
SELECT sga_atrib_mat_plan.carrera,
sga_atrib_mat_plan.plan,
sga_atrib_mat_plan.version,
sga_atrib_mat_plan.nombre_materia,
sga_carreras.nombre
INTO vcCarreraEs,
vcPlanEs,
vcVersionEs,
vcMateriaNombre,
vcCarreraNombre
FROM sga_atrib_mat_plan,
sga_carreras,
sga_planes
WHERE sga_atrib_mat_plan.unidad_academica = pUnidadAcademica
AND sga_atrib_mat_plan.carrera = pCarrera
AND sga_atrib_mat_plan.materia = pMateria
AND sga_carreras.unidad_academica = sga_atrib_mat_plan.unidad_academica
AND sga_carreras.carrera = sga_atrib_mat_plan.carrera
AND sga_planes.unidad_academica = sga_atrib_mat_plan.unidad_academica
AND sga_planes.carrera = sga_atrib_mat_plan.carrera
AND sga_planes.plan = sga_atrib_mat_plan.plan
AND sga_planes.version_actual = sga_atrib_mat_plan.version
AND sga_planes.estado <> 'B'
AND sga_planes.estado <> 'N'
ORDER BY sga_atrib_mat_plan.carrera, sga_atrib_mat_plan.plan
-- traigo los alumnos activos en la carrera/plan seleccionada.
FOREACH
SELECT legajo, vw_alumnosactivos.sede, sga_sedes.nombre
INTO vcLegajo, vcSede, vcNomSede
FROM vw_alumnosactivos, sga_sedes
WHERE unidad_academica = pUnidadAcademica
AND carrera = vcCarreraEs
AND plan = vcPlanEs
AND regular = 'S'
AND (psede is null or vw_alumnosactivos.sede = pSede )
AND vw_alumnosactivos.sede = sga_sedes.sede
-- verifico que no tenga la cursada vigente.
LET vVigente = 'N';
FOREACH SELECT sga_cursadas.fin_vigencia_regul, sga_cursadas.fecha_regularidad
INTO vd_vigente, vdFechaRegularidad
FROM sga_cursadas
WHERE sga_cursadas.unidad_academica = pUnidadAcademica
AND sga_cursadas.carrera = pCarrera
AND sga_cursadas.legajo = vcLegajo
AND sga_cursadas.plan = vcPlanEs
AND sga_cursadas.materia = pMateria
AND sga_cursadas.resultado in ('A','P')
AND NVL(sga_cursadas.fin_vigencia_regul, TODAY) >= TODAY
ORDER BY sga_cursadas.fecha_regularidad DESC
LET vVigente = 'S';
-- Ubico un foreach, proque puede tener mas de una cursada activa para la misma materia
EXIT FOREACH;
END FOREACH
IF vVigente = 'N' THEN
-- No tiene una cursada vigente.
RETURN pUnidadAcademica, pCarrera, vcCarreraNombre, vcLegajo, vcPlanEs, pMateria, vcMateriaNombre, 'A' , vcSede, vcNomSede WITH RESUME;
END IF;
END FOREACH;
END FOREACH;
ELSE
-- traigo los alumnos activos en la carrera/plan y materia pasadas por parametros.
FOREACH
SELECT vw_alumnosactivos.carrera,
sga_carreras.nombre,
vw_alumnosactivos.legajo,
vw_alumnosactivos.plan,
sga_atrib_mat_plan.nombre_materia,
vw_alumnosactivos.sede,
sga_sedes.nombre
INTO vcCarreraEs,
vcCarreraNombre,
vcLegajo,
vcPlanEs,
vcMateriaNombre,
vcSede,
vcNomSede
FROM vw_alumnosactivos,
sga_planes,
sga_atrib_mat_plan,
sga_carreras,
sga_sedes
WHERE sga_carreras.unidad_academica = pUnidadAcademica
AND sga_carreras.carrera = pCarrera
AND sga_planes.unidad_academica = sga_carreras.unidad_academica
AND sga_planes.carrera = sga_carreras.carrera
AND sga_planes.plan = pPlan
AND sga_planes.estado <> 'B'
AND sga_planes.estado <> 'N'
AND dba.sga_atrib_mat_plan.unidad_academica = sga_planes.unidad_academica
AND dba.sga_atrib_mat_plan.carrera = sga_planes.carrera
AND dba.sga_atrib_mat_plan.plan = sga_planes.plan
AND dba.sga_atrib_mat_plan.version = sga_planes.version_actual
AND dba.sga_atrib_mat_plan.materia = pMateria
AND vw_alumnosactivos.unidad_academica = sga_planes.unidad_academica
AND vw_alumnosactivos.carrera = sga_planes.carrera
AND vw_alumnosactivos.plan = sga_planes.plan
AND vw_alumnosactivos.regular = 'S'
AND (psede is null or vw_alumnosactivos.sede = pSede)
AND vw_alumnosactivos.sede = sga_sedes.sede
-- verifico que no tenga la cursada vigente.
LET vVigente = 'N';
FOREACH SELECT sga_cursadas.fin_vigencia_regul, sga_cursadas.fecha_regularidad
INTO vd_vigente, vdFechaRegularidad
FROM sga_cursadas,
sga_comisiones
WHERE sga_cursadas.unidad_academica = pUnidadAcademica
AND sga_cursadas.carrera = pCarrera
AND sga_cursadas.legajo = vcLegajo
AND sga_cursadas.plan = pPlan
AND sga_cursadas.materia = pMateria
AND sga_cursadas.resultado in ('A','P')
AND NVL(sga_cursadas.fin_vigencia_regul, TODAY) >= TODAY
ORDER BY sga_cursadas.fecha_regularidad DESC
LET vVigente = 'S';
-- Ubico un foreach, proque puede tener mas de una cursada activa para la misma materia
EXIT FOREACH;
END FOREACH
IF vVigente = 'N' THEN
-- No tiene una cursada vigente.
RETURN pUnidadAcademica, vcCarreraEs, vcCarreraNombre, vcLegajo, vcPlanEs,
pMateria, vcMateriaNombre, 'A' , vcSede, vcNomSede WITH RESUME;
END IF;
END FOREACH;
END IF;
END;
END PROCEDURE