Error en ifx2pg

Buen día, estamos tratando de migrar una UA de G2 a G3 y en el paso indicado nos genera el siguiente error

2023/09/19 08:52:42 - Crea FK en PG - ERROR: insert or update on table "sga_detalle_acta" violates foreign key constraint "fk_det_acta_acta"
  Detail: Key (unidad_academica, tipo_acta, acta)=(CSNAT, N, 4841824) is not present in table "sga_actas_examen".

Lo raro es que verificamos la información en G2 y la misma está correcta, o sea el acta de examen 4841824 si se encuentra en la tabla cabecera (sga_actas_examen)

Qué puede estar pasando que no migra ese dato?

Saludos

Buen día, alguna idea sobre este tema? o algo que nos pueda guiar en dónde se estaría produciendo el error?

Muchas gracias!

Hola Javier, buen dia.
El error se da al pasar los datos de la tabla sga_detalle_acta de G2 (informix) a G3 (postgres). Puede ser que alguno de los campos tenga blancos a izquierda o derecha. Esto en algunas versiones de informix detectamos que las fk no fallan, pero si en postgres porque detecta que no son el mismo dato.

Por lo que comentas, el acta existe en la tabla de actas de examen en G2.
¿Que devuelve cada una de estas consultas en la base de informix?

select len(acta) from sga_actas_examen where unidad_academica = 'CSNAT' and tipo_acta = 'N' and acta = '4841824';
select len(acta) from sga_detalle_acta where unidad_academica = 'CSNAT' and tipo_acta = 'N' and acta = '4841824';

Proba esto en G3, si las dos consulta devuelven datos o solo la 2da:


set search_path = mig;
select * from sga_actas_examen where unidad_academica = 'CSNAT' and tipo_acta = 'N' and acta = '4841824';  
select * from sga_actas_examen where trim(unidad_academica) = 'CSNAT' and tipo_acta = 'N' and trim(acta) = '4841824';

Alejandro, buen día, gracias por tu respuesta. Paso los datos solicitados

Resultado de consulta en IFX (Ídem las dos consultas)


7

Resultado de consulta en Postgres (Ídem las dos consultas)


No devuelve registro

Saludos

Entonces no se llegaron a migrar datos de la tabla sga_actas_examen en el esquema mig?
¿Hay datos en esta tabla?
Si se pasaron las actas, cuantos registros hay en la base de G2 y cuantos en G3? ¿Solo falta ese acta?

Si hay datos, te paso la info:

IFX

select count(*) from sga_actas_examen 
71497

Postgres


select count(*) from mig.sga_actas_examen
44200

No sabemos el porque de la diferencia, qué criterios toma la migración para tener esa diferencia¿?

Ningun criterio, se pasan los datos de todas las tablas salvo algunas que no como las de logs y otras que no son utilizadas en la migración a G3. Pero de las que se pasan se deberían pasar todos los registros de cada tabla.
¿Sucedió lo mismo con las tablas de actas de cursadas o promociones (sga_actas_cursado, sga_actas_promo) ?

Te paso los registros de las otras tablas:

IFX


select count(*) from sga_actas_cursado
3989
select count(*) from sga_actas_promo
924

Postgres


select count(*) from mig.sga_actas_cursado
3989
select count(*) from mig.sga_actas_promo
924

¿Y la tablas sga_mesas_examen y sga_llamados_mesa?

Te paso:
IFX


select count(*) from sga_mesas_examen
40229
select count(*) from sga_llamados_mesa
40229

Postgres


select count(*) from mig.sga_mesas_examen
40229
select count(*) from mig.sga_llamados_mesa
40229

No entiendo porque no pasaron tantas actas, casi la mitad faltan.

¿Podes volver a intentar hacer el pasaje de informix a postgres? Ver si queda registro de algun error al pasar datos de la tabla sga_actas_examen.
Tambien fijate si podes correr el comando oncheck -c sga_actas_examen sobre la tabla sga_actas_examen en la base de informix. Verificar que no haya ningun problema en el table space que haga que solo recupere algunos registros y no todos.

Alejandro, paso a comentarte, levantamos nuevamente la base y al pasar las tablas (Pasar Datos Tabla) pudimos ver en el log varios Warnings. Paramos el procedimiento y entre los Warnings destacamos 2. El primero en el cual dice que hay registros en sga_deatlle_acta que NO tienen ACTA en el registro (hay 4 registros). Luego están los demás registros que indican lo siguiente:

Error inserting/updating row
Table output.0 - ERROR: current transaction is aborted, commands ignored until end of transaction block
Table output.0 - WARNING: Couldn’t insert row into table: [CSNAT], [N], [93262], [ARQ98], [37456618 ], [31], [1], [R], [N], [2011/08/18 00:00:00.000], [R], [3], [null], [null], [null], [1998], [1], [‘S’], [N], [A]

Hicimos un INSERT en mig.sga_detalle acta y lo hizo sin problemas.

Ejemplo


INSERT INTO mig.sga_detalle_acta
(unidad_academica, tipo_acta, acta, carrera, legajo, folio, renglon, tipo_inscripcion, equiv_parcial, fecha_de_examen, resultado, nota, resultado_2, nota_2, vigencia, plan, "version", controlado, rectificado, estado)
VALUES('CSNAT', 'N', '93262', 'ARQ98', '37456618   ', 31, 1, 'R', 'N', '2011/08/18 00:00:00.000', 'R', '3', null, null, null, '1998', '1', 'S', 'N', 'A');

Entendemos que existe un error en esos 4 registros que NO tienen ACTAS, pero en los otros no tenemos idea. ¿Qué puede pasar?
Adjunto extracto de log de Penthajo.
Saludos


log_error.rar (1.58 KB)

Buen día, alguna pista de porqué puede estar pasando esto?

Por lo que veo, en este caso el problema esta en el número de legajo, fijate que tiene 3 blancos a derecha:
'37456618 ’
Seguramente ese legajo en al tabla de alumnos (sga_alumnos) no tiene esos blancos a derecha. Podes revisar si existe el legajo sin los blancos a izq:
SELECT * FROM sga_alumnos WHERE unidad_academica =
‘CSNAT’ and carrera = ‘ARQ98’ and legajo = ‘37456618’

Este era un problema conocido, por eso en el pasaje de ifx a pg, se hace un trim() en todos los campos varchar
Fue lo que te consulte en el otro mensaje pero respecto del nro de acta.

Pueden correr en la base de informix lo siguiente:
SELECT * FROM sga_detalle_acta WHERE legajo <> trim(legajo);

Si recupera ese acta y alumno (u otros casos), corran lo siguiente:
UPDATE sga_detalle_acta SET legajo = trim(legajo) WHERE legajo <> trim(legajo);

Quizas con la cabecera de las actas pase lo mismo, que sea un problema con algun campo varchar, tal vez el dato de mesa de examen

Otra prueba que podes hacer para ver si pasa todas las actas de la tabla sga_actas_examen es comentar en el archivo script_2.sql lo siguiente:
– return ‘ALTER TABLE mig.’ || vc_tabname with resume;
– return ’ ADD CONSTRAINT ’ || vc_fkname || ’ FOREIGN KEY (’ || vc_string_campos || ‘)’ with resume;
– return ’ REFERENCES mig.’ || vc_ptabname || ’ DEFERRABLE;’ with resume;
– return ‘’ with resume;

Que en la creacion del esquema mig, no cree las FK. Proba comentar eso y fijate si pasa todos los registros de sga_actas_examen

Alejandro esta consulta

Da cero (0) como resultado. Si pensamos que el problema podía venir por ahí pero no. Ahora probare el tema de las FK y te comento el resultado.
Saludos

Borre el schema mig, comenté las líneas que me dijiste y corrí nuevamente el script …

2023/10/02 12:12:33 - Table input.0 - linenr 50000
2023/10/02 12:12:33 - Table output.0 - WARNING: Couldn’t insert row into table: [CSNAT], [N], , [LIC00], [37456156], [53], [1], [R], [N], [2015/03/13 00:00:00.000], [A], [10], [null], [null], [null], [2000], [1], [S], [N], [A]
2023/10/02 12:12:33 - Table output.0 -
2023/10/02 12:12:33 - Table output.0 - Error inserting/updating row
2023/10/02 12:12:33 - Table output.0 - ERROR: null value in column “acta” of relation “sga_detalle_acta” violates not-null constraint
Detail: Failing row contains (CSNAT, N, null, LIC00, 37456156, 53, 1, R, N, 2015-03-13, A, 10, null, null, null, 2000, 1, S, N, A).
2023/10/02 12:12:33 - Table output.0 - WARNING: Couldn’t insert row into table: [CSNAT], [N], [97744], [LIC00], [37456156], [46], [1], [R], [N], [2015/08/14 00:00:00.000], [A], [7], [null], [null], [null], [2000], [1], [S], [N], [A]

La verdad no comprendo dónde se encuentra la falla. Qué otra cosa podríamos ver?
Muchas gracias

Pareciera que hay un acta con el nro de acta el string vacio, fijate qeu pasa NULL cuando lo quiere insertar en postgres:
Corre estas consultas en informix y fijate si devuelve esas actas:
SELECT * FROM sga_actas_detalle WHERE TRIM(NVL(acta,‘’)) = ‘’;
SELECT * FROM sga_actas_examen WHERE TRIM(NVL(acta,‘’)) = ‘’;

SELECT * FROM sga_mesas_examen WHERE TRIM(NVL(mesa_examen,‘’)) = ‘’;

Alejandro, probé también el tema de de las FK y nuevamente me lleva 44.200 registros cuando en IFX hay 71.497. El tema de estas consultas:

SELECT * FROM sga_actas_detalle WHERE TRIM(NVL(acta,‘’)) = ‘’;
SELECT * FROM sga_actas_examen WHERE TRIM(NVL(acta,‘’)) = ‘’;
SELECT * FROM sga_mesas_examen WHERE TRIM(NVL(mesa_examen,‘’)) = ‘’;

Me devuelven los 4 registros que tienen detalle pero no tienen cabecera. Lo que me preocupa es la diferencia antes mencionada.

Se te ocurre alguna otra cosa?

Si ocurre esto:
" Me devuelven los 4 registros que tienen detalle pero no tienen cabecera. Lo que me preocupa es la diferencia antes mencionada."
Significa que no tienen creada la fk a la tabla sga_actas_examen.

No se me ocurre porque no se migran todos esos registros. Es la primera vez que reportan este caso.
¿De esas actas que no se migran, tienen alumnos (registros en sga_actas_detalle) ?
¿Podes ver esas actas en Guarani 2 desde el sistema?

¿Cambiaron la estructura de la tabla sga_actas_examen? ¿Cambiaron el tipo de dato de alguna columna, agregaron alguna columna con algun nuevo tipo de dato?