Error en plan de estudios.

Buen día. estamos trabajando con la versión 3.18.1 y un usuario nos reportó el siguiente problema; cuando quiere acceder a un plan de estudios desde la operación “Administrar planes de estudios” le sale el siguiente mensaje:

SQLSTATE: db_22P05

CODIGO: 7

MENSAJE: ERROR: carácter con secuencia de bytes 0xe2 0x80 0x9c en codificación «UTF8» no tiene equivalente en la codificación «LATIN1»

SQL: SELECT get_plan_contenido.elemento,\n get_plan_contenido.entidad_tipo,\n get_plan_contenido.entidad_subtipo,\n get_plan_contenido.entidad_clase_gui as elemento_clase_gui,\n get_plan_contenido.elemento_padre,\n get_plan_contenido.codigo,\n get_plan_contenido.nombre,\n get_plan_contenido.elemento_revision,\n get_plan_contenido.elemento_comp,\n get_plan_contenido.orden\n \n FROM get_plan_contenido(“1107”)\n JOIN sga_g3entidades_subtipos ON (get_plan_contenido.entidad_subtipo = sga_g3entidades_subtipos.entidad_subtipo)\n \n WHERE true – toba_log: 6514846

Cual puede ser el problema?
Gracias,
Naimid.

Hola Naimid,

Se trata de un inconveniente con el encoding de alguno de los datos que retorna la consulta SQL: en la BD se ingresó un caractér UTF8 que no se puede representar en LATIN1.
Por defecto las bases de datos PostgreSQL están en UTF8 y Guaraní trabaja en LATIN1. Cuando se establece la conexión, Guaraní indica a la BD que quiere trabajar con el encoding LATIN1 y el motor se encarga de convertir entre uno y otro.
Este error puede surgir cuando cargan datos directamente sobre la BD, sin utilizar el sistema.
Se me ocurre que revisen los elementos del plan-versión 107 para ver si encuentran algún caracter extraño en el nombre (columnas ‘nombre’, ‘nombre_abreviado’ de las tablas ‘sga_elementos’ o ‘sga_elementos_plan’).
Prueben desde un editor sql lo siguiente:

SET CLIENT_ENCODING TO 'LATIN1';
SELECT nombre, nombre_abreviado FROM sga_elementos_plan;

Si tienen algun caracter no soportado en LATIN1 va a mostrar un mensaje como el siguiente:
‘utf-8’ codec can’t decode byte 0xf3 in position 10: invalid continuation byte

Saludos, Florencia.
3

Hola, agrego a lo de Florencia:

Se puede crear la siguiente función en Postgres y con la misma buscar registros que no sean LATIN1/iso-8859-1:


CREATE OR REPLACE FUNCTION is_latin(input text)
RETURNS boolean
LANGUAGE plpgsql
IMMUTABLE
AS $$
BEGIN
  PERFORM convert_to(input, 'iso-8859-15');
    RETURN true;
EXCEPTION
  WHEN untranslatable_character THEN
    RETURN false;
END;
$$;

SELECT nombre, nombre_abreviado FROM sga_elementos_plan WHERE NOT is_latin(nombre);

Referencia:
https://stackoverflow.com/questions/25287639/how-to-identify-if-a-value-in-column-can-be-encoded-to-latin-in-postgres

saludos.
2