Hola Tenemos un problema en Gestion cuando dos usuarios Tevez y Osvaldo no se entienden y dan la misma matricula a dos alumnos obviamente el sistema no registra el segundo legajo pero modifica sga_carrera aspira y en situacion aspira cambia “AC” por “IC” . Por lo tanto el segundo alumno queda sin matricula pero tampoco el sistema le deja cargar otra matricula.
¿La generación de legajo es manual (Parametro generacion_nro_legajo_alumno = M) ?
¿Con que número de legajo quedò el 2do alumno?
Lo que podes hacer es dar de baja ese alumno y luego volver a generarle el legajo.
Operacion: Matricula > Actualizaciones > Baja de un alumno (mat00010)
Asegurate de que el perìodo de inscripciòn a carreras aun este vigente, esto hará que la inscripción a carrera quede en estado Aceptada, con la situaciòn AC-Aspirante a Carreras. Si el período de inscripción a carreras no esta vigente lo que sucede es que se rechaza la inscripción a carrera.
Situaciòn aspirante:
AC = Aspirante a carrera (aun no tiene legajo)
IC = Alumno Condicional (falta cumplir requisitos obligatorios para tener legajo definitivo)
IL = Alumno con legajo generado
Hola Alejandro :
Si esta en Manual la generacion de Matricula
El asunto es que al primer alumno si le Registra la Matricula. Al segundo no le registra por lo tanto no queda como alumno y lo logico seria que permita cargarle otra matricula pero no se puede porque en el segundo cambia ese atributo en carrera aspira el sistema. Como que la modificacion de carrera aspira esta fuera de la transaction y lo hace antes de saber si se registro o no la Matricula.
Felix, porque decis que queda fuera de la transaccion?
En la ventana w_generar_legajo_alumno, la generacion del legajo se hace dentro del evento ue_confirmar (aca se llama al proceso sp_crear_alumno) que es parte del evento ue_grabar que aqui se maneja la transacciòn. Si hubiere algun problema con algun alumno entonces se vuelve atras los cambios realizados para ese alumno.
Alejandro
Viendo el procedimiento que pusiste tengo esto :
ELSE
-- Ejecutar el Sp. para saber si cumplió con todos los requisitos obligatorios para la generación de legajo.
EXECUTE PROCEDURE sp_cumplio_req_leg(aunidad_academica,anro_inscripcion,acarrera,l_periodo_insc) INTO ll_result,ll_result2,ls_mensaje_result;
-- Controlar que haya cumplido con todos los requisitos obligatorios para la generación de legajo y
-- que hayan sido presentados en fecha.
IF ll_result = 1 OR ll_result = -3 THEN
--*************************************************************************
-- Generar un registro en la tabla sga_alumnos.
--*************************************************************************
-- Crea un Registro en la Tabla de Alumnos.
INSERT INTO sga_alumnos (
unidad_academica,
carrera,
legajo,
plan,
nro_inscripcion,
fecha_ingreso,
fin_vigencia_plan,
regular,
cnt_readmisiones,
calidad,
sede )
VALUES(aunidad_academica,
acarrera,
leg,
l_plan,
anro_inscripcion,
dFechaIngreso,
l_fin_vig,
'S',
0,
'A',
l_sede);
-- Ahora el alumno posee legajo generado y con registro en sga_alumnos.
LET ls_yatieneLeg = 'S';
-- Ejecutar el Sp. para saber si cumplió con todos los requisitos obligatorios.
EXECUTE PROCEDURE sp_cumplio_req(aunidad_academica,anro_inscripcion,acarrera,l_periodo_insc) INTO ll_result,ll_result2,ls_mensaje_result;
IF ll_result = 1 THEN
-- Se pasa la situación de aspirante a 'IL'(Ingresante con Legajo).
UPDATE sga_carrera_aspira
SET situacion_asp = v_retorno_situasp
WHERE unidad_academica = aunidad_academica
AND carrera = aCarrera
AND nro_inscripcion = anro_inscripcion
AND periodo_inscripcio = l_periodo_insc;
ELSE
-- Se pasa la situación de aspirante a 'IC'(Ingresante Condicional).
UPDATE sga_carrera_aspira
SET situacion_asp = 'IC'
WHERE unidad_academica = aunidad_academica
AND carrera = aCarrera
AND nro_inscripcion = anro_inscripcion
AND periodo_inscripcio = l_periodo_insc;
END IF;
Segun entiendo inserta en sga_alumnos pero nunca pregunta si se inserto bien solo sigue. Lo unico que puede ser es que tenga un procedure desactualizado
Si el insert falla, entonces la ejecucion del procedure se detiene y sale con una excepcion (por el on exception), y desde power donde se llamo a este procedure se checkea si hubo un fallo y en tal caso vuelve atras la transacción (Objeto: uo_legajo_alumno, funcion: uof_proceso())
Hola Alejandro estuve viendo el tema de legajo repetido y es mas complejo de lo que pense. El sistema dice que el legajo fue generado nunca tira error.
El procedure tambien no tira error. Pero no registra el alumno en sga_alumnos sin embargo cambia el estado en sga_carrera_aspira como si estuviera todo ok.
Adjunto el tracer del Procedure porque no entiendo que pasa.
Felix
El debug del procedure sp_crear_alumno no da error, retorna: 9399 , 0 , 0 , Generado
Por lo que veo dice que el legajo 9399 ya existia con anterioridad, es decir el registro en la tabla sga_alumnos…
Segun lo que dice el debug en la linea 35 cuando se verifica si el alumno ya existe en la tabla de alumnos (carrera = CPN, legajo = 9399), como ya existe con anterioridad entonces luego se hace un update de ese registro cambiando el dato ‘regular’ y ‘calidad’.
El plan vigente de la carrera CPN es el 2001.
Se verifica si tiene los requisitos y estan cumplidos y parece que si los tiene cumplidos. Como tiene todos los requisitos para poder generar legajo cumplidos, entonces lo que hace es cambiar la situacion del aspirante en sga_carrera_aspira a la condicion IL = “Inscripto con Legajo”. (linea 263 del debug)
Luego cambia los valores de regular y calidad en sga_alumnos (linea 300 del debug)
Despues vienen unas validaciones si el plan que tiene registrado en sga_alumnos es el plan vigente de la carrera, como es el mismo no hace nada.
Al finalizar esta el manejo del tema del usuario de autogestion (aca_usuarios_ag y aca_tipos_usuar_ag) y finaliza correctamente la ejecucion del procedure.
Estos serian los datos de ese alumno:
unidad_academica = ECO
nro_inscripcion = 14497
carrera = CPN
legajo = 9399
Podes consultar si existe el registro en la tabla de alumnos:
SELECT * FROM sga_alumnos WHERE unidad_academica = 'ECO' AND carrera = 'CPN' AND legajo = '9399';
Podes consultar las inscripciones en la carrera CPN para ese alumno:
SELECT * FROM sga_carrera_aspira WHERE unidad_academica = 'ECO' AND carrera = 'CPN' AND nro_inscripcion = '14497';
Hola Alejandro : Exacto eso es lo que pasa le puse un Legajo que ya existe. Y ese es el problema que tenemos modifica carrera aspira pero en sga_alumnos debe actualizar al que ya existe en la base. Por lo que carrera_aspira queda modificado y este nro de inscripcion no lo crea en sga_alumno.
Consulta No deberia el procedimiento verificar si el nro de inscripcion es distinto al que ya existe y el legajo es el mismo regresar un error de lagajo repetido ?
Felix
Hay algo que no entiendo, cuando digo que el legajo existe, es que la persona en esa carrera existe, esto es la combinación de: unidad_academica + carrera + legajo + nro_inscripcion. (unidad_academica + carrera + legajo = alumno / unidad_academica + nro_inscripcion = persona)
Por favor detallame cual es el caso exacto que estas probando, decime los datos de los dos alumnos, en que periodos deinscripcion a carreras estan registrados, con que estado estan esas inscripciones, que datos tiene en sga_alumnos…
Lo que entiendo es que en esta parte que verifica si el legajo ya existe le falta el nro de inscripcion
– Si ya posee legajo el alumno, cambio la variable para identifique al alumno con legajo previo.
IF (SELECT COUNT(legajo)
FROM sga_alumnos
WHERE unidad_academica = aunidad_academica
AND carrera = acarrera
AND legajo = alegajo) > 0 THEN
LET ls_yatieneLeg = 'S';
END IF;
Supongo que aqui tengo que poner algo que si el legajo existe y le nro de inscripcion es diferene disparar un error
Ahora entiendo cual es el caso. Se da cuando el nro de legajo se asigna manualmente y existe otro alumno en la misma carrera con el mismo nro de legajo, que al detectar que existe ese legajo en esa carrera considera que se trata del alumno que se esta dando de alta pero en realidad es otro alumno, con lo cual cambia los datos del alumno en la inscripcion a carrera porque alli si accede por el nro de inscripción pero no lo da de alta en la tabla de alumnos y sale sin error.
Te pido perdon ya que en tu 2do mensaje estaba clara tu descripciòn el caso, se ve que entendi otra cosa y luego no llegaba a entender que estaba sucediendo. (eso pasa porque era Tevez y Osvaldo, si hubiera sido Mora y Alario tal vez se resolvia mas rápido! )
A ver, reemplaza el código siguiente en el procedure sp_crear_alumno:
-- Si ya posee legajo el alumno, cambio la variable para identifique al alumno con legajo previo.
IF (SELECT COUNT(legajo)
FROM sga_alumnos
WHERE unidad_academica = aunidad_academica
AND carrera = acarrera
AND legajo = alegajo) > 0 THEN
-- Es la misma persona
LET ls_yatieneLeg = 'S';
END IF;
por:
-- Si ya posee legajo el alumno, cambio la variable para identifique al alumno con legajo previo.
IF (SELECT COUNT(legajo)
FROM sga_alumnos
WHERE unidad_academica = aunidad_academica
AND carrera = acarrera
AND legajo = alegajo) > 0 THEN
-- Verifico si se trata de la misma persona consultando su nro de inscripción en la carrera
IF (SELECT COUNT(*)
FROM sga_alumnos
WHERE unidad_academica = aunidad_academica
AND carrera = acarrera
AND legajo = alegajo
AND nro_inscripcion = anro_inscripcion) > 0 THEN
-- Es la misma persona y ya tiene legajo en la carrera (de una inscripción anterior)
LET ls_yatieneLeg = 'S';
ELSE
-- Se trata de otra persona con el mismo nro de legajo en la misma carrera. Salgo con error.
RETURN NULL,-1,0,'Existe otro alumno con el mismo nro de legajo "' || alegajo || '" en la carrera "' || acarrera || '". Asigne otro nro de legajo.' ;
END IF;
END IF;
Perfecto ahi me parece que ya me va evitar el problema que tenia cada tanto. Muy buena la solución
Muchisimas Gracias
Felix
pd. con el otro ejemplo no creo que lo habríamos solucionado durante el año sino solo en el verano