Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como bloquear un registro!!! (https://www.clubdelphi.com/foros/showthread.php?t=24225)

CarlosHernandez 12-08-2005 00:53:40

Como bloquear un registro!!!
 
Hola amigos del foro...

vuelvo otra vez. estoy realizando busquedas por medio de SELECT * FROM Ibquery... y me muestra todo en edit y hasta con foto, pero necesito que por jemplo en mi tabla de empleado cuando localice un nombre(un registro) se me bloquee para los demas usuarios, utilizo Ibquerys, IBdataset, las transaccion esta en Read Commint...

utilizo delphi 6 y firebir 1.0...

si nececitan mas datos me avisan por favor...

apicito 12-08-2005 08:13:42

El bloqueo explicito de registros solo existe a partir de firebird 1.5, De todas formas te comento mi experiencia: En toda mi aplicación solo lo utilizo una vez en una de las pantallas de ABM y ya me dio problemas en dos instalaciones. Se queda marcado como bloqueado y la única forma de debloquearlo es desinstalando firebird y volviendo a instalarlo. No sé si esto pasa por algo que yo hago mal o es un problema de firebird.
Un saludo.

Rufus 12-08-2005 12:59:04

Cita:

Empezado por CarlosHernandez
si nececitan mas datos me avisan por favor...

Pues sí, me gustaría saber si el bloqueo que quieres es de escritura (que los demás no puedan modificar el registro) o de lectura (que los demás no puedan leer el registro).

Aún así te digo:

En el caso de bloqueo de lectura, con el uso de la opción WITH LOCK, ya apicito comentó los problemas que pueden surgir.

Si es un bloqueo de escritura lanza un update falso sobre el registro, es decir actualizas un campo a su mismo valor, así ya queda marcado como modificado y, con los debidos parámetros de las transacciones, no es modificable por otros registros hasta que cierres su transacción.

CarlosHernandez 12-08-2005 14:17:56

Ejemplo...
 
Cita:

Empezado por Rufus
Si es un bloqueo de escritura lanza un update falso sobre el registro, es decir actualizas un campo a su mismo valor, así ya queda marcado como modificado y, con los debidos parámetros de las transacciones, no es modificable por otros registros hasta que cierres su transacción.

si es un bloqueo de escritura. y como podria hacer lo que me dices por favor me puedes dar un ejemplo....

sera realizando un campo de bloqueado y que lo lea antes de mostrar algo y se este modificando cada vez que se llame.... o algo asi .... no se lo estoy inventado...

ah por cierto nunca he trabajado con parametros en las transaccioness....
ejem por favorrrrrr......
gracias.

kalimero 12-08-2005 14:40:40

Hola
Yo trabajo con los componentes de acceso a Firebird FibPlus y el ploqueo de registro se hace:

<delphi>
if MiDataset.LockRecord(false) = lsSuccess then
begin
RegistroBloqueado:=true;
end;
</delphi>
Saludos

CarlosHernandez 12-08-2005 15:27:20

Cita:

Empezado por kalimero

<delphi>
if MiDataset.LockRecord(false) = lsSuccess then
begin
RegistroBloqueado:=true;
end;
</delphi>
Saludos

Kalimero ya lo intente pero no lo reconoce me falta declarar algo en el unit???? :confused: y RegistroBloqueado??? :confused:

agradecido............

Rufus 12-08-2005 15:27:59

Ejemplo general (luego tu lo adaptas):

-- Tengo un IBQUERY donde lanzo la consulta (SELECT * FROM TABLA WHERE...)
-- Pongo un IBSQL por ahí, para tareas auxiliares, que lo voy a usar para el update ficticio.
-- Cuando sucede el evento donde quieres que a partir de ahí se bloquee el registro, pones el codigo siguiente. Por ejemplo si tengo un BDGRID y al hacer doble click en una fila se abre la "ficha" del cliente para verlo. Puedo poner el codigo en el doble click de la fila o en el formshow del formulario que se abre, por ejemplo.
--Pongo el codigo:
Código:

IBSql1.SQL.Text := "UPDATE TABLA SET CAMPO1 = CAMPO1 WHERE ID=" + IBQuery1.FieldByName('ID').ASINTEGER;
 IBSql1.ExecQuery;

--Cuando el usuario termine de "ver" el registro, habrá que hacer un commit de la transacción para liberar el registro.

CarlosHernandez 12-08-2005 16:49:50

Si me da...
 
Gracias rufu por la respuesta, pero otra cosita mas, como hago para identificar que el registro esta siendo utilizado por alguien mas y que le indique al segundo usuario(el que abre de segundo el mismo registro), y no hay manera de cambiar el mensaje de "dead lock no wait" no se uno hecho por mi que diga usuario no puede ser modificado o algo parecido.... osea identificar si la transaccion del otro equipo esta activa....


La franja horaria es GMT +2. Ahora son las 11:20:30.

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