PDA

Ver la Versión Completa : Error DBIF_RSQL_SQL_ERROR. SAP RH.


educun
02/09/10, 10:35:48
Hola a todos,
tengo un problema con el acceso a una tabla.
Lanzamos un programa, que on-line funciona y para pocos empleados en fondo tambien, pero cuando lo lanzamos para muchos empleado, nos da este dump.
Errores tiempo ejec. DBIF_RSQL_SQL_ERROR
Excepción CX_SY_OPEN_SQL_DB

Notas para corregir errores
Database error text........: "[1205] Transaction (Process ID 239) was
deadlocked on lock resources with another process and has been chosen as the
deadlock victim. Rerun the transaction."
Internal call code.........: "[RSQL/DELE//IECI/HR_FM_TD07 ]"
Please check the entries in the system log (Transaction SM21).

Detalle del codigo.
DELETE FROM /ieci/hr_fm_td07
WHERE ejercicio = pnpbegda(4) AND
version = p_versi AND
pernr = pnppernr-low.


A ver si me podeis ayudar, que estoy un poco estancado.

Muchas gracias.
Enrique.

ballan
02/09/10, 10:58:34
Lo que te esta diciendo es que estas intentando borrar un registro que esta bloqueado por otra transaccion

educun
02/09/10, 11:18:04
Teoricamente no se esta lanzando nada mas que los jobs de ese programa.
Y cada Job es de un empleado diferente, por lo que borra registros diferentes.

A no ser que este equivocado, entiendo que pueden acceder a la tabla varios procesos a la vez a borrar diferentes registros.
Por eso, no entiendo que se esten bloqueando registros.

Puede ser cosa de la declaración de la tabla. Es que no se que mirar.

Gracias.

ballan
02/09/10, 15:13:36
Pues aparentemente eso es lo que te esta diciendo el dump

Al ser procesos que corren en fondo es un poco complicado determinar quien lo bloquea pero se puede hacer

Voy a dar por supuesto que el programa es Z y lo puedes modificar, de no ser asi tendxriamos que buscar otra opcion

Antes del fragmento de codigo

Detalle del codigo.
DELETE FROM /ieci/hr_fm_td07
WHERE ejercicio = pnpbegda(4) AND
version = p_versi AND
pernr = pnppernr-low.

Tendrias que añadir un bucle como el siguiente

data: lv_exit.
do.
if not lv_exit is initial.
exit.
endif.
enddo.

Asi cuando lanzes el proceso se quedaba en un bucle infinito

Despues vas a la transaccion sm50 y te fijas en cual es el proceso correspondiente al programa que lanzaste (fijate en los procesos que tienen tu usuario) seleccionas el proceso y vas al menu
Programa/modo -> programa -> debugging

Te saltara el debugging justo en el bucle, si marcas la variable lv_exit con una 'X' o lo que sea saldras del bucle, situate justo antes del delete

ANTES de hacer el delete vete a la transaccion SM12y ahi te apareceran todos los bloqueos existentes en el sistema

Si ves que aparece un bloqueo para esa tabla podras ver algo mas de informacion adicional, a que hora se hizo, que usuario, etc y quiza pueda arrojarte algo de luz