Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Bloqueo de registros (https://www.clubdelphi.com/foros/showthread.php?t=87841)

lbidi 05-03-2015 16:01:04

Bloqueo de registros
 
Estimados, tengo la siguiente duda y consulta sobre como bloquear un registro directamente sobre la tabla la cual tiene un solo registro y un solo campo por lo que no le veo el sentido de hacerlo por sql.

Mi primer intento fue hacer algo similar a esto.

Código Delphi [-]
    try
        Tbl_Examenes.Edit;
        Tbl_Examenes.FieldByName('Valor').AsString := edt_Hallado.Text;
    finally
        Tbl_Examenes.Post;

Ahora por lo que yo entiendo y es poco, con estas lineas el sistema intentara bloquear el registro con la propiedad Edit , asignar el valor y finalmente grabar el mismo haciendo el Post.
Pero que pasa si el registro se esta intentando modificar en otra estacion de trabajo ? Asumo que no va a poder hacer el edit, ( y como no tengo excepciones , generara un error , correcto ?? ).
Todavia no manejo bien el tema de los try, except, finalyy. etc. etc..

Como puedo modificar este codigo para que de alguna manera entre en loop hasta que pueda modificarlo.
Yo SE que no se debe hacer ( por los factores que todos conocemos ), pero es fundamental para mi sistema que pueda hacerse, o sea que siga intentando grabar el registro hasta que se logre.

Gracias mil.

Saludos.

AgustinOrtu 05-03-2015 18:40:15

Pero eso depende de que BD estes usando y de como tengas configuradas las transacciones

Hay RDBMS que implementan bloqueo por tabla, por fila, por registro, etc

Luego esta el modo en el que trabajan las transacciones. Sobre todo la propiedad IsolationLevel (Aislamiento)

Tampoco llego a ver porque seria necesario implementar todo eso, aparentemente por el codigo que expones ahi mismo en un mismo metodo haces el edit y el post. Es decir que demoraria unos cuantos milisegundos. Luego si llegan varias peticiones es trabajo de gestor de la bd el como procesarlas (es probable que en el otro cliente te tire el error de que el ultimo valor de la fila que conocias fue modificado y debas hacer un refresh o requery)

Luego tenes la opcin de usar ClientDataSet y mandar a aplicar los deltas,y que se encarge de hacer el trabajo sucio la bd

Si lo que queres realmente es bloquear hasta que se escribe, podes poner un boton1 y en su evento poner en edicion al DataSet (.Edit) y luego tener otro boton2 para hacer el .Post. Si le dan al .edit, hasta que no hagan .post o bien un .cancel con otro boton, la tabla esta en edicion

con respecto al try..finally, se intenta ejecutar lo que esta en el bloque del try, si hay una excepcion salta directamente al except y ejecuta lo del finally; ademas, el bloque del finally se ejecuta SIEMPRE. Es decir en tu caso, si no puede poner la tabla en modo de edicion y eso genera una excepcion, entonces ejecuta el .post

Casimiro Notevi 05-03-2015 18:48:29

Imprescindible: La cara oculta de Delphi.

Neftali [Germán.Estévez] 06-03-2015 10:47:46

Siempre puedes "meter" ese código dentro de un bucle para que lo reintente 2 o 3 veces, con un lapso de tiempo entre medio.
Me parece algo muy extraño y no veo que esta sea la manera de resolverlo. Es decir, creo que el problema puede estar en otro sitio.


La franja horaria es GMT +2. Ahora son las 10:45:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi