Error Clave duplicada 2.9.2 inscripcion a Carreras

Hola Tengo el siguiente problema al inscribir a carreras con nro de inscripción en automático y sin personalizar.
Cuando en una pc intentan registrar una inscripción a carreras y esta devuelve error el sistema completa con el nro de inscripcion la casilla, pero no la registra en el sistema. Si en ese momento en otra pc registran una inscripción sin errores esta toma ese nro de inscripción.
Por lo tanto al corregir el error en la primera pc e intentar registrar le tira el error “clave duplicada”.
Hay alguna forma de actualizar el nro de inscripcion en la primera pc sin tener que cerrar sin grabar y volver a cargar todo de nuevo ?
Gracias
Felix

Felix, es raro que eso ocurra (al menos en los objetos originales del SIU) porque cuando se graba por primera vez una inscripcion, si se detecta que la generación del nro de inscripción esta en automático (definido en un parametro del sistema), lo que se hace es llamar al procedure sp_nro_inscripcion, este procedure si miras el código lo que hace es insertar un registro en la tabla inscripcion. Esta tabla tiene un campo que es de tipo serial (autonumérico) que es el dato que se usa para generar el nuevo número de inscripcion a carreras, el cual una vez que se genera no puede volver generarse ni tampoco se pierde porque los datos de los campos serial no son transaccionables, es decir que una vez que se genera un dato no puede revertirse es cambio por mas que se haga rollback en la transaccion.

Es decir, si ocurre lo siguiente segun el caso explicado:

  1. Usuario A ingresa una nueva inscripcion a carrera, graba, se recupera el nro de inscripcion 150, se setea ese dato, se sigue validando y grabando los siguientes datos censales pero supongamos que existe un error, se muestra el error al usuario y ese nro de inscripcion 150 ya quedo registrado en esa inscripción (el usuario lo ve en la pantalla)

  2. Usuario B ingresa una nueva inscripcion, al grabar se recuperará el siguiente nro serial de ese campo en la tabla inscripcion, que va a ser el 151 y debería setear este valor. Supongamos que grabo bien.

  3. Usuario A arregla el error (por ejemplo completa datos que le faltaba ingresar), vuelve a grabar la inscripcion a carrera. En este caso ya tenia seteado el valor 150 el cual no deberia dar error porque el Usuario B y otros que pudieran haber dado de alta una inscripcion en entre el momento 1 y 3 usaron los siguientes nros de inscripcion en forma correlativa.


Verifica lo siguiente:
El user object uo_nro_inscripcion (que se encuentra en la libreria siu_gmat.pbl) en la funcion uof_procesos() esta llamando al procedure sp_nro_inscripcion?
Si la respuesta es SI: ¿Podras fijarte si tienen personalizado el procedure sp_nro_inscripcion?
Si la respuesta es NO, significa que estan generando el nro de inscripcion de otra forma (fue personalizado)

Hola Alejandro
Tenes razon revisando el procedure que genera el nro de inscripcion lo hace de la siguiente manera

SELECT max(nro_inscripcion::int) +1 as Numero INTO vcNumero
FROM sga_personas
WHERE sga_personas.nro_inscripcion not matches ‘FECO*’;

Lo que no se es porque quedo de esa forma, no usa la tabla inscripcion.

Atte
Felix

Es lo que suponia… que tomaba el maximo. Seguramente eso lo hicieron asi para no perder numeros correlativos ante un problema en la grabacion, ya que como te comente una vez que se usa un número serial si por algun motivo no se llegó a grabar la inscripcion, ese numero se pierde.

Bueno, no hay problema. Tendras que personalizar lo siguiente:
Libreria: siu_gmat.pbl
Objeto: uo_tp_datos_persona
Evento: ue_completar_claves
Donde dice

If is_accion = ‘A’ Then

// Carga Manual del nro de Insc.
If is_generacion_nro = 'M' THEN
	is_nro_inscripcion  = dw_1.GetItemString(dw_1.GetRow(),"nro_inscripcion")
	If IsNull(is_nro_inscripcion)  OR TRIM(is_nro_inscripcion) = "" Then   
		guo_app.msg.uof_SetErrorDbCli(-391,'Nro de Inscripción')
		dw_1.SetColumn("nro_inscripcion")
		Return False
	End If
// Generacion Automatica del nro de Insc.
Else
	/* Genera el Nro de Inscripcion */
[b]	 If IsNull(dw_1.GetItemString(dw_1.GetRow(),"nro_inscripcion")) Then[/b]      --> COMENTAR ESTA LINEA 
		obj = Create Using "uo_nro_inscripcion"
		If IsValid(obj) Then
			param[1] = is_parametros[1] //Unidad Academica
			is_nro_inscripcion = obj.function dynamic uof_proceso(param[])
                  .......

End if


Comentar la linea del IF donde evalua si el nro de inscripcion es nulo, y si no esta aun registrado va y lo recupera. Al comentarlo siempre que pase por alli lo va a generar nuevamente (siempre en el Alta)
Creo que con eso alcanzaría