Error clave duplicada: Agregar personas

Buenas, tenemos una situación cuando queremos cargar una nueva persona al sistema (desde la aplicación de Gestión 3.15.0) y nos imposibilita guardar la operación debido a que existe un registro duplicado. Recurrimos a buscar este registro, filtrando por el número de DNI, pero en la consulta no nos arroja resultados.
Es algo medio raro, ya que lo lógico sería que aparezca el registro existente que lanzó el error por clave duplicada.

Este es el detalle del error:


SQLSTATE: db_23505

CODIGO: 7

MENSAJE: SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "iu_mdp_personas_usuario"\nDETAIL: Key (usuario)=(30811309) already exists.

SQL: INSERT INTO mdp_personas ( apellido, nombres, sexo, fecha_nacimiento, localidad_nacimiento, nacionalidad, fecha_ingreso_pais, pais_origen, usuario, clave, fecha_vencimiento_clave, autenticacion, bloqueado, parametro_a, apellido_elegido, nombres_elegido, recibe_mensajes_x_mail, pertenece_pueblo_originario, pueblo_originario, pueblo_originario_otro, token, email_valido, id_imagen, email_temporal, tipo_usuario_inicial ) \n VALUES ("Acosta", "María Beatriz", "F", "1983-12-22", DEFAULT, "1", DEFAULT, DEFAULT, "30811309", DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT); -- toba_log: 238500

Si tendríamos que corregirlo por base de datos, necesitaríamos que nos pasen un ejemplo o nos digan en qué tablas asociadas (además de mdp_personas y mdp_personas_documentos) se deben borrar los registros manualmente para volver a realizar la operación desde el principio.

Muchas gracias

Hola Ariel,

Lo que tienen es una persona con el identificado de usuario ‘30811309’. Esto no implica necesariamente que el DNI de la persona (en ‘mdp_personas_documentos’) sea ese, porque puede haber cambiado después de crearla. Esta consulta devuelve un registro?

SELECT * FROM mdp_personas WHERE usuario = '30811309';

Saludos, Florencia.

Hola Florencia, así es, devuelve un registro. Cómo me sugieren proceder ?

Hola Ariel,

Con la consulta SQL que te pasé podés saber el nombre y apellido de la persona que tiene asigando el identificador de usuario ‘30811309’. Ingresá con un usuario administrador a la operación “MATRÍCULA » PERSONAS » ADMINISTRAR PERSONAS”, buscá y seleccioná la persona en cuestión, ingresá a la sección “Acceso al sistema” y corregí el valor del campo “Usuario”. Lo ideal sería que lo completes con su número de documento (que evidentemente no es ‘30811309’), podés buscarlo en la sección “Datos principales”, “Documentos”.

Saludos, Florencia.

Buenas, sigo con el tema: el problema es que no me filtra la persona que estoy buscando, tanto por el apellido como por el DNI.
En la base de datos veo que existe el registro, entonces mi pregunta es: o hay un tipo de filtro en la aplicación que me omite el registro que estoy buscando o bien, dado que surgió un error al momento de la carga, pudo haber quedado “sucia” alguna tabla con datos de la persona que me impiden agregarlo normalmente.
Trato de ser lo más claro posible, se entiende mi planteo ?

Hola Ariel,

Puede que no veas a la persona en el listado de la pantalla inicial de la operación “Matrícula » Personas » Administrar Personas” porque el usuario con el que estás logueado tiene perfil de datos asignado. Verificalo por favor.

Saludos, Florencia.

Hola Florencia, acabo de revisar mi perfil y no tengo datos asignados a mi perfil. Podés revisar la imágen adjunta.
En qué influye que tenga un perfil de datos asignados o no?

Acá adjunto la imágen


perfil_admin_gestion.png

perfil_admin_gestion.png

Ariel,

Ok, entonces deberías verla. Adjuntá el resultado de ejecutar la consulta SQL:

SELECT * FROM mdp_personas WHERE usuario = '30811309';

Saludos, Florencia.

Te adjunto el resultado de la consulta.
Es el registro completo pegado en una hoja de cálculo (open calc de Open Office)
Avisame si tenes problemas para abrir el archivo


resultado_consulta_usuario_30811309.zip (6.78 KB)

Hola Ariel:

Por favor, después de filtrar la persona por apellido y nombre, recuperen el log de la aplicación generado y busquen lo siguiente:


f_limpiar_acentos

Esa linea, es parte de la query que recupera las personas que se muestran en la operación administrar personas, pueden ejecutar la query completa en el pgadmin y modificarla, para detectar cual es el motivo por la cual no te trae a esa persona.

Quedamos atentos
Saludos

Hola Sergio, en que parte tendría que buscar el log?. No entendí muy bien. Qué es lo que tengo que ver?

No podemos avanzar más rápido con una consulta para borrar los registros donde: usuario = ‘<N_Usuario>’. Que serían los registros que me tiran error de clave duplicada porque el usuario ya existe en otro registro que no podemos ver.

Hola Ariel

El log lo encuentran en <path proyecto Guaraní>/instalacion/i__desarrollo>/p__guarani/logs/,.

Si, se puede avanzar más rápido con la siguiente query


UPDATE negocio.mdp_personas
   SET usuario = <id de usuario nuevo>  
 WHERE usuario = '30811309' ;

Igualmente recomendamos verificar la query en los logs, para ver por qué, no se esta recuperando esa persona.

Seguimos en contacto
Saludos

Muchas gracias por tu respuesta.
Lo vamos a ver y les comentamos como lo solucionamos.
Saludos!

Solucionado!!

Al agregar una persona, el dato de usuario se graba con su DNI. Pero al cambiar el DNI de ésta misma persona por “x” razón, el valor de usuario no se modifica y acá es dónde teníamos el conflicto.

Esta query nos ayudó a ver el error claramente al comparar los campos: “usuario” y “nro_documento” (obviamente distintos):

SELECT 		mdp_personas.persona,
							mdp_personas.apellido,
							COALESCE(mdp_personas.apellido_elegido, mdp_personas.apellido) as apellido_elegido,
 	 	                    COALESCE(mdp_personas.nombres_elegido, mdp_personas.nombres) as nombres_elegido,
        					mdp_personas.nombres,
        					mdp_personas.sexo as sexo_id,
        					mdp_personas_sexo.descripcion as sexo_valor,
        					mdp_personas.fecha_nacimiento,
				        	mdp_personas.localidad_nacimiento as localidad_id,
				        	mug_localidades.nombre as localidad_valor, 
				        	mdp_personas.nacionalidad as nacionalidad_id,
				        	mdp_nacionalidades.descripcion as nacionalidad_valor,
				        	mdp_personas.fecha_ingreso_pais,
				        	mdp_personas.usuario,
				        	mdp_personas_documentos.nro_documento,
				        	mdp_tipo_documento.desc_abreviada as tipo_documento,
				        	mdp_personas.apellido || ', ' || mdp_personas.nombres as nombre_completo,
        					mdp_tipo_documento.desc_abreviada || ' ' || mdp_personas_documentos.nro_documento as documento,
        					to_char(mdp_personas.fecha_nacimiento,'DD/MM/YYYY') as fecha_nacimiento_formato_visual,
        					to_char(mdp_personas.fecha_nacimiento,'DD/MM/YYYY')  || ' - ' || mug_localidades.nombre_abreviado || ', ' || mug_provincias.nombre || ', ' || mug_paises.nombre	as fecha_lugar_nacimiento,
        					mdp_personas_documentos.tipo_documento as tipo_doc,
        					mdp_personas_documentos.pais_documento as pais_doc,
        					mdp_personas_extranjeros.tipo_visa,
        					mdp_personas_extranjeros.vencimiento_visa,
        					sga_docentes.legajo
				FROM 		mdp_personas
							LEFT JOIN mdp_personas_documentos ON mdp_personas.documento_principal = mdp_personas_documentos.documento
							LEFT JOIN mdp_tipo_documento ON mdp_personas_documentos.tipo_documento = mdp_tipo_documento.tipo_documento
							LEFT JOIN mug_localidades ON mdp_personas.localidad_nacimiento = mug_localidades.localidad						
							LEFT JOIN mug_dptos_partidos ON mug_localidades.dpto_partido = mug_dptos_partidos.dpto_partido
							LEFT JOIN mug_provincias ON mug_dptos_partidos.provincia = mug_provincias.provincia
							LEFT JOIN mug_paises ON mug_provincias.pais = mug_paises.pais
							LEFT JOIN mdp_personas_extranjeros ON mdp_personas.persona = mdp_personas_extranjeros.persona
							LEFT JOIN sga_docentes ON mdp_personas.persona = sga_docentes.persona,
					 		mdp_personas_sexo, 
					 		mdp_nacionalidades
				WHERE  		mdp_personas.sexo = mdp_personas_sexo.sexo AND
					   		mdp_personas.nacionalidad = mdp_nacionalidades.nacionalidad
					   		 AND 		f_limpiar_acentos(usuario::varchar) ILIKE '%9999999%' 
				ORDER BY	mdp_personas.apellido,
							mdp_personas.nombres
				;

En el filtro “WHERE” de esta consulta se deben editar los datos a su requerimiento.

Los cambios se pueden realizar desde la aplicación tranquilamente, filtrando la persona y cambiando sus datos para que coincidan su DNI y USUARIO del sistema.

Saludos!