Asignación automática de folios cuando se genera acta de examen

Estimados,

Estoy con un tema que no puedo resolver. Trataré de ser lo más claro posible.

Necesito personalizar el nro_acta, actualmente el sistema obtiene el nro. máximo a partir del origen del acta de examen.

Función generar_nro_acta del archivo co_actas.php

SELECT	COALESCE(MAX(CAST(sga_actas.nro_acta AS integer)), 0)  + 1 as nro_acta				
				FROM	sga_actas
				WHERE	sga_actas.origen = $origen

A partir de esto, empiezo a analizar como enumerar las actas comenzando en 0, dependiendo del libro de actas que corresponde, siendo nuestra identificación del acta: LIBRO + NRO_ACTA. ACLARACIÓN: Tenemos un libro para cada carrera, por ende existira el acta n°: MAESTRIA-0001, ESPECIALIZACION-0001, DOCTORADO-0001

Para saber que libro le corresponde a ese llamado, utilizo la función get_libro_de_actas, incorporada recientemente en la versión 3.11.2 . Hasta acá no hay problema, me devuelve el libro que corresponda en función de los alcances definidos para el mismo.

El problema se me presenta al rastrear cuál es el último numero de acta (si es que tiene) de ese libro, para luego sumarle 1. No encuentro la relación acta - libro, encuentro la relación acta - folio, que podría joinearla con libro para saber a cuál corresponde, pero el tema es que recién inserta el folio físico cuando se imprime el acta. Vi que el foliado se puede hacer al imprimir el acta o al cerrarla, ninguna de las dos opciones me sirve, ya que necesito resolverlo en la función generar_nro_acta .

Frente a este escenario se me ocurre una única idea y creo que no es la mejor, llamar a la función de imprimir acta inmediatamente luego de crear el acta, ahí me aseguro la relación acta-folio.

Podrían darme alguna ayuda ? Muchas gracias.

Saludos, Diego.

Hola Diego,

En el sistema no ofrecemos generar el foliado físico en el momento de la creación del acta porque pueden que no se hayan cargado todos los alumnos integrantes en ese momento, y por lo tanto no podemos determinar la cantidad de folios que ocupará. Por eso si ustedes lo van a personalizar, deberán tenerlo presente.

Según lo que exponés, al momento de generar el acta ya disponés de toda la data para obtener el libro en el cual será foliado el acta. Lo que no sabés todavía es en qué tomo estará, y qué folios ocupará, pero con la función y los alcances llegás al libro.

Podrías entonces, en el momento de la generación, obtener el nombre del libro, y buscar el último número de acta asignado para ese libro (en sus tomos) y sumarle uno, para construir el número de acta en ese momento.

La única salvedad que hay que hacer a este método trataré de exponerla con el siguiente ejemplo: generás dos actas que reciben los números MAESTRIA-0049 (1 folio) y MAESTRIA-0050 (1 folio). Supongamos que tenés definido que el foliado físico se realiza en el momento de la impresión. Imprimís primero la 50 y luego la 49. En el libro de actas, figurará foliado primero MAESTRIA-0050 y luego MAESTRIA-0049.

Si eso no es problema, entonces podrías personalizar la generación de número de acta con esa estrategia en el momento de la creación. Si no, habrá que pensar en otro mecanismo.

Saludos,
Fernando

Estimado Fernando, gracias por la respuesta.

Copio una de tus lineas

Podrías entonces, en el momento de la generación, obtener el nombre del libro, y buscar el último número de acta asignado para ese libro (en sus tomos) y sumarle uno, para construir el número de acta en ese momento.

Ahí es donde no logro solucionarlo. Obtengo el libro a partir del llamado, pero no se cómo llegar al nro_acta máximo a partir de ese libro. Es decir, si creo un libro nuevo, este figura en sga_libros_actas y sga_libros_tomos, pero en ningun lado tengo la relación con sga_actas, salvo que se imprima y se genere el folio y recién ahí encuentro la relación en sga_actas_folios.

Está bien mi lectura o estoy olvidando alguna tabla para poder joinear?

Por otro lado, hay problemas si olvidamos el foliado físico dentro del sistema? Es decir, a nosotros nos auditan con el concepto de LIBRO-ACTA, no le dan importancia al folio físico. Por eso por nuestra parte no hay problema en el ejemplo que mencionabas del foliado al momento de impresión, pero me gustaría saber si a nivel sistema puede traer algún inconveniente.

Saludos, Diego.

Hola

Si con el llamado-mesa, al momento de crear el acta podes determinar el libro, con la asociación llamado-mesa–acta podes determinar la última acta que corresponde al libro.
Es asi?

Emilio

Diego:

  • en sga_actas_folios tenés la relación acta ↔ libro tomo.
  • en sga_actas, a partir de id_acta podés seleccionar el max. nro_acta, siguiendo como ejemplo lo que hay en el core del sistema (tal vez tengas que hacer algún manejo para sacar los caracteres no numéricos).
  • en sga_libros_tomos, a partir del libro_tomo llegás al libro
  • si obtuviste el libro con la función a partir de los alcances, ya tenés todo para cruzar la información.

Tratá de armar la query con esta información, y cualquier cosa volvenos a consultar.

Saludos!

Fernando,

El problema está en lo primero que mencionas.

en sga_actas_folios tenés la relación acta <-> libro tomo.

Está relación existe siempre y cuando se folee el acta, en mi caso, cuando se imprima. Acá es donde no se cómo resolverlo, el resto de los puntos que mencionas es tal cual dices.

Otra alternativa que me ocurre, crear una tabla que me lleve relación id_acta, nro_acta, nro_libro.

  • Ves algún problema al implementar esto?
  • En qué esquema de la bd tendría que crearlo?
  • Perdería la tabla en alguna actualización de Guaraní?

Muchas gracias.

Saludos, Diego.

Todavía no tenés al acta foliada, pero sabés en qué libro va a ir. Y sabés qué actas fueron foliadas en algún tomo de ese libro. El foliado lo harás después, pero la asignación de número de acta la dejás lista, de acuerdo a las reglas que tenés que implementar.

Ahora, si no es esa la estrategia que tenés que implementar, se debería reveer todo el proceso.

Fernando,

Si estoy arrancando un libro, en sga_actas_folios no voy a tener registros para ese reciente libro creado porque no imprimí ningún acta
Este es el query:

select max(cast(a.nro_acta as int)) from sga_actas a
inner join sga_actas_folios af on
af.id_acta = a.id_acta
where af.libro_tomo = 5

Por otro lado, supongamos que tenga un registro de alguna acta impresa y consecuentemente foliada, no me garantiza tener todas las actas en sga_actas_folios porque podría ser que algunas no se imprimieron.

La opción de la tabla adicional no lo ves viable?

Saludos, Diego.

Hola Diego,

Con respecto al caso de no tener ningún acta en el libro, es justamente lo que te cubre el COALESCE. Si la primera opción es null, se toma la segunda (0), y al resultado que sea se le suma 1.


SELECT	COALESCE(MAX(CAST(sga_actas.nro_acta AS integer)), 0)  + 1 as nro_acta
...

De todas maneras, creo que la solución que planteás con una tabla que oficie de “contador” es la mejor alternativa.

Si no desarrollaste todavía ninguna personalización de base de datos, deberías arrancar por crear un nuevo esquema (por lo general recomendamos llamarlo “negocio_pers”), y allí definir tu tabla. Solemos recomendar ponerle como sufijo a las tablas propias el nombre de la institución (en este caso _unlz). Luego deberías agregarlo a la fuente Guaraní en el Toba Editor, indicando que la misma está compuesta por los esquemas “negocio” y “negocio_pers”, pero que “negocio” es el esquema default.

Definir “negocio” como esquema default implica que las queries que ejecute el sistema tendrán como search_path = ‘negocio’, y cuando tengas que hacer referencia a algún objeto de “negocio_pers” deberás calificarlo explícitamente. Ej: SELECT … FROM negocio_pers.sga_nombre_tabla_unlz WHERE …

Cualquier otra duda escribinos y lo vemos.

Saludos,
Fernando

Perfecto Fernando. Analizaré lo más conveniente.
Existe alguna documentación respecto a personalización de base de datos que mencionas?
Muchas gracias.

Saludos, Diego.

Hola Diego,

No está exactamente lo que necesitás, pero en esta documentación sobre cómo extender una tabla del sistema podrás encontrar la mayoría de los tips que mencionamos anteriormente.

Si querés, cuando termines el script enviamelo para validarlo.

Saludos!
Fernando

Fernando,

Te hago otra consulta, estoy viendo que al momento de clickear generar acta, también se verifica que el nro_acta no esté repetido en sga_actas.
Qué pasa si anulo ese control y permito los nro_acta repetidos? puede traer algún inconveniente en otro proceso? porque veo que la pk y todas las fk de sga_actas es a través del id_acta.

Aguardo comentarios.

Muchas gracias.

Saludos, Diego.

Hola Diego,

A nivel modelo de datos, no hay un índice único por el campo “nro_acta”, y como vos decís, el campo clave es el serial “id_acta”. Pero te pregunto: ¿por qué razón quisieras anular ese control? Si lo vas a generar automáticamente, no deberías tener repetidos.

Saludos

Fernando,

En realidad sí vamos a tener nro_actas repetidos. Paso a explicarte cómo lo manejamos acá.
Tenemos un libro por CARRERA-AÑO-PERIODO_EXAMEN.
Por ejemplo:
Para la Maestría, año 2016, periodo de examenes JULIO/AGOSTO (que para nosotros es el periodo 3), se llama: MAE2016-3
Para el Doctorado, idem que el anterior, se llama: DOC2016-3
Para la Especialización, idem que el anterior, se llama: ESP2016-3

Esto quiere decir que cada libro es único para la carrera, año y periodo de exámen. No hay posibilidad que se repitan los libros.

Luego vamos a la generación del NRO_ACTA, que se arma con algunos datos del libro, precisamente con el AÑO y PERIODO_EXAMEN. Por ejemplo:
Libro: MAE2016-3 Acta: 20163000001
Libro: MAE2016-3 Acta: 20163000002
Libro: MAE2016-3 Acta: 20163000003

Fijate que el nro de acta se arma con los datos del libro, le saca el MAE y el “-”. Entonces si seguimos con esta lógica, para el Doctorado sería:

Libro:DOC2016-3 Acta: 20163000001
Libro:DOC2016-3 Acta: 20163000002
Libro:DOC2016-3 Acta: 20163000003

Fijate que todas las actas se repiten, y acá es cuando analizo alternativas y se me ocurren 2.

  1. Quitar el control en la generación del acta, para que permita duplicidad en NRO_ACTA de sga_actas. (Quisiera asegurarme que ninguna otra operación del sistema me puede traer problemas)
  2. Agregar en el NRO_ACTA el libro completo sin guiones, es decir:
    Libro: MAE2016-3 Acta: MAE20163000001
    Libro:DOC2016-3 Acta: DOC20163000001
    Ahí me aseguro que el nro_acta es único.

Qué me recomendas?

Por otro lado, con esta lógica fijate que el folio físico no lo utilizamos, es más pienso en el reporte de impresión de acta directamente sacarlo para que no genere confusión. ¿El no utilizar folio físico dentro del sistema puede traer algún problema?

Aguardo comentarios. Desde ya muchas gracias.

Saludos, Diego.

Si no utilizan el folio fisico, no trae ningun problema que no lo asignen. El campo en la base permite nulos (sga_actas_folios.folio_fisico).
Respecto al número de actas es un dato conceptual, no esta referenciado en ninguna parte de la base de datos. Es el nro que se imprime en las actas que identifica una mesa de examen (es decir un examen de una actividad en una fecha) en este caso y por lo que decis cobraria mayor importancia porque como comentas el foliado fisico no lo van a registrar.
Mi duda es porque registrar el dato del libro de actas en el mismo nùmero del acta ya que este dato del libro de actas esta registrado en la tabla de actas en otro campo, por lo cual lo podes recuperar facilmente buscando el libro por ese campo.
Lo de duplicidad del nro de acta, el unico problema es que en las busquedas de actas en el sistema, cuando busques por un número de acta que esta repetido te recupere todas las actas con ese mismo número. No es mas que ese problema que pueda darse.

Creo que legalmente lo mas importante es el foliado fisico (el que generalmente se muestra en los certificados analíticos), es decir en que folio del libro de actas esta registrado el examen del alumno. Es por este número de folio fisico y libro de actas por el cual en una auditoria o en un control de títulos se puede encontrar y verificar la nota del examen.

Fernando, paso a responderte:

Mi duda es porque registrar el dato del libro de actas en el mismo nùmero del acta ya que este dato del libro de actas esta registrado en la tabla de actas en otro campo, por lo cual lo podes recuperar facilmente buscando el libro por ese campo.
Registramos todos esos datos en el nro_acta porque así nos audita Rectorado cuando presentamos los libros de actas.

Seguiré analizando cómo resolverlo. Muchas gracias por tus comentarios.

Saludos, Diego.

Fernando,

Por dónde tendría que revisar para anular la función de control de actas?
Muchas gracias.

Saludos, Diego