No existe la funcion get_mayor en Inscripcion a Materias de g3w

Hola, buenos dias. Actualizamos desde guarani 3.18.1 hacia la version 3.19.1 en un servidor de desarrollo. Estamos probando que ande todo normalmente, y nos encontramos con un error. En autogestion (g3w) al entrar como un alumno y dirigirnos hacia Inscripcion a Materias no se puede entrar a esa interfaz y en la parte inferior indica un error.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clase: SIU\Chulupi\ErrorKernelDb
mensaje: SQL ERROR: SQLSTATE[42883]: Undefined function: 7 ERROR: function get_mayor(timestamp with time zone, timestamp with time zone) does not exist
LINE 12: … sga_periodos_inscripcion_fechas.fecha_inicio AND get_mayor(…
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
SELECT
sga_periodos_inscripcion_fechas.fecha_inicio as periodo_activo_vigente
FROM sga_periodos_inscripcion_aplanado
JOIN sga_periodos_inscripcion_fechas ON sga_periodos_inscripcion_fechas.periodo_insc = sga_periodos_inscripcion_aplanado.periodo_insc
JOIN sga_periodos_inscripcion ON sga_periodos_inscripcion.periodo_inscripcion = sga_periodos_inscripcion_fechas.periodo_inscripcion
JOIN sga_periodos ON sga_periodos.periodo = sga_periodos_inscripcion.periodo
JOIN sga_periodos_genericos ON sga_periodos_genericos.periodo_generico = sga_periodos.periodo_generico
WHERE sga_periodos_inscripcion_aplanado.plan_version = ‘101’
AND sga_periodos_inscripcion_fechas.habilitado = ‘S’
AND sga_periodos_inscripcion_fechas.habilitado_interfaz in (0,2)
AND sga_periodos_genericos.periodo_generico_tipo = 1 – Periodos Lectivos.
AND CURRENT_TIMESTAMP BETWEEN sga_periodos_inscripcion_fechas.fecha_inicio AND get_mayor(sga_periodos_inscripcion_fechas.fecha_fin, sga_periodos_inscripcion_fechas.fecha_tope_bajas)
LIMIT 1;
traza: [TRAZA]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Lo que nos indica que no se encuentra esa funcion llamada get_mayor con esos argumentos.
Eso nos llevó a este post: https://foro.comunidad.siu.edu.ar/index.php?topic=21089.msg94051
Por lo que buscamos el archivo get_mayor.sql y lo corrimos en la DB de desarrollo. Retornando exitosamente creando la funcion.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CREATE OR REPLACE FUNCTION get_mayor(pValor1 anyelement, pValor2 anyelement)
RETURNS anyelement AS
$BODY$
BEGIN
IF pValor1 > pValor2 THEN
RETURN pValor1;
ELSE
RETURN pValor2;
END IF;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;
– ++++++++++++++++++++++++++++++ Fin Function +++++++++++++++++++++++++++++++++

– REVOKE EXECUTE ON FUNCTION get_mayor (anyelement, anyelement) FROM public;
GRANT EXECUTE ON FUNCTION get_mayor (anyelement, anyelement) to public;
/*
select * from get_mayor(current_timestamp , now());
select * from get_mayor(2 , 5);
select * from get_mayor(‘a’::varchar, ‘b’::varchar);
*/

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Sin embargo el error sigue persistiendo. Tendra que ver con alguna cache? Aun asi, por ejemplo, al probar la consulta del error en la base misma, tambien se sigue mostrando el error.

Por otro lado, habrá algo que hicimos mal? Es bastante raro que falte una función si durante el proceso de migración de la DB no hubo errores. Es acaso un bug conocido?

La funcion get_mayor existe en la base de Guarani3 en el esquema negocio.

Proba esto desde el PgAdmin (es como esta en autogestion. Hice la prueba y devuelve la fecha):

SET search_path = negocio;
SELECT sga_periodos_inscripcion_fechas.fecha_inicio as periodo_activo_vigente
      FROM sga_periodos_inscripcion_aplanado
      JOIN sga_periodos_inscripcion_fechas ON sga_periodos_inscripcion_fechas.periodo_insc = sga_periodos_inscripcion_aplanado.periodo_insc
      JOIN sga_periodos_inscripcion ON sga_periodos_inscripcion.periodo_inscripcion = sga_periodos_inscripcion_fechas.periodo_inscripcion
      JOIN sga_periodos ON sga_periodos.periodo = sga_periodos_inscripcion.periodo
      JOIN sga_periodos_genericos ON sga_periodos_genericos.periodo_generico = sga_periodos.periodo_generico
      WHERE sga_periodos_inscripcion_aplanado.plan_version = '101'
                    AND sga_periodos_inscripcion_fechas.habilitado = 'S'
                    AND sga_periodos_inscripcion_fechas.habilitado_interfaz in (0,2)
                    AND sga_periodos_genericos.periodo_generico_tipo = 1 -- Periodos Lectivos.
                    AND CURRENT_TIMESTAMP BETWEEN sga_periodos_inscripcion_fechas.fecha_inicio AND get_mayor(sga_periodos_inscripcion_fechas.fecha_fin, sga_periodos_inscripcion_fechas.fecha_tope_bajas)
                LIMIT 1;

y de esta forma:


SET search_path = negocio;
SELECT sga_periodos_inscripcion_fechas.fecha_inicio as periodo_activo_vigente
      FROM sga_periodos_inscripcion_aplanado
      JOIN sga_periodos_inscripcion_fechas ON sga_periodos_inscripcion_fechas.periodo_insc = sga_periodos_inscripcion_aplanado.periodo_insc
      JOIN sga_periodos_inscripcion ON sga_periodos_inscripcion.periodo_inscripcion = sga_periodos_inscripcion_fechas.periodo_inscripcion
      JOIN sga_periodos ON sga_periodos.periodo = sga_periodos_inscripcion.periodo
      JOIN sga_periodos_genericos ON sga_periodos_genericos.periodo_generico = sga_periodos.periodo_generico
      WHERE sga_periodos_inscripcion_aplanado.plan_version = '101'
                    AND sga_periodos_inscripcion_fechas.habilitado = 'S'
                    AND sga_periodos_inscripcion_fechas.habilitado_interfaz in (0,2)
                    AND sga_periodos_genericos.periodo_generico_tipo = 1 -- Periodos Lectivos.
                    AND CURRENT_TIMESTAMP BETWEEN sga_periodos_inscripcion_fechas.fecha_inicio AND get_mayor(sga_periodos_inscripcion_fechas.fecha_fin::date, sga_periodos_inscripcion_fechas.fecha_tope_bajas::date)
                LIMIT 1;

Gracias por la pronta respuesta. Ahi estuve probando esas dos consultas SQL… el resultado fue:

ERROR: function get_mayor(timestamp with time zone, timestamp with time zone) does not exist

y la otra:

ERROR: function get_mayor(date, date) does not exist

¿La función esta creada en la base en el esquema negocio?
La podes encontrar en la carpeta \BD\Ddl_nucleo\Funciones


get_mayor.sql (611 Bytes)

Si, el archivo get_mayor.sql lo tenemos en la carpeta indicada. Recien corri de nuevo el contenido del archivo. Modificandole a mano agregando en la definicion el prefijo del nombre del esquema.

CREATE OR REPLACE FUNCTION negocio.get_mayor(pValor1 anyelement, pValor2 anyelement)
RETURNS anyelement AS
$BODY$
BEGIN
IF pValor1 > pValor2 THEN
RETURN pValor1;
ELSE
RETURN pValor2;
END IF;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;
– ++++++++++++++++++++++++++++++ Fin Function +++++++++++++++++++++++++++++++++

– REVOKE EXECUTE ON FUNCTION get_mayor (anyelement, anyelement) FROM public;
GRANT EXECUTE ON FUNCTION negocio.get_mayor (anyelement, anyelement) to public;

Y ahi si que quedó creada realmente en la DB.
Queda resuelto, el tema de la función faltante.

Erwin, creo haber encontrado el problema. La función get_mayor() se creó para su uso en los scripts de migración de Guarani 2 a Guarani 3, pero nunca fue enviada en un script de conversión de base de Guarani 3.
Es por ello que puede ser que no la tenían creada en la base.
Veremos de agregarla en la próxima versión para que no vuelva a suceder con otras instituciones que no hayan pasado por la migración de Guarani 2 a Guarani 3.
Saludos!

Ticket: https://redmine.siu.edu.ar/redmine/issues/34949