Error en Precontrol de Equivalencias

Buenas tardes!. Estamos migrando desde sistemas externos a G3, ver. 3.18.1. Llegamos al módulo de equivalencias donde me tira el precontrol el siguiente error:

2021/08/02 14:06:00 - Entrada Tabla.0 - ERROR: type “control_type” does not exist
Where: PL/pgSQL function ext.sp_ctrl_equivalencia() line 33 at assignment

Ya probe borrando la funcion desde “functions” de la base de datos e intentando migrar otra vez con el pentaho pero sigue creando mal la funcion por algún motivo.

Gracias de antemano, saludos!

En la carpeta \01_Schema\00_Esquema esta el archivo script_02_crear_tipos_de_datos.sql
Abrilo y ejecutalo asi crea ese tipo de datos.
Luego volve a probar.

Hola, el script de tipos de datos se ejecuta bien, pero el pre control sigue sin funcionar.

Saludos.

Si ejecutas esto en el PGAdmin, te da error?

SELECT (false,'PRUEBA RETORNO CONTROL_TYPE','SELECT * FROM SGA_ALUMNOS')::ext.control_type;

Fijate la imagen que adjunto.

2


CONTROL_TYPE.png

CONTROL_TYPE.png

Eso ejecuta bien, el control_type existe también, por algún motivo para el pre control de equivalencias no existe.

Saludos.

Ese tipo de datos, esta en el esquema ext, esquema public o negocio?
Porque si esta en el esquema “ext” y da error significa que es un problema de seteo del search_path al momento de ejecutar los pre_controles del modulo de equivalencias.

El control_type esta en el esquema ext.

Si ese script del pre-control de equivalencias lo corres desde el PgAdmin previamente seteando el path “negocio”, da error?

La function se crea bien, pero al momento de ejecutarla sigue tirando que no existe el control_type.

Proba correr esto:


DO $$
DECLARE i integer;
BEGIN

select count(*) INTO i 
  from pg_class as c,  pg_namespace as n
 where c.relname = 'control_type'
   and c.relnamespace = n.oid
   and n.nspname = 'ext';  -- esquema de migracion externo.

IF i = 0 THEN
  -- DROP TYPE ext.control_type
  CREATE TYPE ext.control_type AS (
				estado boolean,
				mensaje text,
				query text
			     ); 

END IF;
END $$;


			      
DROP FUNCTION IF EXISTS ext.sp_ctrl_equivalencia()

CREATE OR REPLACE FUNCTION ext.sp_ctrl_equivalencia() RETURNS SETOF ext.control_type AS $$
DECLARE
  sql text;
  r ext.control_type;
  v_ok text;
  _cnt_reg INTEGER;
  _cnt_nulo INTEGER;
  _cnt_not_nulo INTEGER;
  _b INTEGER;
  cursor1  RECORD;
  cursor2  RECORD;
BEGIN
	-- +++++++ Controles: Personas ++++++++--
	SET search_path = negocio;

	-- +++++++ controles para la tabla plana mig_equivalencia
	
	-- +++++++ Controles: Alumnos ++++++++-- 

    --  Verifico que el alumno exista en G3.
	IF EXISTS (SELECT tipo_documento, nro_documento, propuesta_alumno FROM ext.mig_equivalencia as e
	            WHERE NOT EXISTS (SELECT 1 FROM mdp_personas_documentos as pd, sga_alumnos as a 
	                              WHERE pd.tipo_documento = e.tipo_documento 
	                                AND pd.nro_documento  = e.nro_documento
	                                AND a.persona   = pd.persona 
	                                AND a.propuesta  = e.propuesta_alumno)) THEN
		sql='SELECT tipo_documento, nro_documento, propuesta_alumno FROM ext.mig_equivalencia as e
	            WHERE NOT EXISTS (SELECT 1 FROM mdp_personas_documentos as pd, sga_alumnos as a 
	                              WHERE pd.tipo_documento = e.tipo_documento 
	                                AND pd.nro_documento  = e.nro_documento
	                                AND a.persona   = pd.persona 
	                                AND a.propuesta  = e.propuesta_alumno)';
		r := (false,'Error: Hay alumnos que no estan en Guarani 3, verifique!!',sql)::control_type;
		RETURN NEXT r;
	END IF;

-- Que el alumno exista en la propuesta y en la version del plan de estudios.
	IF EXISTS (SELECT tipo_documento, nro_documento, propuesta_alumno, plan_version  FROM ext.mig_equivalencia
	           EXCEPT
	           SELECT pd.tipo_documento, pd.nro_documento, a.propuesta, a.plan_version
	             FROM mdp_personas_documentos as pd, sga_alumnos as a 
	            WHERE a.persona = pd.persona) THEN
		sql='SELECT tipo_documento, nro_documento, propuesta_alumno, plan_version  FROM ext.mig_equivalencia
	           EXCEPT
	           SELECT pd.tipo_documento, pd.nro_documento, a.propuesta, a.plan_version
	             FROM mdp_personas_documentos as pd, sga_alumnos as a 
	            WHERE a.persona = pd.persona';
		r := (false,'Error: Hay alumnos y su version de plan de estudios (TIPO_DOCUMENTO + NRO_DOCUMENTO + PROPUESTA_ALUMNO + PLAN_VERSION) que no estan en Guarani 3 en la tabla sga_alumnos, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
		                                

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE plan_version NOT IN (SELECT plan_version FROM sga_planes_versiones)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE plan_version NOT IN (SELECT plan_version FROM sga_planes_versiones)';
		r := (false,'Error: hay datos en el campo PLAN_VERSION que no existen en Guarani 3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE propuesta_alumno NOT IN (SELECT propuesta FROM sga_propuestas)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE propuesta_alumno NOT IN (SELECT propuesta FROM sga_propuestas)';
		r := (false,'Error: Hay datos en el campo PROPUESTA_ALUMNO que no se encuentran cargados en Guarani 3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen NOT IN (SELECT origen FROM sga_equiv_tramite_origen)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE origen NOT IN (SELECT origen FROM sga_equiv_tramite_origen)';
		r := (false,'Error: Hay datos en el campo ORIGEN que no se encuentran cargados en Guarani3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE documento_tipo NOT IN (SELECT documento_tipo FROM sga_documentos_tipos)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE documento_tipo IN (SELECT documento_tipo FROM sga_documentos_tipos)';
		r := (false,'Error: Hay datos en el campo DOCUMENTO_TIPO que no son validos, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE institucion IS NOT NULL AND institucion NOT IN (SELECT institucion FROM sga_instituciones)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE institucion IS NOT NULL AND institucion NOT IN (SELECT intitucion FROM sga_instituciones)';
		r := (false,'Error: Hay datos en el campo INSTITUCION que no son validos, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE responsable_academica IS NOT NULL AND responsable_academica NOT IN (SELECT responsable_academica FROM sga_responsables_academicas)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE responsable_academica IS NOT NULL AND responsable_academica NOT IN (SELECT responsable_academica FROM sga_responsables_academicas)';
		r := (false,'Error: Hay datos en el campo RESPONSABLE_ACADEMICA que no son las validos, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE convenio IS NOT NULL AND convenio NOT IN (SELECT convenio FROM sga_convenios)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE convenio IS NOT NULL AND convenio NOT IN (SELECT convenio FROM sga_convenios)';
		r := (false,'Error: Hay datos en el campo CONVENIO que no son validos, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE  propuesta_origen IS NOT NULL AND propuesta_origen NOT IN (SELECT propuesta FROM sga_propuestas)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE  propuesta_origen IS NOT NULL AND propuesta_origen NOT IN (SELECT propuesta FROM sga_propuestas)';
		r := (false,'Error: Hay datos en el campo PROPUESTA_ORIGEN que no se encuentran cargados en Guarani 3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE plan_origen IS NOT NULL AND plan_origen NOT IN (SELECT plan FROM sga_planes)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE  plan_origen IS NOT NULL AND plan_origen NOT IN (SELECT plan FROM sga_planes)';
		r := (false,'Error: Hay datos en el campo PLAN_ORIGEN que no se encuentran cargados en Guarani 3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE elemento NOT IN (SELECT elemento FROM sga_elementos WHERE entidad_subtipo >= 50)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE elemento NOT IN (SELECT elemento FROM sga_elementos WHERE entidad_subtipo >= 50)';
		r := (false,'Error: Hay datos el campo ELEMENTO que no se encuentran cargados en Guarani3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE instancia NOT IN (10,11,12)) THEN
		sql=E'SELECT * FROM ext.mig_equivalencia WHERE instancia NOT IN (10,11,12)';
		r := (false,'Error: Hay datos en el campo INSTANCIA que no son validos, valores correctos(10-Total,11-Regularidad,12-Parcial), verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE escala_nota NOT IN (SELECT escala_nota FROM sga_escalas_notas)) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE escala_nota NOT IN (SELECT escala_nota FROM sga_escalas_notas)';
		r := (false,'Error: Hay datos en el campo ESCALA_NOTA que no se encuentran cargados en Guarani3, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

-- QUE Existan las notas en las escalas de notas
	IF EXISTS (SELECT escala_nota, nota FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota FROM sga_escalas_notas_det) THEN
		sql='SELECT escala_nota, nota FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota FROM sga_escalas_notas_det';
		r := (false,'Error: Existe notas (ESCALA_NOTA + NOTA) que no existen en la tabla de escalas de nota de Guarnai 3 (sga_escalas_notas_det), verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;

-- QUE Existan las notas y se corresponda el resultado en las escalas de notas
	IF EXISTS (SELECT escala_nota, nota, resultado FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota, resultado FROM sga_escalas_notas_det) THEN
		sql='SELECT escala_nota, nota, resultado FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota, resultado FROM sga_escalas_notas_det';
		r := (false,'Error: Existen resultados de notas (ESCALA_NOTA + NOTA + RESULTADO) que no existen en la tabla de escalas de notas de Guarnai 3 (sga_escalas_notas_det), verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;


	-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    -- EQUIVALENCIAS EXTERNAS
	-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    -- Denominacion origen de actividad externa
	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND actividad_ext IS NULL) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND actividad_ext IS NULL';
		r := (false,'Error: EQUIVALENCIA EXTERNA -> Debe ingresar la denominación de la actividad externa (ACTIVIDAD_EXT) que dio origen a la equivalencia, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	-- Fecha origen equiv externa
	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND fecha_ext IS NULL) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND fecha_ext IS NULL';
		r := (false,'Error: EQUIVALENCIA EXTERNA -> Debe ingresar la fecha de aprobacion/desaprobación de la actividad externa (FECHA_EXT) que dio origen a la equivalencia, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	
	-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    -- EQUIVALENCIAS INTERNAS
	-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    -- Que exista la propuesta origen
	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND propuesta_origen IS NULL) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND propuesta_origen IS NULL';
		r := (false,'Error: EQUIVALENCIA INTERNA -> Debe ingresar el dato de Propuesta Origen (PROPUESTA_ORIGEN), verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	-- Que exista la actividad origen
	IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND actividad_int IS NULL) THEN
		sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND actividad_int IS NULL';
		r := (false,'Error: EQUIVALENCIA INTERNA -> Debe ingresar el dato de Actividad Origen (ACTIVIDAD_INT), verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	-- Que la actividad exista en la base
	IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.actividad_int IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sga_elementos as e WHERE e.elemento = eq.actividad_int AND e.entidad_subtipo >= 50)) THEN
		sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.actividad_int IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sga_elementos as e WHERE e.elemento = eq.actividad_int AND e.entidad_subtipo >= 50)';
		r := (false,'Error: EQUIVALENCIA INTERNA -> El dato de la Actividad Origen (ACTIVIDAD_INT) no se corresponde con una actividad, verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	-- Que este cargada una fecha
	IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.fecha_int IS NULL) THEN
		sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.fecha_int IS NULL';
		r := (false,'Error: EQUIVALENCIA INTERNA -> Falta ingresar el dato de la fecha Origen (FECHA_INT), verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	-- El origen de la actividad origen debe ser uno de los siguietnes
	IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.origen_int NOT IN ('Examen','Cursada', 'Promocion','Equivalencia','Resolucion')) THEN
		sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.origen_int NOT IN (''Examen'',''Cursada'', ''Promocion'',''Equivalencia'',''Resolucion'')';
		r := (false,'Error: EQUIVALENCIA INTERNA -> El origen (ORIGEN_INT) de la actividad origen debe ser uno de los siguientes: Examen, Cursada, Promocion, Equivalencia, Resolucion. Verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;
	-- El resultado de la actividad origen debe ser uno de los siguientes
	IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.resultado_int NOT IN ('A','R')) THEN
		sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.resultado_int NOT IN (''A'',''R'')';
		r := (false,'Error: EQUIVALENCIA INTERNA -> El resultado (RESULTADO_INT) de la actividad origen debe ser uno de los siguientes: A, R. Verifique!!',sql)::ext.control_type;
		RETURN NEXT r;
	END IF;


  RETURN;

END
$$ LANGUAGE plpgsql;

y despues ejecutar esta funcion:


select * from ext.sp_ctrl_equivalencia();

Sigue saltando el mismo error.

Hola
cuando ejecutas en pgadmin el código sigue dando error ? o desde Pentaho?
En todo caso podríamos volver a revisar esta configuración ?

https://documentacion.siu.edu.ar/wiki/SIU-Guarani/version3.19.0/migracion/kettle/configuracion

muchas gracias
saludos

4

Hola buen dia, si da error en cualquiera de los casos. La configuración del pentaho esta perfecta, solo falla con equivalencias.

Saludos!

Buenas, les faltaba aclarar el esquema ext en uno control_type dentro de la function:

r := (false,‘Error: Hay alumnos que no estan en Guarani 3, verifique!!’,sql)::ext.control_type; <-----

Ya lo solucione, gracias.

Saludos!

Hola Lautaro, gracias por avisar.
En la prueba que hacia no me daba error porque nunca entraba a esa parte del código porque la base donde probaba estaba bien el control!.