Error consulta "Propuesta" en reporte "Ficha de la persona"

Buenas tardes:
Hemos definido un perfil funcional y un perfil de datos restringido a ciertas carreras para un tipo de usuario de gestión. Este usuario sólo tiene acceso a todos los reportes del sistema, pero no modifica datos de ningún tipo. Cuando ingresa y hace la consulta del reporte “Ficha de la persona”, en la opción “Propuesta” arroja este error:

SQLSTATE: db_42P01

CODIGO: 7

MENSAJE: ERROR: missing FROM-clause entry for table “p_insc”\nLINE 1: …opuestas_aspira.plan_version JOIN sga_planes ON (p_insc.pro…\n ^

SQL: SELECT sga_propuestas_aspira.propuesta_aspira, sga_propuestas_aspira.propuesta, “(” || sga_propuestas.codigo || ") - " || sga_propuestas.nombre as propuesta_nombre, sga_propuestas_aspira.anio_academico, sga_propuestas_aspira.fecha_inscripcion, sga_situacion_aspirante.resultado_asp, CASE WHEN sga_situacion_aspirante.resultado_asp = “R” THEN “Rechazada” WHEN sga_situacion_aspirante.resultado_asp = “P” THEN “Pendiente” WHEN sga_situacion_aspirante.resultado_asp = “A” THEN “Aceptada” END as estado_inscr_descr, sga_tipos_ingreso.nombre as tipo_ingreso_nombre, sga_ubicaciones.nombre as ubicacion_nombre, u_insc.nombre as ubicacion_nombre_insc, sga_modalidad_cursada.nombre as modalidad_nombre, m_insc.nombre as modalidad_nombre_insc, sga_planes.nombre as plan_nombre, p_insc.nombre as plan_nombre_insc, sga_alumnos.legajo as legajo, CASE WHEN sga_situacion_aspirante.resultado_asp = “R” THEN cast(null as char(1)) ELSE sga_alumnos_calidad.nombre END as calidad, CASE WHEN sga_situacion_aspirante.resultado_asp = “R” THEN cast(null as char(1)) ELSE sga_alumnos.regular END as regular, sga_propuestas_aspira.observaciones, CASE WHEN sga_situacion_aspirante.resultado_asp = “R” AND sga_propuestas_aspira.observaciones_rechazo IS NULL THEN sga_situacion_aspirante.nombre ELSE sga_propuestas_aspira.observaciones_rechazo END as observaciones_rechazo, (SELECT mc.nombre FROM sga_alumnos_hist_calidad as hc JOIN sga_alumnos_motivos_calidad as mc ON mc.motivo_calidad = hc.motivo_calidad WHERE hc.cambio_calidad = COALESCE((SELECT b.cambio_calidad FROM sga_alumnos_hist_calidad as b WHERE b.alumno = sga_alumnos.alumno AND b.calidad = sga_alumnos.calidad ORDER BY b.fecha DESC LIMIT 1),0) ) as desc_motivo_cambio_calidad, f_orientaciones_alumno(sga_alumnos.alumno) as orientacion FROM sga_propuestas_aspira JOIN sga_propuestas ON sga_propuestas_aspira.propuesta = sga_propuestas.propuesta JOIN sga_alumnos ON (sga_alumnos.persona = sga_propuestas_aspira.persona AND sga_alumnos.propuesta = sga_propuestas_aspira.propuesta) JOIN sga_alumnos_calidad ON sga_alumnos_calidad.calidad = sga_alumnos.calidad JOIN sga_ubicaciones ON sga_ubicaciones.ubicacion = sga_alumnos.ubicacion JOIN sga_ubicaciones as u_insc ON u_insc.ubicacion = sga_propuestas_aspira.ubicacion JOIN sga_modalidad_cursada ON sga_modalidad_cursada.modalidad = sga_alumnos.modalidad JOIN sga_modalidad_cursada as m_insc ON m_insc.modalidad = sga_propuestas_aspira.modalidad JOIN sga_situacion_aspirante ON sga_situacion_aspirante.situacion_asp = sga_propuestas_aspira.situacion_asp JOIN sga_planes_versiones ON sga_planes_versiones.plan_version = sga_alumnos.plan_version JOIN sga_planes_versiones as pv_insc ON pv_insc.plan_version = sga_propuestas_aspira.plan_version JOIN sga_planes ON (p_insc.propuesta) IN\n( SELECT toba_pdtasoc_3.propuesta\n FROM vw_ug_propuestas toba_pdtasoc_3\n WHERE ( toba_pdtasoc_3.unidad_gestion IN (“5”) ) )\n AND sga_planes.plan = sga_planes_versiones.plan JOIN sga_planes as p_insc ON p_insc.plan = pv_insc.plan LEFT JOIN sga_tipos_ingreso ON sga_tipos_ingreso.tipo_ingreso = sga_propuestas_aspira.tipo_ingreso WHERE true AND sga_propuestas_aspira.persona = “35730” – toba_log: 12242

Para un perfil funcional sin restricción alguna en su perfil de datos, este reporte funciona a la perfección.

Esperamos alguna indicación sobre cómo resolver este problema.

Saludos cordiales y gracias

Hola Mariano,

Hay un error allí que fue reportado en este post. Creás por favor una nueva solicitud en el Gestor de Solicitudes?

Saludos, Florencia,

Hola Florencia,

Nosotros también tuvimos este problema. El error en realidad no está en Guaraní, sino que es más grave, ya que está en la forma en que Toba aplica los perfiles de datos. Potencialemnte este error puede estar presente en todas las consultas en donde se aplican perfiles de datos, tanto en las nativas de Guaraní como en las personalizadas.

El problema radica en que Toba no soporta que una tabla trigger aparezca más de una vez en una consulta. En este caso en particular el problema está en la tabla sga_planes, que aparece 2 veces, la primera vez sin alias y la segunda con el alias p_insc. A demás, el filtrado del perfil de datos sólo aplica a la primera tabla y no a la segunda.

Yo resolví el problema aplicando un parche al archivo vendor/siu-toba/framework/php/nucleo/lib/toba_perfil_datos.php y me gustaría poder compartirlo con la comunidad.

¿Cómo podría hacerlo?

Saludos.

Hola Agustín,

Podés adjuntar el archivo acá y lo pasamos al equipo de SIU-Toba o directamente postearlo en el foro Toba - Desarrollo si te parece.

Gracias! Saludos, Florencia.

Ahí paso el archivo modificado… le falta pulir y sacar cosas que se usaban en el archivo viejo, pero funciona.

La idea básicamente es, antes al perfil funcional se lo calculaba de esta forma, por ejemplo

de la siguiente consulta:


SELECT  * 
FROM     tabla_sin_restricciones
JOIN        tabla_con_restricciones 
                   ON  tabla_sin_restricciones.columna1 = tabla_con_restricciones.columna2
JOIN        tabla_con_restricciones as alias_tabla 
                   ON tabla_con_restricciones .columna_join = alias_tabla.columna_join

Con el filtrado original obtendríamos una consulta similar a esta:


SELECT  * 
FROM     tabla_sin_restricciones
JOIN        tabla_con_restricciones 
                   ON  tabla_sin_restricciones.columna1 = tabla_con_restricciones.columna2 /* INICIO FILTRADO */  AND alias_tabla.columna_filtrado = condicion_filtrado /* FIN FILTRADO */
JOIN        tabla_con_restricciones as alias_tabla ON tabla_con_restricciones .columna_join = alias_tabla.columna_join
                   ON tabla_con_restriccion_filtrado .columna_join = alias_tabla.columna_join

Dando el error que alias_tabla no existe. Con el parche, la consulta quedaría de esta forma:


/* INICIO FILTRADO */
WITH tabla_con_restriccion_filtrado as (
    SELECT * FROM tabla_con_restricciones WHERE columna_filtrado = condicion_filtrado
)
/* FIN FILTRADO */
SELECT  * 
FROM     tabla_sin_restricciones
JOIN        tabla_con_restriccion_filtrado 
                   ON  tabla_sin_restricciones.columna1 = tabla_con_restriccion_filtrado.columna2
JOIN        tabla_con_restriccion_filtrado as alias_tabla 
                   ON tabla_con_restriccion_filtrado .columna_join = alias_tabla.columna_join

Es decir, se crea un WITH antes del select, y se reemplazan todas las ocurrencias de la tabla filtrada dentro de la consulta.

Saludos.

Pd: Tuve que modificar el nombre del archivo y agregar la extensión .txt para que me deje subirlo


toba_perfil_datos.php.txt (26 KB)