Actas de regularidad

Hola,

soy de la U.N.S.L., en una de nuestras facultades nos surgió el siguiente problema con algunas actas de regularidad:

cuando termina el primer cuatrimestre 2009 se procedió a cerrar las actas de promoción y regularidad, primero se cerró la de promoción, todo ok hasta allí, cuando procedemos a cerrar la de regularidad nos arroja el error:

error base de datos (-240)
could not delete a row

Si alguién nos puede guiar con este problema se lo agradeceremos muchísimo.

Juan E. Gomez

Hola
Ustedes están en versión 2.6.0, no?
personalizaron algo en el circuito de actas de cursado y/o de promoción?
saludos
Guillermo

Hola:

No tendrán algun problema de permisos sobre la tabla sga_curs_pendiente?

Emilio

Sí, estamos en la versión 2.06.0. No hemos personalizado nada de la parte de cursadas. Lo raro es que solo en algunas actas falla, el resto de las actas de regularidad las cierra sin problemas.

Podrás encontrar algun patrón común entre esas actas que fallan?
Cuando se cierra un acta de regularidad se insertan los registros en sga_det_acta_curs y se borran de sga_curs_pendientes.

Emilio

Hola,
ejecuté sp_cerrar_actareg() desde el dbaccess y arrojó el error 240 y 172.
coloqué un trace en sp_cerrar_actareg() y arrojó lo siguiente en las últimas líneas:

/**********************************************/
procedure spi_det_acta_curs returned no data

end for each row actions

after actions:

end after actions
expression:(and (= v_registra_cursada, “S”), (in v_resultado, “A”, “R”))
evaluates to 0
select cursor iteration.
end cursor
expression:
(select acta
from sga_actas_promo
where (and (and (and (= unidad_academica, p_unidad_academica), (= comision, v_comision)), (= tipo, “R”)), (= estado, “A”)))
evaluates to NULL. ;
let v_acta = NULL.
expression:(> (dbinfo-sqlca.sqlerrd2 ), 0)
evaluates to 0

delete from sga_curs_pendiente
where (and (= unidad_academica, p_unidad_academica), (= comision, v_comision));

before actions:

end before actions
exception : looking for handler
SQL error = -240 ISAM error = -172 error string = = “”
exception : handler FOUND
raise exception :-240, -172, “”
exception : looking for handler
SQL error = -240 ISAM error = -172 error string = = “”
exception : no appropriate handler
/****************************************************************************/

Luego miré el online.log y arrojó lo siguiente:

13:07:57 Checkpoint Completed: duration was 0 seconds.
13:18:02 Checkpoint Completed: duration was 0 seconds.
13:21:53 Assert Failed: Rowid 0x1316 not found for delete in partnum 30005f, key 6
13:21:53 Informix Dynamic Server Version 7.30.UC7
13:21:53 Who: Session(119710, dba@krusty, 21903, 0)
Thread(120525, sqlexec, 0, 3)
File: rsnode.c Line: 2196
13:21:53 Results: Delete failed
13:21:53 Action: Run ‘oncheck -cI fices_piloto:“”.# 164_4324’
13:21:56 See Also: /extra/informix.tmp/af.d6cd1fb1
13:23:03 Checkpoint Completed: duration was 0 seconds.

Juan

Hola:

corristes el oncheck que dice?
‘oncheck -cI fices_piloto:“”.# 164_4324’

el error -172


ISAM error: Unexpected internal error.

You encountered an unanticipated internal event. Consult the online.log to see if the diagnostics preserved any additional information regarding this event. If the error recurs, refer to your Administrator’s Guide to acquire additional diagnostics. Contact Informix Technical Support with the diagnostic information.

Seguaramente tenes un problema de indices en la tabla sga_curs_pendiente. Indices relacionados con alguna Foreign Key.
Corre el comando oncheck que menciona Emilio.
sino el oncheck sobre todos los indices de la tabla:

oncheck -cI fices_piloto:sga_curs_pendiente

Saludos!

Hola,
he estado haciendo unas pruebas con lo que me sugirieron del comando onchek, me arroja que un idice -->’ is bad’, luego intento cerrar el acta nuevamente y me arroja el error :

268: Unique constraint (dba.pk_det_acta_curs) violated.
100: ISAM error: duplicate value for a record with unique key.

me puse a revisar los registros de esas actas y no violan el constraint de clave primaria. La verdad que no se me ocurre que puede estar sucediendo.

Hola:

Lo que pasa que al momento de cierre te pasa los datos de sga_curs_pendiente a sga_det_acta_curs.
Por ahi tenes algo que está en las dos y te salta en el cierre.

Emilio

Hola,
he realizado las siguientes operaciones y esta es la salida de las mismas:

informix@krusty:~$ oncheck -cI fices_piloto:sga_det_acta_curs

Validating indexes for fices_piloto:dba.sga_det_acta_curs…
Index 555_2761
Index in_detaccu_fecha
Index 555_4644
Index 555_4645
Index 555_4646
Index 555_4647

informix@krusty:~$ oncheck -cI fices_piloto:sga_curs_pendiente

Validating indexes for fices_piloto:dba.sga_curs_pendiente…
Index 164_358
Index in_curpen_fecha
Index 164_4330
Index 164_4331
Index 164_4332
Index 164_4333
ERROR: No data row exists for btree item.
Rowid 0x207 contains key value:
Key: “5”:“8”:“04/04”:“1”:
Btree item contains rowid 0x817, key value:
Key: “5”:“9”:“01/05”:“1”:
Index 164_4334

Index 164_4333 is bad. OK to repair it? OK

informix@krusty:~$

Luego desde ‘dbaccess’ ejecuto el procedure sp_cerrar_actareg() y arroja lo siguiente:

268: Unique constraint (dba.pk_det_acta_curs) violated.
100: ISAM error: duplicate value for a record with unique key.

Este problema surge an algunas actas de cursado, para el resto de las actas el cierre funciona correctamente.

Observando la tabla sga_curs_pendientes veo los siguientes índices:

Index name Owner Type Cluster Columns

164_358 dba unique No unidad_academica
carrera
legajo
comision

in_curpen_fecha dba dupls No fecha_regularidad

164_4330 dba dupls No cond_regularidad

164_4331 dba dupls No unidad_academica
acta_regular

164_4332 dba dupls No comision

164_4333 dba dupls No unidad_academica
carrera
plan
version

164_4334 dba dupls No unidad_academica
carrera
legajo

Fijate de borrar y volver a crear la FK fk_cur_pen_version que es la que creó ese indice que da error.

Tenes el código en el catálogo de la base de datos: \BD\SQL\FK\fk_cur_pen_version.sql

El código es el siguiente:

ALTER TABLE sga_curs_pendiente DROP CONSTRAINT fk_cur_pen_version;

ALTER TABLE sga_curs_pendiente
ADD CONSTRAINT FOREIGN KEY (UNIDAD_ACADEMICA, CARRERA, PLAN, VERSION)
REFERENCES sga_versiones_plan
CONSTRAINT fk_cur_pen_version;

Intenté lo que me sugeriste Alejandro, pero sigue arrojando el mismo error. Que otra cosa te parece que pueda probar.

Juan

Juan, que es lo que sigue dando error?

  1. El checkeo de ese indice?

  2. Cerrar el acta de regularidad?
    Si es este punto. fijate si ya existen datos en el detalle del acta de regulares:
    select * from sga_det_acta_curs where unidad_academica = xxxx and acta = yyyy;

Tambien si hay legajos de alumnos duplicados en la tabla temporal de actas de cursadas
select c.unidad_academica, c.carrera, c.legajo
from sga_curs_pendiente as c, sga_actas_cursado
where c.comision = sga_actas_cursado.comision
and sga_actas_cursado.unidad_academica = XXXX
and sga_actas_cursado.acta = YYYY
order by 1, 2, 3;

  1. El checkeo de ese indice?
    Sigue dando error en el índice cuando ejecuto sp_cerrar_actareg().

  2. Cerrar el acta de regularidad?
    Si es este punto. fijate si ya existen datos en el detalle del acta de regulares:
    select * from sga_det_acta_curs where unidad_academica = xxxx and acta = yyyy;
    //esta consulta no devuelve ningun registro

Tambien si hay legajos de alumnos duplicados en la tabla temporal de actas de cursadas
select c.unidad_academica, c.carrera, c.legajo
from sga_curs_pendiente as c, sga_actas_cursado
where c.comision = sga_actas_cursado.comision
and sga_actas_cursado.unidad_academica = XXXX
and sga_actas_cursado.acta = YYYY
order by 1, 2, 3;
// esta consulta me devuelve 8 registros.

Juan, mientras no se arregle ese indice en la tabla sga_curs_pendiente, veo que el error te va a seguir dando al intentar cerrar el acta de regularidad.

  1. Los 8 registros que te devuelve la consulta, pudiste verificar si tenes legajos duplicados?

  2. Podes hacer un debug en el procedure sp_cerrar_actacurs() y enviar el resultado del mismo.

Saludos!

Alejandro,allí en el punto 2) te paso la salida de la parte final del TRACE:

  1. Los 8 registros que te devuelve la consulta, pudiste verificar si tenes legajos duplicados?
    No hay registros duplicados.
  2. Podes hacer un debug en el procedure sp_cerrar_actacurs() y enviar el resultado del mismo.

[b]/* Salida del trace en el procedure sp_cerrar_actacurs()*/
trace on

expression:( sp_fe_fin_vig_reg, v_comision, v_fecha_regular)
evaluates to 05/20/2012 ;
let v_fin_vig_regul = 05/20/2012
expression:(null v_fin_vig_regul)
evaluates to 0

insert into sga_det_acta_curs(unidad_academica, carrera, legajo, acta, folio, renglon, fecha_regularidad, cond_regularidad, resultado, nota, plan, version, pct_asistencia, fin_vigencia_regul, rectificado)
values (p_unidad_academica, v_carrera, v_legajo, p_acta, folio_aux, renglon_aux, v_fecha_regular, v_cond_regularidad, v_resultado, v_nota, v_plan, v_version, v_pct_asistencia, v_fin_vig_regul, “N”);

before actions:

end before actions

for each row actions:
execute procedure dba.spi_det_acta_curs ( n_unidad_academica = 5 , n_carrera = 8 , n_legajo = 5022806 , n_acta = 102 , n_folio = 1 , n_renglon = 8 , n_fecha_regularida = 08/20/2009 , n_fin_vigencia_reg = 05/20/2012 , n_cond_regularidad = 4 , n_resultado = A , n_nota = NULL. , n_pct_asistencia = 80.0000000000000000 , n_plan = 04/04 , n_version = 1 , n_rectificado = N , n_estado = A )

insert into log_det_acta_curs(unidad_academica, carrera, legajo, acta, folio, renglon, fecha_regularidad, fin_vigencia_regul, cond_regularidad, resultado, nota, pct_asistencia, plan, version, rectificado, estado, usuario, fecha_act, oper)
values (n_unidad_academica, n_carrera, n_legajo, n_acta, n_folio, n_renglon, n_fecha_regularida, n_fin_vigencia_reg, n_cond_regularidad, n_resultado, n_nota, n_pct_asistencia, n_plan, n_version, n_rectificado, n_estado, , current year to second, “I”);
procedure spi_det_acta_curs returned no data

end for each row actions

after actions:

end after actions
expression:(and (= v_registra_cursada, “S”), (in v_resultado, “A”, “R”))
evaluates to 0
select cursor iteration.
end cursor
expression:
(select acta
from sga_actas_promo
where (and (and (and (= unidad_academica, p_unidad_academica), (= comision, v_comision)), (= tipo, “R”)), (= estado, “A”)))
evaluates to NULL. ;
let v_acta = NULL.
expression:(> (dbinfo-sqlca.sqlerrd2 ), 0)
evaluates to 0

delete from sga_curs_pendiente
where (and (= unidad_academica, p_unidad_academica), (= comision, v_comision));

before actions:

end before actions
exception : looking for handler
SQL error = -240 ISAM error = -172 error string = = “”
exception : handler FOUND
raise exception :-240, -172, “”
exception : looking for handler
SQL error = -240 ISAM error = -172 error string = = “”
exception : no appropriate handler
[/b]

Por lo que parece se insertan todos los registros en sga_det_acta_curs, pero cuando el procedure al final quiere borrar los registros que estan en sga_curs_pendiente se producen los errores.

Hice una prueba comentando en el procedure la porción de codigo que realiza el delete en sga_curs_pendiente, y el acta se logra cerrar, pero queda sucia la tabla sga_curs_pendiente, entonces cuando quiero borrar esos registros correspondientes al acta que se cerró no me permite borrarlos.

Entonces como bien decis, el problema sigue estando en la tabla sga_curs_pendiente. y es seguramente un problema con ese indice que te daba error el oncheck.
No es error de registros duplicados en el Acta (sga_det_acta_curs).

Probaste borrar la Fk fk_cur_pen_version (ALTER TABLE sga_curs_pendiente DROP CONSTRAINT fk_cur_pen_version;) y por las dudas, aunque este comando debe borrarte el indice asociado, que es el
164_4333, y luego cerrar el acta?.

Los registros en esa tabla una vez cerrado el Acta de Cursados deben borrarse, por eso esta ese delete al finalizar el proceso de cerrado del acta.

Podes probar de crear la tabla sga_curs_pendiente en con el nombre sga_curs_pendient2, pasar todos los registros (insert into sga_curs_pendient2 select * from sga_curs_pendiente) y luego crearle a esta nueva tabla esa misma fk y ver si da error. Si no lo da, creo lo mejor (como última instancia) sera exportar los datos, borrar y volver a crear la tabla, sus Fk e importar los datos.