Hola, les comento que estamos actualizando los egresados manualmente hasta habilitar el módulo, necesito calcular el dato del promedio con y sin aplazos e insertarlo en la tabla sga_titulos_otorg, vi que hay una operacion en el sistema que lo hace pero el filtro es por alumno, yo quiero hacerlo para un grupo de alumnos, como puedo hacer?. Por ahora probe ejecutar el stored de la operacion deteccion de cambios en egresados pero no me guarda el dato…Por favor si me pueden orientar se los agradeceria. El objetivo final es calcular el promedio historico por carrera. Saludos y Gracias
Fijate si podes recuperar los promedios por cada titulo del plan de estudos de cada alumno que quieras verificar el promedio:
SELECT
a.unidad_academica,
a.carrera,
a.legajo,
tp.titulo,
t.nombre as nombre_titulo,
sp_promgralt ( a.unidad_academica, a.nro_inscripcion, tp.titulo, a.carrera, a.legajo) as promedio_gral,
sp_promsinaplazost ( a.unidad_academica, a.nro_inscripcion, tp.titulo, a.carrera, a.legajo) as promediosinaplazos
FROM sga_alumnos as a,
sga_titulos_plan as tp,
sga_titulos as t
WHERE tp.unidad_academica = a.unidad_academica AND tp.carrera = a.carrera AND tp.plan = a.plan
AND tp.unidad_academica = t.unidad_academica AND tp.titulo = t.titulo
AND <filtros para recuperar algunos alumnos...>....
Hola, si yo ejecuto egr00004 me calcula bien los promedios (con y sin aplazos) de un alumno y los asigna en la tabla sga_titulos_otorg yo necesito replicar ese funcionamiento para todos los alumnos… de una carrera…
Lorena, con la consulta que te pase podes traer todos los alumnos de una carrera y alli te devuelve el promedio con y sin aplazos.
¿Pudiste correr esa select? Recuperó los promedios?
En gral el proceso es y seguirá siendo lento, aplicado a todos los alumnos tarda muchísimo. Yo te propondría que pre-calcules esa información y la leas (en vez de calcularla cada vez que la necesitas).
Para precalcular los promedios necesitas:
1 - una tabla auxiliar
2 - un SP que haga el trabajo
2.a - podría ser un SP que recorra todos los alumnos y calcule todo de una sola vez (ejecución manual)
2.b - podría ser un SP que procese lotes por carrera (ejecución manual)
2.c - podría ser un SP que se ejecute específicamente para un alumno
2.c.1 - podrías ejecutarlo al egresar a dicho alumno
2.c.2 - podrías ejecutarlo al cerrar un acta de promoción/final y/o al otorgar una equivalencia
- en cualquier caso yo pensaría en los triggers de insert/update de las tablas involucradas.
3 - finalmente con una consulta simple tendrías el promedio de cualquier alumno.
Si te interesa precalcular el promedio creo que te puedo pasar algunos scripts… pero debería buscarlos ![]()
Lorena:
No es más lógico poner uno o varios administrativos (según la cantidad de egresados que tengan) a ejecutar la operación egr05030-Solicitu de título, que es la que realiza el trabajo que corresponde para insertar los registros en sga_titulos_otorg, y de paso verifican si todos los egresados cumplen con el plan registrado en el Guaraní o hay algún tipo de problema ya sea con el plan o con la historia académica de cada alumno?
Si hubiera problemas, con lo que están haciendo no solo no lo estarían detectando sino que los promedios no estarían bien calculados seguramente, aunque matemáticamente si estén bien calculados.
Yo creo que siempre es preferible realizar las cosas como se deben aunque demoren más tiempo.
Saludos
Gustavo
Gustavo, te comento que el Modulo Egresados no esta implementado aun ya que faltan definiciones del circuito a llevar a cabo por parte de las autoridades. Nuestra idea es, una vez implementado, incorporar los egresados hasta la fecha mediante scripts y a partir de ahi la gente de Titulos del Departamento de alumnos haria lo que vos me sugeris…yo necesito probar la personalizacion de la gente de la Universidad de la Pampa que calcula el promedio historico, pero para eso tengo que tener el registro de los promedios de cada alumno…
Asi que, conclusion, me pongo en el papel de “administrativo” con el tiempo que eso implica y calculo los promedios con la operacion como se debe… Gracias!
Lorena:
Aunque no este implementado el Módulo de Egresados por falta de definición del circuito, cualquiera que sea el circuito que definan después, siempre va a empezar por la operación de Solicitud de Título, que es la que detecta si el alumno está en condiciones de egresar y lo inserta en la tabla sga_titulos_otorg, que es lo que vos necesitás.
Por lo tanto lo que hagas ahora en el papel de “administrativo” es tiempo que ganás además que te permite probar esa personalización. Y bien podrían poner algún administrativo a ayudarte con esa tarea, ya que si son 2 reduciran los tiempos a la mitad, si son 4 los reducirán a la 4ta. parte. Y es trabajo que de todas maneras deberían realizar en algún momento.
Te cuento que en todas las implementaciones que participé (y son verdaderamente muchas en casi 15 años), este paso de Solicitud de título es casi la frutilla del postre, ya que es la manera de verificar que están bien cargados los planes de estudio y que están correctas las historias académicas migradas. Y siempre, siempre, saltan errores y problemas ya sea con los planes o con las historias académicas, y es lo que permite detectarlos y corregirlos.
Saludos
Gustavo
Si bien me ignoraron voy a seguir (no me doy fácilmente por vencido:). Si la carrera tiene titulo/s intermedio/s vas a tener más de un promedio… o no depende de si calculas un promedio por titulo o uno gral.
Yo crearía una tabla similar a la siguiente:
CREATE TABLE u8XX_promedios(
unidad_academica VARCHAR(5),
nro_inscripcion VARCHAR(10),
departamento VARCHAR(5),
carrera VARCHAR(5),
plan VARCHAR(5),
legajo VARCHAR(15),
titulo VARCHAR(5), s[/s]
promedio_ca FLOAT,
promedio_sa FLOAT,
cant_mat_aprob INTEGER,
cant_mat_abandon INTEGER
);
Y buscaría la forma de completarla con los datos a medida que los datos se van generando y/o actualizando.
- Podría llenarse con datos al momento de emitir un analítico o algún otro certificado.
- Podrías tener un proceso batch que se ejecute por la noche 1 vez a la semana.
- Podrías crear una operación que ejecuten manualmente luego de cerrar las actas.
- Podrías luego de cerrar las actas calcular y actualizar (si corresponde) el promedio de los alumno del acta. (ésta es mi elección)
Lo que te quedaría es consultar esta tabla y pasar el dato que necesites a sga_titulos_otorg…
Te dejo un SP que -creo- calcula correctamente los promedios y el resto de la info de la tabla propuesta anteriormente (para un alumno x):
CREATE FUNCTION sp8XX_promedio_alumno(p_unidad_academica LIKE sga_alumnos.unidad_academica, p_carrera LIKE sga_alumnos.carrera, p_plan LIKE sga_alumnos.plan, p_legajo LIKE sga_alumnos.legajo)
RETURNING FLOAT, FLOAT, INT, INT, INT;
– Recibe: unidad academica, carrara, plan y legajo
– Devuelve: promedio con y sin aplazos, total de materias aprobadas, total de aplazos, total de cursadas abandonadas
DEFINE vPromedioConAplazos FLOAT;
DEFINE vPromedioSinAplazos FLOAT;
DEFINE vTotalDeAbandonos INT;
DEFINE vTotalDeAplazos INT;
DEFINE vTotalDeAprobadas INT;
BEGIN
LET vPromedioConAplazos = 0;
LET vPromedioSinAplazos = 0;
LET vTotalDeAbandonos = 0;
LET vTotalDeAplazos = 0;
LET vTotalDeAprobadas = 0;
SELECT DISTINCT
cor.unidad_academica
, cor.carrera
, cor.plan
, cor.version
, mat.materia
FROM sga_atrib_mat_plan as amp
INNER JOIN sga_materias as mat
ON amp.unidad_academica = mat.unidad_academica
AND amp.materia = mat.materia
INNER JOIN sga_ciclos_orient as cor
ON amp.unidad_academica = cor.unidad_academica
AND amp.carrera = cor.carrera
AND amp.plan = cor.plan
AND amp.version = cor.version
INNER JOIN sga_materias_ciclo as mcl
ON cor.unidad_academica = mcl.unidad_academica
AND cor.ciclo = mcl.ciclo
AND mat.materia = mcl.materia
INNER JOIN sga_ciclos_plan as cpl
ON cor.unidad_academica = cpl.unidad_academica
AND cor.carrera = cpl.carrera
AND cor.plan = cpl.plan
AND cor.version = cpl.version
AND cor.ciclo = cpl.ciclo
INNER JOIN sga_orientaciones as ori
ON cor.unidad_academica = ori.unidad_academica
AND cor.carrera = ori.carrera
AND cor.plan = ori.plan
AND cor.titulo = ori.titulo
AND cor.orientacion = ori.orientacion
INNER JOIN sga_titulos_plan as tpl
ON cor.unidad_academica = tpl.unidad_academica
AND cor.carrera = tpl.carrera
AND cor.plan = tpl.plan
AND cor.titulo = tpl.titulo
INNER JOIN sga_planes as pla
ON tpl.unidad_academica = pla.unidad_academica
AND tpl.carrera = pla.carrera
AND tpl.plan = pla.plan
INNER JOIN sga_titulos as tit
ON tpl.unidad_academica = tit.unidad_academica
AND tpl.titulo = tit.titulo
INNER JOIN sga_carreras as car
ON cor.unidad_academica = car.unidad_academica
AND cor.carrera = car.carrera
INNER JOIN sga_departamentos as dep
ON car.unidad_academica = dep.unidad_academica
AND car.departamento = dep.departamento
WHERE (dep.estado = ‘A’)
AND (cor.unidad_academica = p_unidad_academica)
AND (cor.carrera = p_carrera)
AND (cor.plan = p_plan)
AND (cor.version = pla.version_actual)
INTO TEMP tmp_materias;
CREATE INDEX “dba”.in_tmp_materias ON “dba”.tmp_materias(materia);
– examenes rendidos
SELECT DISTINCT
mat.materia
, dac.fecha_de_examen
, dac.nota
FROM tmp_materias as mat
INNER JOIN sga_actas_examen as aex
ON mat.materia = aex.materia
INNER JOIN sga_detalle_acta as dac
ON dac.unidad_academica = aex.unidad_academica
AND dac.tipo_acta = aex.tipo_acta
AND dac.acta = aex.acta
WHERE (dac.unidad_academica = p_unidad_academica)
AND (dac.carrera = p_carrera)
AND (dac.legajo = p_legajo)
UNION
– examenes equivalentes
SELECT DISTINCT
mat.materia,
dac.fecha_de_examen,
dac.nota
FROM tmp_materias as mat
INNER JOIN sga_actas_examen as aex
ON mat.materia = aex.materia
INNER JOIN sga_detalle_acta as dac
ON dac.unidad_academica = aex.unidad_academica
AND dac.tipo_acta = aex.tipo_acta
AND dac.acta = aex.acta
INNER JOIN sga_examenes_equiv as eeq
ON eeq.unidad_academica = dac.unidad_academica
AND eeq.tipo_acta = dac.tipo_acta
AND eeq.acta = dac.acta
WHERE (eeq.unidad_academica = p_unidad_academica)
AND (eeq.carrera = p_carrera)
AND (eeq.legajo = p_legajo)
AND (eeq.legajo_original = dac.legajo)
UNION
– equivalencias otorgadas
SELECT DISTINCT
mat.materia
, eot.fecha
, eot.nota
FROM tmp_materias as mat
INNER JOIN sga_equiv_otorgada as eot
ON mat.unidad_academica = p_unidad_academica
AND mat.materia = eot.materia
INNER JOIN sga_equiv_operac as eop
ON eot.operacion_equiv = eop.operacion_equiv
WHERE (eop.tipo_equiv IN (‘N’, ‘R’))
AND (eot.estado IN (‘A’, ‘C’))
AND (eot.alcance = ‘T’)
AND (eot.rectificado = ‘N’)
AND (eot.nota is not null)
AND (eot.unidad_academica = p_unidad_academica)
AND (eot.carrera = p_carrera)
AND (eot.legajo = p_legajo)
UNION
– materias promocionadas
SELECT DISTINCT
mat.materia
, dap.fecha
, dap.nota
FROM tmp_materias mat
INNER JOIN sga_comisiones com
ON com.unidad_academica = p_unidad_academica
AND com.materia = mat.materia
INNER JOIN sga_actas_promo apr
ON apr.comision = com.comision
INNER JOIN sga_det_acta_promo dap
ON dap.unidad_academica = apr.unidad_academica
AND dap.acta = apr.acta
WHERE (dap.unidad_academica = p_unidad_academica)
AND (dap.carrera = p_carrera)
AND (dap.legajo = p_legajo)
AND (dap.resultado = ‘P’)
AND (apr.estado = ‘C’)
UNION
– promociones equivalentes
SELECT DISTINCT
mat.materia
, dap.fecha
, dap.nota
FROM tmp_materias as mat
INNER JOIN sga_comisiones as com
ON com.unidad_academica = p_unidad_academica
AND com.materia = mat.materia
INNER JOIN sga_actas_promo as apr
ON apr.comision = com.comision
INNER JOIN sga_det_acta_promo as dap
ON dap.unidad_academica = apr.unidad_academica
AND dap.acta = apr.acta
INNER JOIN sga_promo_equiv as peq
ON dap.unidad_academica = peq.unidad_academica
AND dap.acta = peq.acta
WHERE (peq.unidad_academica = p_unidad_academica)
AND (peq.carrera = p_carrera)
AND (peq.legajo = p_legajo)
AND (peq.legajo_original = dap.legajo)
AND (dap.resultado = ‘P’)
AND (apr.estado = ‘C’)
UNION
– equivalencias equivalentes
SELECT DISTINCT
mat.materia
, eot.fecha
, eot.nota
from tmp_materias mat
inner join sga_equiv_equiv eeq
on mat.unidad_academica = eeq.unidad_academica
and mat.carrera = eeq.carrera
inner join sga_equiv_otorgada eot
on eeq.equivalencia = eot.equivalencia
and mat.materia = eot.materia
inner join sga_equiv_operac eop
on eot.operacion_equiv = eop.operacion_equiv
where (eeq.legajo = p_legajo)
and (eop.tipo_equiv IN (‘N’, ‘R’))
and (eot.estado = ‘A’)
and (eop.estado = ‘C’)
and (eot.alcance = ‘T’)
and (eot.rectificado = ‘N’)
and (eot.resultado <> ‘U’)
UNION
– otras materias aprobadas
SELECT DISTINCT
mat.materia,
oma.fecha,
oma.nota
from tmp_materias mat
inner join sga_otras_mat_apro oma
on mat.unidad_academica = oma.unidad_academica
and mat.carrera = oma.carrera
and mat.materia = oma.materia
and (oma.legajo = p_legajo)
where (oma.nota::integer >= 4)
INTO TEMP tmp_materias_para_promedio;
DROP TABLE tmp_materias;
IF (SELECT COUNT(*) FROM tmp_materias_para_promedio) = 0 THEN
SELECT COUNT(*)
INTO vTotalDeAbandonos
FROM sga_det_acta_curs as dac
WHERE dac.unidad_academica = p_unidad_academica
AND dac.carrera = p_carrera
AND dac.legajo = p_legajo
AND dac.nota is null;
LET vPromedioConAplazos = 0;
LET vTotalDeAprobadas = 0;
LET vTotalDeAplazos = 0;
LET vPromedioSinAplazos = 0;
ELSE
SELECT *
, CASE WHEN nota > 3 THEN 1 ELSE 0 END as aprobada
, CASE WHEN nota > 3 THEN 0 ELSE 1 END as aplazada
FROM tmp_materias_para_promedio
INTO TEMP tmp_materias_para_promedio_con_flag;
SELECT (SUM(nota::integer)/COUNT(*)) as promedioConAplazos,
SUM(aprobada) as totalDeAprobadas,
SUM(aplazada) as totalDeAplazos,
(SELECT COUNT(*)
FROM sga_det_acta_curs as dac
WHERE dac.unidad_academica = p_unidad_academica
AND dac.carrera = p_carrera
AND dac.legajo = p_legajo
AND dac.nota is null) as totalDeAbandonos
INTO vPromedioConAplazos
, vTotalDeAprobadas
, vTotalDeAplazos
, vTotalDeAbandonos
FROM tmp_materias_para_promedio_con_flag;
SELECT (SUM(nota::integer)/COUNT(*))
INTO vPromedioSinAplazos
FROM tmp_materias_para_promedio_con_flag
WHERE aprobada=1;
DROP TABLE tmp_materias_para_promedio_con_flag;
END IF;
DROP TABLE tmp_materias_para_promedio;
RETURN vPromedioConAplazos, vPromedioSinAplazos, vTotalDeAprobadas, vTotalDeAplazos, vTotalDeAbandonos;
END;
END FUNCTION;