Error en funcion de base de datos para duplicar libro de actas

Hola

Sigo intentando personalizar las actas de examen y de promocion. Encontre una funcion en la base de datos que basicamente duplica un libro de actas llamada “duplicar_libro_actas”. Le sirve a mi personalizacion ya que si el libro actual tiene todos los folios ocupados, es necesario crear un libro nuevo(NO un tomo) con un nuevo nombre siguiendo cierta logica.

Cuando llamo a la funcion en un ambiente de prueba, ocurre el error copiado al final.

Saludos!!

Error:

ERROR: column “cant_max_tomos” of relation “sga_libros_actas” does not exist
LINE 2: …ha_fin_vigencia, es_libro_activo, anio_academico, cant_max_t…
^
QUERY: INSERT INTO sga_libros_actas (
nro_libro, nombre, descripcion, fecha_activacion, fecha_fin_vigencia, es_libro_activo, anio_academico, cant_max_tomos)
SELECT nro_libro, nombre, descripcion, _fecha_actual, NULL, _activo, anio_academico, cant_max_tomos
FROM sga_libros_actas
WHERE libro = pLibro
CONTEXT: PL/pgSQL function f_duplicar_libro_de_actas(integer,character) line 20 at SQL statement
********** Error **********

ERROR: column “cant_max_tomos” of relation “sga_libros_actas” does not exist
SQL state: 42703
Context: PL/pgSQL function f_duplicar_libro_de_actas(integer,character) line 20 at SQL statement

Hola Francisco,

La función ‘f_duplicar_libro_de_actas’ está en desuso y seguramente desactualizada. Hoy estamos usando ‘f_duplicar_tomo_libro’. Quizás te sirva esta última y en caso contrario deberías adaptar la primera.

Saludos, Florencia.

Esa funcion no me sirve porque necesito duplicar el libro entero, en vez de generar un nuevo tomo para un libro ya existente.

En caso de tener que personalizar la funcion f_duplicar_libro_de_actas, es necesario metodo en especial? Estuve viendo en la documentacion de guarani y no encontre nada sobre personalizar funciones de la base de datos asi que queria preguntar.

Es necesario hacer una nueva, o con modificar la ya existente alcanza? Si hago una nueva, queda guardada en los metadatos?

Saludos y gracias por la respuesta!

Hola Francisco,

Te recomiendo crear una función nueva. Podés usar el código de ‘f_duplicar_libro_de_actas’ como punto de partida si considerás que te sirve. La nueva función debería estar en un esquema propio (por ejemplo, ‘negocio_pers’) dentro de la misma BD que el esquema de negocio de Guaraní. El nombre que puedo sugerirte es ‘uba-ffyb_f_duplicar_libro_de_actas’. Les recomendamos versionar el script de creación de la función dentro de la carpeta ‘personalizacion’ (algo similar a lo que enviamos desde el SIU en la carpeta <path proyecto Guaraní>/BD/Ddl/_nucleo/Funciones/).

Estamos completando la documentación al respecto. Por el momento sólo disponemos de esta página: http://documentacion.siu.edu.ar/wiki/SIU-Guarani/Version3.11.0/personalizaciones/extender_tablas. Un post que puede aportar sobre el tema es este: http://foro.comunidad.siu.edu.ar/index.php?topic=9278.

Saludos, Florencia.

Gracias por la documentacion, la voy a leer y tenerla en cuenta para crear la nueva funcion.

Mientras tanto les muestro como quedo la funcion que duplica el libro de actas. Unas pruebas preliminares parecen indicar que funciona bien, pero queria que el foro la vea a ver si se me escapo algo. Su definicion es muy parecida a la anterior, salvo un pequeño arreglo en un INSERT.


CREATE OR REPLACE FUNCTION negocio.f_duplicar_libro_de_actas(plibro integer, pactivarlibro character)
  RETURNS integer AS
$BODY$

 -- Variables locales
 DECLARE _libro_nuevo integer;
 DECLARE _libro_tomo_1 integer;
 DECLARE _fecha_actual DATE;
 DECLARE _activo char(1);

BEGIN
  _libro_nuevo  := NULL;
  _libro_tomo_1 := NULL;
  _fecha_actual := CURRENT_DATE;
  
  IF pActivarLibro = 'S' THEN
    _activo := 'S';
  ELSE
    _activo := 'N';
  END IF;
	
  INSERT INTO sga_libros_actas (
       nro_libro, nombre, descripcion, fecha_activacion, fecha_fin_vigencia, es_libro_activo, anio_academico)
    SELECT nro_libro, nombre, descripcion, _fecha_actual, NULL, _activo, anio_academico
      FROM sga_libros_actas
     WHERE libro = pLibro;

  -- Obtengo el ID del libro   
  _libro_nuevo := (SELECT currval('sga_libros_actas_seq'));

  -- Tomos del Libro
  INSERT INTO sga_libros_tomos (libro, nro_tomo, cant_max_folios, ultimo_acta, ultimo_folio)
    SELECT _libro_nuevo, 1, cant_max_folios, NULL, NULL
      FROM sga_libros_tomos
     WHERE libro = pLibro;

  -- Obtengo el id del tomo 1 del nuevo libro   
  SELECT libro_tomo 
    INTO _libro_tomo_1
    FROM sga_libros_tomos
   WHERE libro = _libro_nuevo
     AND nro_tomo = 1;

  -- Copio la definicion del libro 
  -- Alcance
  INSERT INTO sga_libros_actas_alcance (libro, origen) 
     SELECT _libro_nuevo, origen FROM sga_libros_actas_alcance WHERE libro = pLibro;

  -- Ubicacion
  INSERT INTO sga_libros_actas_ubicacion (libro, ubicacion) 
     SELECT _libro_nuevo, ubicacion FROM sga_libros_actas_ubicacion WHERE libro = pLibro;
  
  -- Propuestas
  INSERT INTO sga_libros_actas_propuesta (libro, propuesta) 
     SELECT _libro_nuevo, propuesta FROM sga_libros_actas_propuesta WHERE libro = pLibro;
  
  -- Actividades
  INSERT INTO sga_libros_actas_actividad (libro, elemento) 
     SELECT _libro_nuevo, elemento FROM sga_libros_actas_actividad  WHERE libro = pLibro;
  
  -- Inactivo el Libro de actas.    
  IF pActivarLibro = 'S' THEN
    UPDATE sga_libros_actas SET es_libro_activo = 'N' WHERE libro = pLibro;
  END IF;

  -- Retorno el id del tomo 1 del nuevo libro creado  
  RETURN _libro_tomo_1;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION negocio.f_duplicar_libro_de_actas(integer, character)
  OWNER TO postgres;
GRANT EXECUTE ON FUNCTION negocio.f_duplicar_libro_de_actas(integer, character) TO postgres;
GRANT EXECUTE ON FUNCTION negocio.f_duplicar_libro_de_actas(integer, character) TO public;

Capaz hay alguien con el mismo problema y le sirve. Si necesitan alguna informacion mas, avisenme.

Saludos!