Estoy migrando hacia la versión 3.19.1.
Al querer ejecutar: 02_Modulos/60_Equivalencias/02_Migracion/mig_Equivalencias.kjb da error de sintaxis en el script 07_actividades_extracurriculares.sql.
En adjunto envío el archivo.
Entiendo en principio que está faltando un AND en la línea 100.
Pero luego de agregarlo, da otro error más:
PL/pgSQL function inline_code_block line 15 at SQL statement
Hola
Estoy probando nuevamente la migración de G2 a G3, pero ahora a la versión 3.20
En el script 07_actividades_extracurriculares.sql del módulo Equivalencias, está este código, que ordena por apellido y nombre de la persona, pero la tabla mdp_presonas nunca se consulta, con lo cual da error.
SELECT
cnv_r.nro_tramite,
ele.elemento,
'N' as homologada,
'S' as reconocimiento_total, -- La actividad extracurricular se reconoce en su totalidad.
sga_activ_alumno.puntaje_otorgado
FROM mig._cnv_pk_reconocimiento as cnv_r
JOIN sga_reconocimiento as r ON r.nro_tramite = cnv_r.nro_tramite
JOIN mig.sga_resol_activ ON mig.sga_resol_activ.unidad_academica = cnv_r.unidad_academica AND
mig.sga_resol_activ.resol_actividades = cnv_r.resol_actividades
JOIN mig.sga_activ_resol ON mig.sga_activ_resol.unidad_academica = mig.sga_resol_activ.unidad_academica AND
mig.sga_activ_resol.resol_actividades = mig.sga_resol_activ.resol_actividades
JOIN mig.sga_activ_alumno ON mig.sga_activ_alumno.unidad_academica = mig.sga_activ_resol.unidad_academica AND
mig.sga_activ_alumno.resol_actividades = mig.sga_activ_resol.resol_actividades AND
mig.sga_activ_alumno.area = mig.sga_activ_resol.area AND
mig.sga_activ_alumno.actividad = mig.sga_activ_resol.actividad AND
mig.sga_activ_alumno.fecha = mig.sga_activ_resol.fecha
JOIN mig.sga_alumnos_resol ON mig.sga_alumnos_resol.unidad_academica = mig.sga_activ_alumno.unidad_academica AND
mig.sga_alumnos_resol.resol_actividades = mig.sga_activ_alumno.resol_actividades AND
mig.sga_alumnos_resol.carrera = mig.sga_activ_alumno.carrera AND
mig.sga_alumnos_resol.legajo = mig.sga_activ_alumno.legajo
JOIN mig._cnv_pk_elementos as m_act ON m_act.unidad_academica = mig.sga_activ_resol.unidad_academica AND
m_act.codigo = mig.sga_activ_resol.actividad AND
m_act.tipo = 'ACTIVIDAD_EXT'
JOIN sga_elementos as ele ON ele.elemento = m_act.elemento
JOIN mig._cnv_pk_alumnos as m_alu ON m_alu.unidad_academica = mig.sga_alumnos_resol.unidad_academica AND
m_alu.carrera = mig.sga_alumnos_resol.carrera AND
m_alu.legajo = mig.sga_alumnos_resol.legajo
WHERE cnv_r.origen = 'EXTRACURRICULAR'
AND m_alu.alumno = r.alumno
ORDER BY cnv_r.nro_tramite, ele.nombre, mdp_personas.apellido, mdp_personas.nombres;
Basta con eliminar solamente los 2 últimos campos extra del ORDER BY? o debe ir otra cosa?
07_actividades_extracurriculares.sql - PL/pgSQL function mig.sp_migrar_actividades_ext() line 19 at SQL statement
Sigo analizando, y esta consulta retorna:
algunas tuplas con el campo estado en " " (lo rastree y corresponde a una única resol_actividades que ya la tengo identificada, y estoy averiguando por qué el estado no es ni Abierto, ni Cerrado, ni Anulado)
varias tuplas con el campo plan_version en NULL
SELECT DISTINCT
cnv_r.nro_tramite,
m_alu.alumno,
(SELECT m_pv.plan_version
FROM mig.sga_activ_alumno
JOIN mig._cnv_pk_planes_versiones as m_pv ON m_pv.unidad_academica = mig.sga_activ_alumno.unidad_academica AND
m_pv.carrera = mig.sga_activ_alumno.carrera AND
m_pv.plan_g2 = mig.sga_activ_alumno.plan AND
m_pv.version = mig.sga_activ_alumno.version
WHERE mig.sga_activ_alumno.unidad_academica = mig.sga_resol_activ.unidad_academica
AND mig.sga_activ_alumno.resol_actividades = mig.sga_resol_activ.resol_actividades
AND mig.sga_activ_alumno.carrera = mig.sga_alumnos_resol.carrera
AND mig.sga_activ_alumno.legajo = mig.sga_alumnos_resol.legajo
LIMIT 1
) as plan_version,
(SELECT cpd.documento
FROM mig.sga_resoluciones
JOIN mig._cnv_pk_documentos as cpd ON
(cpd.resolucion = mig.sga_resoluciones.resolucion_numero AND
cpd.documento_tipo = (CASE
WHEN mig.sga_resoluciones.resolucion_tipo = 'CA' THEN 1
WHEN mig.sga_resoluciones.resolucion_tipo = 'CS' THEN 2
WHEN mig.sga_resoluciones.resolucion_tipo = 'CD' THEN 3
WHEN mig.sga_resoluciones.resolucion_tipo = 'DEC' THEN 4
WHEN mig.sga_resoluciones.resolucion_tipo = 'DAR' THEN 5
WHEN mig.sga_resoluciones.resolucion_tipo = 'REC' THEN 6
ELSE 7
END) AND
cpd.fecha = COALESCE(mig.sga_resoluciones.fecha, to_date(mig.get_default('fecha_resolucion'),'YYYY-MM-DD')) AND
cpd.tabla = 'sga_resoluciones'
)
WHERE mig.sga_resoluciones.resolucion = cnv_r.resol_actividades
LIMIT 1) as documento,
'AM', -- Actividades/Modulos
mig.sga_resol_activ.fecha,
mig.sga_resol_activ.fecha,
CASE mig.sga_resol_activ.estado
WHEN 'A' THEN cast(null as date)
WHEN 'C' THEN mig.sga_resol_activ.fecha
END as fecha_cierre,
COALESCE(mig.sga_alumnos_resol.observaciones,'') ||
CASE mig.sga_resol_activ.modalidad
WHEN 'G' THEN COALESCE(' .' || sga_alumnos_resol.observaciones,'')
WHEN 'I' THEN ''
END,
mig.sga_resol_activ.estado
FROM mig._cnv_pk_reconocimiento as cnv_r
JOIN mig.sga_resol_activ ON mig.sga_resol_activ.unidad_academica = cnv_r.unidad_academica AND
mig.sga_resol_activ.resol_actividades = cnv_r.resol_actividades
JOIN mig.sga_alumnos_resol ON mig.sga_alumnos_resol.unidad_academica = mig.sga_resol_activ.unidad_academica AND
mig.sga_alumnos_resol.resol_actividades = mig.sga_resol_activ.resol_actividades AND
mig.sga_alumnos_resol.carrera = cnv_r.carrera AND
mig.sga_alumnos_resol.legajo = cnv_r.legajo
JOIN mig._cnv_pk_alumnos as m_alu ON m_alu.unidad_academica = mig.sga_alumnos_resol.unidad_academica AND
m_alu.carrera = mig.sga_alumnos_resol.carrera AND
m_alu.legajo = mig.sga_alumnos_resol.legajo
JOIN sga_alumnos ON sga_alumnos.alumno = m_alu.alumno
WHERE cnv_r.origen = 'EXTRACURRICULAR'
ORDER BY cnv_r.nro_tramite;
Por si sirve para detectar el inconveniente.
Gracias por la ayuda!
Hola Alejandro
Si, es verdad, el mensaje no es el mismo.
Pero al crear la función, cambió de lugar el mismo error.
Te adjunto la salida la ejecución.
Entiendo es por tener el campo plan_version en NULL.
Gracias
Para esos registros que da plan_version NULL, verfiicaste si existe el alumno en Guarani 2 y si existe la version de plan en Guarani 2?
Y si existe, fijate si esa version de plan existe en Guarani 3.
Hola Alejandro
Son muchas las tuplas que tienen el campo plan_version en null.
Tomando de esas tuplas, 2 alumnos al azar
select * from mig._cnv_pk_alumnos where alumno in (5195, 5245);
Veo que el periodo_inscripcio lo tienen en null.
En las tablas mig.sga_alumnos y mig.sga_carrera_aspira existen.
En mig.sga_carrera_aspira sí tienen definido el periodo_inscripcio, y dicho período también existe en la tabla mig.sga_periodo_insc.
Los planes existen en mig.sga_planes, también en mig._cnv_pk_planes_versiones (verificando por carrera-plan-version).
También están definidos en negocio.sga_planes_versiones.
Puede influir en algo que tienen aprobadas diferentes actividades extracurriculares en distintas versiones del mismo plan?
Puede influir en algo que tienen aprobadas diferentes actividades extracurriculares en distintas versiones del mismo plan?
Si en la misma resolucion (mig.sga_resol_activ.resol_actividades) a un alumno le reconocieron mas de una actividad en diferentes versiones de plan, en este script toma una sola version de plan y registra esa.
Pero por lo que indicas no recupera ninguna de esas versiones de plan.
Fijate a que resolucion corresponde, agrega el campo [b]mig.sga_resol_activ.resol_actividades[/b] en la consulta anterior
Luego busca los registros relacionados con esa resolución
SELECT mig.sga_activ_alumno.*
FROM mig.sga_resol_activ
JOIN mig.sga_alumnos_resol ON mig.sga_alumnos_resol.unidad_academica = mig.sga_resol_activ.unidad_academica AND
mig.sga_alumnos_resol.resol_actividades = mig.sga_resol_activ.resol_actividades
JOIN mig._cnv_pk_alumnos as m_alu ON m_alu.unidad_academica = mig.sga_alumnos_resol.unidad_academica AND
m_alu.carrera = mig.sga_alumnos_resol.carrera AND
m_alu.legajo = mig.sga_alumnos_resol.legajo
JOIN sga_alumnos ON sga_alumnos.alumno = m_alu.alumno
JOIN mig.sga_activ_alumno ON mig.sga_activ_alumno.unidad_academica = mig.sga_resol_activ.unidad_academica
AND mig.sga_activ_alumno.resol_actividades = mig.sga_resol_activ.resol_actividades
AND mig.sga_activ_alumno.carrera = mig.sga_alumnos_resol.carrera
AND mig.sga_activ_alumno.legajo = mig.sga_alumnos_resol.legajo
/*
JOIN mig._cnv_pk_planes_versiones as m_pv ON m_pv.unidad_academica = mig.sga_activ_alumno.unidad_academica AND
m_pv.carrera = mig.sga_activ_alumno.carrera AND
m_pv.plan_g2 = mig.sga_activ_alumno.plan AND
m_pv.version = mig.sga_activ_alumno.version
*/
WHERE mig.sga_resol_activ.resol_actividades = 'xxxxxxxxx'
proba esta query sin el join con mig._cnv_pk_planes_versiones y con el join… (lo deje comentado)
Fijate si al agregar el join hace que no se recuperen registros.
En la tabla mig.sga_activ_alumno estan los datos del alumno con su plan y version, estos datos existen en Guarani 2?
(mig.sga_versiones_plan)
Tomando dicho documento y haciendo la siguiente consulta:
SELECT *
FROM mig.sga_resoluciones
JOIN mig._cnv_pk_documentos as cpd ON (cpd.resolucion = mig.sga_resoluciones.resolucion_numero)
WHERE cpd.documento = 1387;
Obtengo que mig.sga_resoluciones.resolucion = ‘000000000001409’
Ahora, la siguiente consulta no retorna nada:
SELECT * --m_pv.plan_version
FROM mig.sga_activ_alumno
-- JOIN mig._cnv_pk_planes_versiones as m_pv ON m_pv.unidad_academica = mig.sga_activ_alumno.unidad_academica AND
-- m_pv.carrera = mig.sga_activ_alumno.carrera AND
-- m_pv.plan_g2 = mig.sga_activ_alumno.plan AND
-- m_pv.version = mig.sga_activ_alumno.version
WHERE mig.sga_activ_alumno.unidad_academica = 'FCE'
AND mig.sga_activ_alumno.resol_actividades = '000000000001409'
-- AND mig.sga_activ_alumno.carrera = mig.sga_alumnos_resol.carrera
AND mig.sga_activ_alumno.legajo in (select legajo from mig._cnv_pk_alumnos where alumno in (5195, 5245));
Fijate para esa resolucion, que registros hay en las tablas:
SELECT * FROM mig.sga_alumnos_resol WHERE resol_actividades = '000000000001409';
SELECT * FROM mig.sga_activ_alumnos WHERE resol_actividades = '000000000001409';
Debieran existir los mismos alumnos. ¿Se corresponden?
Fijate a que resolucion corresponde, agrega el campo mig.sga_resol_activ.resol_actividades en la consulta anterior
Agregué el campo mig.sga_resol_activ.resol_actividades a la consulta y la restringí a los alumnos (5195, 5245):
Algunas de las resol_actividades que corresponden a un plan_version = NULL son ‘000000000001237’ y ‘000000000001409’.
Ahora, esta consulta no devuelve nada:
SELECT mig.sga_activ_alumno.*
FROM mig.sga_resol_activ
JOIN mig.sga_alumnos_resol ON mig.sga_alumnos_resol.unidad_academica = mig.sga_resol_activ.unidad_academica AND
mig.sga_alumnos_resol.resol_actividades = mig.sga_resol_activ.resol_actividades
JOIN mig._cnv_pk_alumnos as m_alu ON m_alu.unidad_academica = mig.sga_alumnos_resol.unidad_academica AND
m_alu.carrera = mig.sga_alumnos_resol.carrera AND
m_alu.legajo = mig.sga_alumnos_resol.legajo
JOIN sga_alumnos ON sga_alumnos.alumno = m_alu.alumno
JOIN mig.sga_activ_alumno ON mig.sga_activ_alumno.unidad_academica = mig.sga_resol_activ.unidad_academica
AND mig.sga_activ_alumno.resol_actividades = mig.sga_resol_activ.resol_actividades
AND mig.sga_activ_alumno.carrera = mig.sga_alumnos_resol.carrera
AND mig.sga_activ_alumno.legajo = mig.sga_alumnos_resol.legajo
/*
JOIN mig._cnv_pk_planes_versiones as m_pv ON m_pv.unidad_academica = mig.sga_activ_alumno.unidad_academica AND
m_pv.carrera = mig.sga_activ_alumno.carrera AND
m_pv.plan_g2 = mig.sga_activ_alumno.plan AND
m_pv.version = mig.sga_activ_alumno.version
*/
WHERE mig.sga_resol_activ.resol_actividades in ( '000000000001237', '000000000001409')
and mig.sga_activ_alumno.legajo in (select legajo from mig._cnv_pk_alumnos where alumno in (5195, 5245));
Con respecto a tu última pregunta:
SELECT count(*) FROM mig.sga_alumnos_resol WHERE resol_actividades = '000000000001409'; ---> 530 tuplas
SELECT count(*) FROM mig.sga_activ_alumno WHERE resol_actividades = '000000000001409'; ---> 512 tuplas
Es más:
SELECT count(*) FROM mig.sga_alumnos_resol; --->44922
SELECT count(*) FROM mig.sga_activ_alumno; --->40925
Aclaración, los pre-controles da lo siguiente:
Advertencia: Existen trámites de equivalencias que no tienen registradas equivalencias. Estos tramites de equivalencias no se migrarán.
Lo del mensaje de equivalencias no afecta, solo son tramites de equivalencias abiertos que no tenian registrada ninguna equivalencia. Es solo una advertencia.
SELECT count(*) FROM mig.sga_alumnos_resol; --->44922
SELECT count(*) FROM mig.sga_activ_alumno; --->40925
Esto tampoco afecta.
Las actividades extracurriculares en Guarani 2 se podian otorgar de la siguiente manera:
a) N actividades a 1 alumno
Un resgistro en sga_alumnos_resol y N registros en sga_activ_alumno (uno por cada actividad para ese alumno)
b) 1 actividad a N alumnos: N registros en sga_alumnos_resol, uno por cada alumno y N registros en sga_activ_alumno (uno por cada alumno-actividad)
Por favor, esta query anda descomentando cada JOIN para ver donde esta el problema:
SELECT *
FROM mig.sga_resol_activ
/*
JOIN mig.sga_alumnos_resol ON mig.sga_alumnos_resol.unidad_academica = mig.sga_resol_activ.unidad_academica AND
mig.sga_alumnos_resol.resol_actividades = mig.sga_resol_activ.resol_actividades
JOIN mig._cnv_pk_alumnos as m_alu ON m_alu.unidad_academica = mig.sga_alumnos_resol.unidad_academica AND
m_alu.carrera = mig.sga_alumnos_resol.carrera AND
m_alu.legajo = mig.sga_alumnos_resol.legajo
JOIN sga_alumnos ON sga_alumnos.alumno = m_alu.alumno
JOIN mig.sga_activ_alumno ON mig.sga_activ_alumno.unidad_academica = mig.sga_resol_activ.unidad_academica
AND mig.sga_activ_alumno.resol_actividades = mig.sga_resol_activ.resol_actividades
AND mig.sga_activ_alumno.carrera = mig.sga_alumnos_resol.carrera
AND mig.sga_activ_alumno.legajo = mig.sga_alumnos_resol.legajo
JOIN mig._cnv_pk_planes_versiones as m_pv ON m_pv.unidad_academica = mig.sga_activ_alumno.unidad_academica AND
m_pv.carrera = mig.sga_activ_alumno.carrera AND
m_pv.plan_g2 = mig.sga_activ_alumno.plan AND
m_pv.version = mig.sga_activ_alumno.version
*/
WHERE mig.sga_resol_activ.resol_actividades in ( '000000000001237', '000000000001409');
SELECT * FROM mig.sga_alumnos_resol WHERE resol_actividades = '000000000001409'
and legajo not in (SELECT legajo FROM mig.sga_activ_alumno WHERE resol_actividades = '000000000001409');
A ver si entiendo…
a) N actividades a 1 alumno
Un resgistro en sga_alumnos_resol y N registros en sga_activ_alumno (uno por cada actividad para ese alumno)
[b]sga_alumnos_resol[/b] debería tener menos registros que [b]sga_activ_alumno[/b] y no es nuestro caso, es al revés.
Mientras que:
b) 1 actividad a N alumnos: N registros en sga_alumnos_resol, uno por cada alumno y N registros en sga_activ_alumno (uno por cada alumno-actividad)
Deberían ser la misma cantidad de tuplas en ambas tablas para estos casos... no?