CUR00127 - Cantidad de Alumnos que pueden cursar una materia

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


Hola Juan

A ‘cur00127 - Cantidad de Alumnos que pueden cursar una materia’ se le pueden configurar controles configurables como por ejemplo el control de correaltivas ( wer par00008 - Configuración de controles por operación ) . Actualmente tiene disponible 5 controles configurables y entre ellos el control n° 71 Correlativas de cursadas; configurenlos y luego prueben ejecuten de nuevo el reporte cur00127.

saludos
Ana María

Hola Ana, era eso nomás. Asumo el preconcepto de que los controles configurables solo tenían el alcance de la operación, no lo que esta ejecutaba dentro.

Saludos!

Juan