Progress - como saber en un for each que un registro esta bloqueado para avisar al usuario

 
Vista:

como saber en un for each que un registro esta bloqueado para avisar al usuario

Publicado por Marietta (56 intervenciones) el 25/06/2014 20:54:26
Hola.

Espero que alguien pueda ayudarme con esto o darme ideas.

Tengo un procedimiento de grabacion, llamado por una ventana (aca trabajamos distribuido), el problema que tengo es que en mi programa de grabacion se actualizan mediante for each todos los registros de una tabla que cumplan la condicion. El usuario al presionar boton de grabación, en la ventana, va al procedimeinto para grabar, y cuando el registro esta siendo usado por otro usuario, se cuelga, hasta que el otro usuario suelta el registro sigue con la grabacion. El problema es que el usuario que quiere grabar no tiene idea de que pasa, apretan teclas una y otra vez, botan el programa, y obviamente ahi en las tablas queda algo mal, ¿como le indico al usuario que el registro esta bloqueado por otro usuario?. La idea es salirme del procedimiento sin que haga nada, (ya que hay otras actualizaciones a otras tablas despues), y darle aviso al usuario que el registro esta siendo usado por otro usuario, si puedo indicar por cual mejor aun, e indicarle que intente mas tarde.

Esto lo hacemos con un locked en los find, sin ningun problema, pero hasta donde se, el locked no se puede usar con el for each.

Nota: el programa de grabacion, tiene un do transaction, pero como no es problema de transaccion segun mi entender no hace nada en este caso, el tema es el bloqueo.

De ante manos Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

como saber en un for each que un registro esta bloqueado para avisar al usuario

Publicado por Marco (5 intervenciones) el 28/06/2014 04:48:15
el for each lo tienes que hacer no-lock, y definir un buffer a la tabla, y en la busqueda de la tabla hacerlo con exclusive-lock no-wait; y usar la funcion LOCKED para lo que quieras.
Algo asi:

DEF BUFFER Btabla FOR tabla. /* tabla es tu tabla :p */

cicloL:
FOR EACH tabla NO-LOCK WHERE etc etc:

DO FOR Btabla:
FIND FIRST Btabla EXCLUSIVE-LOCK WHERE ROWID(Btabla) = ROWID(tabla) NO-WAIT NO-ERROR.
IF LOCKED btabla THEN DO:
/* tus mensajes, etc */
NEXT cicloL.
END.
/* tu codigo para actualizar */
END. /* DO FOR */

END. /* FOR EACH */
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

como saber en un for each que un registro esta bloqueado para avisar al usuario

Publicado por Maro (4 intervenciones) el 02/09/2014 11:58:28
Marietta al margen de la respuesta que te ha facilitado Marco, simplemente comentarte que cuando el registro esta bloqueado por un usuario, el mismo alert de progress te informará de cual es el userid del usuario que bloquea el registro.

htt://www.maroconsultores.es
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar