Error al dar de baja inscripcion a cursada (Autogestion)

Buenass,

Estamos con un problema extraño porque se da en producción pero no localmente. Los alumnos no se pueden dar de baja una inscripción a cursada. El mensaje de error es “Error al dar de baja inscripción a cursada”

El unico log que escribe algo es el de la app


================================================================================
=================================   ERRORES   ==================================
================================================================================

clase: SIU\Chulupi\ErrorKernelNotificaciones
mensaje: Error dando de baja tu inscripci�n
traza: [TRAZA]

---[ 0 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\controlador->finalizar_request_con_notificaciones
- file: /etc/autogestion/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/controlador.php, linea 427
- param:
         0: Error dando de baja tu inscripci�n   1: Array
(
    [0] => Array
        (
            [mcuerpo] => Error al dar de baja la inscripci�n a cursada
            [mtipo] => E
        )

)

---[ 1 ]-----------------------------------------

- function: siu\operaciones\cursada\controlador->accion__baja_inicial
- file: /etc/autogestion/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/controlador.php, linea 422

---[ 2 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\controlador->invocar_accion
- file: /etc/autogestion/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/controlador.php, linea 154
- param:
         0: baja_inicial
---[ 3 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\controlador->procesar_accion
- file: /etc/autogestion/releases/20220303100218/src/siu/extension_kernel/controlador_g3w2.php, linea 91

---[ 4 ]-----------------------------------------

- function: siu\extension_kernel\controlador_g3w2->procesar_accion
- file: /etc/autogestion/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/AccesoWeb.php, linea 107

---[ 5 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\AccesoWeb::procesar_request
- file: /etc/autogestion/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/AccesoWeb.php, linea 25

---[ 6 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\AccesoWeb::procesar
- file: /etc/autogestion/releases/20220303100218/src/siu/www/index.php, linea 15


########################################################################################################################

--F<1>:E<1>:W<0>:T<0 s>:M<0 Mb>--

== FIN =============================================

El problema seguramente está aca


	function accion__baja()
	{
		$url_actividad = $this->validate_param('materia', 'post', validador::TIPO_ALPHANUM, array('allowempty' => true));
		$url_inscripcion = $this->validate_param('inscripcion', 'post', validador::TIPO_ALPHANUM);

		try {
			$resultado = $this->modelo()->evt__eliminar_inscripcion($url_actividad, $url_inscripcion);
			$this->guardar_id_cert_baja($url_inscripcion, $resultado[2]);
			$href = kernel::vinculador()->crear('cursada', 'comprobante_baja', array('baja' => $url_inscripcion));
			$link = kernel::traductor()->trans('link_baja_cursada', array('%1%' => $href));
			kernel::renderer()->add_to_ajax_response('mensaje_cert_baja', $resultado[0] . " " . $link);
			$pagelet = $this->vista()->pagelet('info_materia');
			$pagelet->set_estado_info(pagelet_info_materia::MATERIA_SELECCIONADA);
			$this->add_var('mensajes', $resultado['advertencias']);
			$this->add_pagelet_vars($url_actividad, $url_inscripcion);
			kernel::renderer()->add($this->vista()->pagelet('info_materia'));
		} catch (error_guarani $e) {
			kernel::renderer()->add_csrf($this->generar_csrf());
			$this->finalizar_request_con_notificaciones(kernel::traductor()->trans('error_baja_cursada'), $e->get_mensajes_usuario());
		}
	}

Pero lo raro es que la acción de inscribir que utiliza parámetros similares SÍ funciona.

Cualquier ayuda es bienvenida.
Gracias!

View Issue

Hola Emiliano,

Podrías poner los logs en modo debug (‘nivel’ => log::NIVEL_DEBUG, en instalacion/config.php), volver a reproducir el error y nos volves a pasar los logs (adjunta el archivo completo que se genera).

El error lo da en accion__baja_inicial de src/siu/operaciones/cursada/controlador.php, se puede dar porque viaja mal algún valor desde el POST, falla en la validación del CSRF o en la eliminación de la inscripción (alguna query que da error). Con los logs en modo debug vamos a tener mas detalles del error.

saludos.
2

hola Leonel,
Configurando el loggeo de esa forma pudimos ver que se trataba de un error de permiso de usuario en la base de datos.
Ya esta solucionado.

Muchas gracias!

Hola buenos dias, ahora estamos con el mismo error, me podrias dar una pista de como corregiste el error en la base de datos.
De ante mano muchas gracias.
Saludos.

Hola Nahuel,

Puede que sea un permiso en el usuario de base de datos para ejecutar la función f_insc_cursada_eliminar de Postgres. El usuarios de base de datos esta en la sección accesos del archivo instalacion/config.php.

Para revisar si el usuario de Postgres tiene permisos en la función f_insc_cursada_eliminar podes usar la siguiente query:


SELECT proname, rolname
  FROM pg_proc pr,
       pg_type tp,
       pg_authid id
 WHERE proowner = id.oid
   AND tp.oid = pr.prorettype
   AND tp.typname <> 'trigger'
   AND pr.pronamespace IN (
       SELECT oid
         FROM pg_namespace
        WHERE nspname NOT LIKE 'pg_%'
          AND nspname != 'information_schema'
          AND proname = 'f_insc_cursada_eliminar'
);

Fuentes:
https://stackoverflow.com/questions/3021879/how-to-check-permissions-to-functions-under-psql-console
https://stackoverflow.com/questions/40759177/postgresql-show-all-the-privileges-for-a-concrete-user
https://linuxhint.com/check-postgres-user-privileges/

Si es posible envíame los logs y lo vemos.

saludos.
4

Hola. Tenemos el mismo problema en v 3.20.3 pero en algunas materias da el error y en otras no.

Hasta ahora, veo que el error lo dan en las materias que tienen subcomisión.

Que puede ser?

Hola @jhdiaz , ¿nos podrías dar mas contexto del error (logs si es posible)?

Nos da este error.

Los logueos se los pido al técnico.

Lo que he notado es que el problema con la baja es con comisiones que tienen subcomisión práctica. Las subcmisiones tienen cupo, pero he probado sacándoselos y sigue el mismo error.

No ocurre en todas las inscripciones a cursar, hasta ahora el problema es con las subcomisiones

Gracias @jhdiaz , pero necesito lo que registra en instalacion/i__desarrollo/p__guarani/logs/sistema.log al momento del error, para saber si es un problema de permisos en la función f_insc_cursada_eliminar, seguramente en los logs tenes registrado un error de SQL.

Esto me pasan los técnicos.

Archivo: /usr/local/proyectos/guarani/vendor/siu-toba/framework/php/nucleo/componentes/interface/toba_ei_cuadro.php, lInea 1897

    toba_ei_cuadro->disparar_eventos

Archivo: /usr/local/proyectos/guarani/vendor/siu-toba/framework/php/nucleo/componentes/interface/toba_ci.php, lInea 201

    toba_ci->disparar_eventos

Archivo: /usr/local/proyectos/guarani/php/extension_toba/componentes/interface/guarani_ci.php, lInea 28

    guarani_ci->disparar_eventos

Archivo: /usr/local/proyectos/guarani/vendor/siu-toba/framework/php/nucleo/componentes/interface/toba_ci.php, lInea 201

    toba_ci->disparar_eventos

Archivo: /usr/local/proyectos/guarani/php/extension_toba/componentes/interface/guarani_ci.php, lInea 28

    guarani_ci->disparar_eventos

Archivo: /usr/local/proyectos/guarani/vendor/siu-toba/framework/php/nucleo/toba_solicitud_web.php, lInea 135

    toba_solicitud_web->procesar_eventos

Archivo: /usr/local/proyectos/guarani/vendor/siu-toba/framework/php/nucleo/toba_solicitud_web.php, lInea 55

    toba_solicitud_web->procesar

Archivo: /usr/local/proyectos/guarani/vendor/siu-toba/framework/php/nucleo/toba_nucleo.php, lInea 96

    toba_nucleo->acceso_web

Archivo: /usr/local/proyectos/guarani/www/aplicacion.php, lInea 33

@jhdiaz Gracias por los logs!!!

El error Error al dar de baja la inscripción a cursada. (indice 800SIU_baja_insc_cursada_error_db) lo puede dar en dos funciones: f_insc_cursada_eliminar o f_insc_cursada_rechazar_preinscripcion.

Suele ser un error de DB, ¿no hay nada mas en los logs que parezca un error de DB?

¿En los logs de Postgres no registra nada?

Saludos.

La función tiene los permisos

Estos son los logs:

2026-03-11 19:47:13.017 UTC [1236524] postgres@toba_3_3 ERROR: update or delete on table “sga_insc_cursada” violates foreign key constraint “fk_sga_insc_subcomision_sga_insc_cursada” on table “sga_insc_subcomision”
2026-03-11 19:47:13.017 UTC [1236524] postgres@toba_3_3 DETAIL: Key (inscripcion)=(387105) is still referenced from table “sga_insc_subcomision”.
2026-03-11 19:47:13.017 UTC [1236524] postgres@toba_3_3 STATEMENT: DELETE
FROM sga_insc_cursada
WHERE inscripcion = 387105
– toba_log: 870264625

2026-03-11 19:47:39.680 UTC [1236996] postgres@toba_3_3 ERROR: update or delete on table “sga_insc_cursada” violates foreign key constraint “fk_sga_insc_subcomision_sga_insc_cursada” on table “sga_insc_subcomision”
2026-03-11 19:47:39.680 UTC [1236996] postgres@toba_3_3 DETAIL: Key (inscripcion)=(387105) is still referenced from table “sga_insc_subcomision”.
2026-03-11 19:47:39.680 UTC [1236996] postgres@toba_3_3 STATEMENT: DELETE
FROM sga_insc_cursada
WHERE inscripcion = 387105
– toba_log: 870264626

Gracias por los logs!!!

Parece que falla al querer eliminar en la tabla sga_insc_cursada porque tiene un registro en sga_insc_subcomision que aun sigue haciendo referencia (inscripcion = 387105):

f_insc_cursada_eliminar.sql y f_insc_cursada_rechazar_preinscripcion.sql.

Lo extraño es que unas lineas antes de hace el DELETE FROM sga_insc_subcomision WHERE inscripcion = pInscripcion; y DELETE FROM sga_insc_subcomision WHERE inscripcion = pInscripcion;

¿se trata de Inscripción sin prioridades o Inscripción con prioridades ?

En caso de ser Inscripción con prioridades hubo arreglos para la versión 3.23.0 ticket #50609, en tal caso crea un GDS y te pasamos el adelanto.

Saludos.

Son inscripciones sin prioridades.

¿Y porqué puede ser que no la borra de sga_insc_subcomision a la inscripción que queremos dar de baja?

Hola Javier, en que version estan?

El proceso f_insc_cursada_eliminar borra registros de la tabla sga_insc_subcomision

Te enviamos ese proceso y comparalo con el que tenes.

Estamos en 3.20.3

Les paso lo que dice la función de eliminar y la de rechazar, porque tampoco podemos rechazar a estas inscripciones que tienen subcomisiones.

f_insc_cursada_rechazar_preinscripcion.txt (4,1 KB)

f_insc_cursada_eliminar.txt (8,4 KB)

Hola @jhdiaz

Hay algo raro:

En f_insc_cursada_eliminar tenemos:

    -- Borro las inscripciones
  IF _con_subcomisiones THEN
    IF _insc.tipo = 'I' THEN
      -- Inscripcion sin prioridades  
      DELETE FROM sga_insc_subcomision WHERE inscripcion = pInscripcion;
    ELSE 
      -- Inscripcion con prioridades  
      DELETE FROM sga_insc_subcomision 
          WHERE inscripcion IN (SELECT inscripcion FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
    END IF;       
  END IF;
  
  IF _insc.tipo = 'I' THEN
    -- Inscripcion sin prioridades  
    DELETE FROM sga_insc_cursada_instancias WHERE inscripcion = pInscripcion;
    DELETE FROM sga_insc_cursada WHERE inscripcion = pInscripcion;
  ELSE
    -- Inscripcion con prioridades  
    DELETE FROM sga_insc_cursada_instancias
          WHERE inscripcion IN (SELECT inscripcion FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
    DELETE FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion;
  END IF;

Con lo cual si _insc.tipo = 'I' primero elimina en sga_insc_subcomision y luego en sga_insc_cursada, lo cual hace raro el error que te da.

Revisa si la función f_insc_cursada_eliminar hace lo que dice el archivo SQL:

SELECT pg_get_functiondef('f_insc_cursada_eliminar'::regproc);

o sino:

SELECT prosrc 
FROM pg_proc 
WHERE proname = 'f_insc_cursada_eliminar';

Sino directamente volve a ejecutar f_insc_cursada_eliminar descomentando la linea que dice DROP FUNCTION f_insc_cursada_eliminar (integer);, ya que dicha función no debería romperse siguiendo la lógica de ejecución.

Saludos.

Da esto:
CREATE OR REPLACE FUNCTION negocio.f_insc_cursada_eliminar(pinscripcion integer)
RETURNS type_retorno_inscripcion
LANGUAGE plpgsql
AS $function$

DECLARE
cur_retorno type_retorno_inscripcion;
_con_subcomisiones boolean;
_cnt Smallint;
_ComisionNombre varchar(100);
_fecha_baja Timestamp;
_nro_transaccion_baja Integer;
_fecha_actual Varchar(10);
_flag_baja char(1);

– Datos de la Inscripcion
_insc sga_insc_cursada%ROWTYPE;

BEGIN

– Variables
cur_retorno.resultado := 1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_ok’;
cur_retorno.mensaje_param := NULL;

_flag_baja := ‘B’;
_nro_transaccion_baja := NULL;
_con_subcomisiones := false;
_cnt := 0;
_ComisionNombre := ‘’;

– ********************************************************************
– 1. Verifico que exista la inscripcion a dar de baja
– ********************************************************************
SELECT * INTO _insc FROM sga_insc_cursada WHERE inscripcion = pInscripcion;

IF NOT FOUND THEN
– No existe la inscripción a dar de baja.
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_no_existe_insc’;
cur_retorno.mensaje_param := NULL;
RETURN cur_retorno;
END IF;

– ********************************************************************
– 2. Verifico que este en fecha para ser eliminada
– ********************************************************************

– Este control ya esta realizado al momento de recuperar las inscripciones
– debido a que solo recupera inscripciones que estan en fecha para poder darlas de baja.

– ********************************************************************
– 3. Verifico que no este incluida en un acta de la comision
– ********************************************************************
– Acta de Cursada o Promocion Cerrada
SELECT Count(*) INTO _cnt
FROM sga_actas,
sga_actas_detalle
WHERE sga_actas.comision = _insc.comision
AND sga_actas_detalle.id_acta = sga_actas.id_acta
AND sga_actas_detalle.alumno = _insc.alumno
AND sga_actas.estado = ‘C’;
IF _cnt > 0 THEN
SELECT nombre INTO _ComisionNombre FROM sga_comisiones WHERE comision = _insc.comision;
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_acta’;
cur_retorno.mensaje_param := _ComisionNombre;
RETURN cur_retorno;
END IF;

– Acta de Cursada o Promocion abierta
SELECT Count(*) INTO _cnt
FROM sga_actas,
sga_eval_detalle_cursadas
WHERE sga_actas.comision = _insc.comision
AND ((sga_eval_detalle_cursadas.id_acta_cursada = sga_actas.id_acta AND sga_eval_detalle_cursadas.instancia_cursada = 1 AND sga_actas.origen = ‘R’) OR
(sga_eval_detalle_cursadas.id_acta_promocion = sga_actas.id_acta AND sga_eval_detalle_cursadas.instancia_promocion = 1 AND sga_actas.origen = ‘P’)
)
AND sga_eval_detalle_cursadas.alumno = _insc.alumno
AND sga_actas.estado = ‘A’;

IF _cnt > 0 THEN
SELECT nombre INTO _ComisionNombre FROM sga_comisiones WHERE comision = _insc.comision;
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_acta’;
cur_retorno.mensaje_param := _ComisionNombre;
RETURN cur_retorno;
END IF;

– ++++++++++++++++++++ Fin Controles fijos ++++++++++++++++++++++++++++++++++++++++++

– Verifico si tiene subcomisiones
SELECT COUNT(*) INTO _cnt
FROM sga_subcomisiones
WHERE comision IN (SELECT comision FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
IF _cnt > 0 THEN
_con_subcomisiones := true;
END IF;

– Comienza la Transacción
BEGIN

/*
– ********************************************************************
– Actualizacion del cupo. Se pasó al trigger de delete de sga_insc_cursada y sga_insc_subcomision
– ********************************************************************
IF _con_subcomisiones THEN
IF _insc.tipo = ‘I’ THEN
– Actualizo el cupo en las subcomisiones si hay subcomisiones
UPDATE sga_subcomisiones_cupo
SET cant_inscriptos = cant_inscriptos - 1
WHERE subcomision IN (SELECT subcomision FROM sga_insc_subcomision WHERE inscripcion = pInscripcion);

   ELSE
     -- Busco inscripciones por nro de transaccion
     UPDATE sga_subcomisiones_cupo
        SET cant_inscriptos = cant_inscriptos - 1
      WHERE subcomision IN (SELECT sga_insc_subcomision.subcomision 
                             FROM sga_insc_cursada, 
                                  sga_insc_subcomision
                            WHERE sga_insc_cursada.nro_transaccion = \_insc.nro_transaccion
                              AND sga_insc_subcomision.inscripcion = sga_insc_cursada.inscripcion);
   END IF;
 END IF; -- con subcomisiones

 -- Actualizo el cupo en la comision
 IF \_insc.tipo = 'I' THEN
     -- Actualizo el cupo en comision
     UPDATE sga_comisiones_cupo
        SET cant_inscriptos = cant_inscriptos - 1
      WHERE comision = \_insc.comision;
 ELSE
   -- Inscripción por prioridades/alternativas
   -- Actualizo el cupo en las comisiones en las que se pre-inscribió el alumno (inscripcion con prioridad
   UPDATE sga_comisiones_cupo
      SET cant_inscriptos = cant_inscriptos - 1
    WHERE comision IN (SELECT comision FROM sga_insc_cursada WHERE nro_transaccion = \_insc.nro_transaccion);
 END IF;

– ****************** FIN Actualizacion cupo **************************
*/

– ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
– Doy de baja la inscripcion
– ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_fecha_baja := CURRENT_TIMESTAMP;
_nro_transaccion_baja := (SELECT nextval(‘aud_nro_transaccion_seq’));

– Inserto el registro en la tabla de log.
– En el caso que sea inscripciones por prioridades, solo registra en el log la de prioridad 1.
INSERT INTO sga_insc_cursada_log (
inscripcion, comision, alumno, plan_version, tipo, prioridad, estado_preinscripcion,
fuera_de_termino, estado, sq_token, interfaz, fecha_inscripcion, nro_transaccion, exceptuado,
operacion ,nro_transaccion_log, fecha_operacion)
VALUES(pInscripcion, _insc.comision, _insc.alumno, _insc.plan_version, _insc.tipo, _insc.prioridad, _insc.estado_preinscripcion,
_insc.fuera_de_termino, _insc.estado, _insc.sq_token, _insc.interfaz, _insc.fecha_inscripcion, _insc.nro_transaccion, _insc.exceptuado,
_flag_baja, _nro_transaccion_baja, _fecha_baja);
– AND prioridad = 1;

– Borro las inscripciones
IF _con_subcomisiones THEN
IF _insc.tipo = ‘I’ THEN
– Inscripcion sin prioridades
DELETE FROM sga_insc_subcomision WHERE inscripcion = pInscripcion;
ELSE
– Inscripcion con prioridades
DELETE FROM sga_insc_subcomision
WHERE inscripcion IN (SELECT inscripcion FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
END IF;
END IF;

IF _insc.tipo = ‘I’ THEN
– Inscripcion sin prioridades
DELETE FROM sga_insc_cursada_instancias WHERE inscripcion = pInscripcion;
DELETE FROM sga_insc_cursada WHERE inscripcion = pInscripcion;
ELSE
– Inscripcion con prioridades
DELETE FROM sga_insc_cursada_instancias
WHERE inscripcion IN (SELECT inscripcion FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
DELETE FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion;
END IF;

– Bloque de excepciones. Sale por error.
EXCEPTION
WHEN OTHERS THEN
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_error_db’;
cur_retorno.mensaje_param := NULL;
cur_retorno.sqlstate := SQLSTATE;
cur_retorno.sqlerrm := SQLERRM;
RETURN cur_retorno;

END; – Fin bloque de actualizacion en la base

– BAJA OK.
– Seteo valores para retorno
cur_retorno.resultado := 1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_ok’;
cur_retorno.mensaje_param := cast(_nro_transaccion_baja as varchar);
cur_retorno.inscripcion := pInscripcion;
cur_retorno.fecha := _fecha_baja;
cur_retorno.nro_transaccion := _nro_transaccion_baja;

– Retorno datos de la baja de la inscripcion
RETURN cur_retorno;

END;
$function$

Y esta otra

Da esto:

DECLARE
cur_retorno type_retorno_inscripcion;
_con_subcomisiones boolean;
_cnt Smallint;
_ComisionNombre varchar(100);
_fecha_baja Timestamp;
_nro_transaccion_baja Integer;
_fecha_actual Varchar(10);
_flag_baja char(1);

– Datos de la Inscripcion
_insc sga_insc_cursada%ROWTYPE;

BEGIN

– Variables
cur_retorno.resultado := 1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_ok’;
cur_retorno.mensaje_param := NULL;

_flag_baja := ‘B’;
_nro_transaccion_baja := NULL;
_con_subcomisiones := false;
_cnt := 0;
_ComisionNombre := ‘’;

– ********************************************************************
– 1. Verifico que exista la inscripcion a dar de baja
– ********************************************************************
SELECT * INTO _insc FROM sga_insc_cursada WHERE inscripcion = pInscripcion;

IF NOT FOUND THEN
– No existe la inscripción a dar de baja.
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_no_existe_insc’;
cur_retorno.mensaje_param := NULL;
RETURN cur_retorno;
END IF;

– ********************************************************************
– 2. Verifico que este en fecha para ser eliminada
– ********************************************************************

– Este control ya esta realizado al momento de recuperar las inscripciones
– debido a que solo recupera inscripciones que estan en fecha para poder darlas de baja.

– ********************************************************************
– 3. Verifico que no este incluida en un acta de la comision
– ********************************************************************
– Acta de Cursada o Promocion Cerrada
SELECT Count(*) INTO _cnt
FROM sga_actas,
sga_actas_detalle
WHERE sga_actas.comision = _insc.comision
AND sga_actas_detalle.id_acta = sga_actas.id_acta
AND sga_actas_detalle.alumno = _insc.alumno
AND sga_actas.estado = ‘C’;
IF _cnt > 0 THEN
SELECT nombre INTO _ComisionNombre FROM sga_comisiones WHERE comision = _insc.comision;
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_acta’;
cur_retorno.mensaje_param := _ComisionNombre;
RETURN cur_retorno;
END IF;

– Acta de Cursada o Promocion abierta
SELECT Count(*) INTO _cnt
FROM sga_actas,
sga_eval_detalle_cursadas
WHERE sga_actas.comision = _insc.comision
AND ((sga_eval_detalle_cursadas.id_acta_cursada = sga_actas.id_acta AND sga_eval_detalle_cursadas.instancia_cursada = 1 AND sga_actas.origen = ‘R’) OR
(sga_eval_detalle_cursadas.id_acta_promocion = sga_actas.id_acta AND sga_eval_detalle_cursadas.instancia_promocion = 1 AND sga_actas.origen = ‘P’)
)
AND sga_eval_detalle_cursadas.alumno = _insc.alumno
AND sga_actas.estado = ‘A’;

IF _cnt > 0 THEN
SELECT nombre INTO _ComisionNombre FROM sga_comisiones WHERE comision = _insc.comision;
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_acta’;
cur_retorno.mensaje_param := _ComisionNombre;
RETURN cur_retorno;
END IF;

– ++++++++++++++++++++ Fin Controles fijos ++++++++++++++++++++++++++++++++++++++++++

– Verifico si tiene subcomisiones
SELECT COUNT(*) INTO _cnt
FROM sga_subcomisiones
WHERE comision IN (SELECT comision FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
IF _cnt > 0 THEN
_con_subcomisiones := true;
END IF;

– Comienza la Transacción
BEGIN

/*
– ********************************************************************
– Actualizacion del cupo. Se pasó al trigger de delete de sga_insc_cursada y sga_insc_subcomision
– ********************************************************************
IF _con_subcomisiones THEN
IF _insc.tipo = ‘I’ THEN
– Actualizo el cupo en las subcomisiones si hay subcomisiones
UPDATE sga_subcomisiones_cupo
SET cant_inscriptos = cant_inscriptos - 1
WHERE subcomision IN (SELECT subcomision FROM sga_insc_subcomision WHERE inscripcion = pInscripcion);

   ELSE
     -- Busco inscripciones por nro de transaccion
     UPDATE sga_subcomisiones_cupo
        SET cant_inscriptos = cant_inscriptos - 1
      WHERE subcomision IN (SELECT sga_insc_subcomision.subcomision 
                             FROM sga_insc_cursada, 
                                  sga_insc_subcomision
                            WHERE sga_insc_cursada.nro_transaccion = \_insc.nro_transaccion
                              AND sga_insc_subcomision.inscripcion = sga_insc_cursada.inscripcion);
   END IF;
 END IF; -- con subcomisiones

 -- Actualizo el cupo en la comision
 IF \_insc.tipo = 'I' THEN
     -- Actualizo el cupo en comision
     UPDATE sga_comisiones_cupo
        SET cant_inscriptos = cant_inscriptos - 1
      WHERE comision = \_insc.comision;
 ELSE
   -- Inscripción por prioridades/alternativas
   -- Actualizo el cupo en las comisiones en las que se pre-inscribió el alumno (inscripcion con prioridad
   UPDATE sga_comisiones_cupo
      SET cant_inscriptos = cant_inscriptos - 1
    WHERE comision IN (SELECT comision FROM sga_insc_cursada WHERE nro_transaccion = \_insc.nro_transaccion);
 END IF;

– ****************** FIN Actualizacion cupo **************************
*/

– ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
– Doy de baja la inscripcion
– ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_fecha_baja := CURRENT_TIMESTAMP;
_nro_transaccion_baja := (SELECT nextval(‘aud_nro_transaccion_seq’));

– Inserto el registro en la tabla de log.
– En el caso que sea inscripciones por prioridades, solo registra en el log la de prioridad 1.
INSERT INTO sga_insc_cursada_log (
inscripcion, comision, alumno, plan_version, tipo, prioridad, estado_preinscripcion,
fuera_de_termino, estado, sq_token, interfaz, fecha_inscripcion, nro_transaccion, exceptuado,
operacion ,nro_transaccion_log, fecha_operacion)
VALUES(pInscripcion, _insc.comision, _insc.alumno, _insc.plan_version, _insc.tipo, _insc.prioridad, _insc.estado_preinscripcion,
_insc.fuera_de_termino, _insc.estado, _insc.sq_token, _insc.interfaz, _insc.fecha_inscripcion, _insc.nro_transaccion, _insc.exceptuado,
_flag_baja, _nro_transaccion_baja, _fecha_baja);
– AND prioridad = 1;

– Borro las inscripciones
IF _con_subcomisiones THEN
IF _insc.tipo = ‘I’ THEN
– Inscripcion sin prioridades
DELETE FROM sga_insc_subcomision WHERE inscripcion = pInscripcion;
ELSE
– Inscripcion con prioridades
DELETE FROM sga_insc_subcomision
WHERE inscripcion IN (SELECT inscripcion FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
END IF;
END IF;

IF _insc.tipo = ‘I’ THEN
– Inscripcion sin prioridades
DELETE FROM sga_insc_cursada_instancias WHERE inscripcion = pInscripcion;
DELETE FROM sga_insc_cursada WHERE inscripcion = pInscripcion;
ELSE
– Inscripcion con prioridades
DELETE FROM sga_insc_cursada_instancias
WHERE inscripcion IN (SELECT inscripcion FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion);
DELETE FROM sga_insc_cursada WHERE nro_transaccion = _insc.nro_transaccion;
END IF;

– Bloque de excepciones. Sale por error.
EXCEPTION
WHEN OTHERS THEN
cur_retorno.resultado := -1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_error_db’;
cur_retorno.mensaje_param := NULL;
cur_retorno.sqlstate := SQLSTATE;
cur_retorno.sqlerrm := SQLERRM;
RETURN cur_retorno;

END; – Fin bloque de actualizacion en la base

– BAJA OK.
– Seteo valores para retorno
cur_retorno.resultado := 1;
cur_retorno.mensaje_indice := ‘800SIU_baja_insc_cursada_ok’;
cur_retorno.mensaje_param := cast(_nro_transaccion_baja as varchar);
cur_retorno.inscripcion := pInscripcion;
cur_retorno.fecha := _fecha_baja;
cur_retorno.nro_transaccion := _nro_transaccion_baja;

– Retorno datos de la baja de la inscripcion
RETURN cur_retorno;

END;

Tengo información nueva que tal vez cambia todo, pero seguimos sin resolverlo.

Las inscripciones las hicieron los estudiantes y llegaron hasta la comisión. Luego, se crearon las subcomisiones, por la operación Administrar cursadas y se fueron creando las distintas subcomisiones.
Y luego, para distribuir a los estudiantes entre las subcomisiones, lo que se hizo fue un insert en la tabla sga_insc_subcomisiones.
¿Eso estará afectando? Los casos testigos no están duplicados, y tanto los id de inscripción y subcomision están correctos.
Y otro dato: si inscribo a alguien fuera de término, y lo inscribo hasta el nivel de la subcomisión, luego si se le puede dar de baja.
Con esta información nueva: ¿qué no estará tomando?

Gracias por la información @jhdiaz

¿que te devuelven las siguientes queries?

SELECT nro_transaccion, tipo FROM sga_insc_cursada WHERE inscripcion = 387105;
SELECT COUNT(*) AS cant_subcomisiones
FROM sga_subcomisiones
WHERE comision IN (SELECT comision FROM sga_insc_cursada WHERE nro_transaccion = (SELECT nro_transaccion FROM sga_insc_cursada WHERE inscripcion = 387105));

Si cant_subcomisiones devuelve mayor a 0 y tipo = 'I', entonces no deberías tener ese error, ya que primero borra en sga_insc_subcomision:

DELETE FROM sga_insc_subcomision WHERE inscripcion = pInscripcion;

Y luego en sga_insc_cursada:

DELETE FROM sga_insc_cursada WHERE inscripcion = pInscripcion;

Saludos.