Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Como bloquear registros sin usar campos persistentes (https://www.clubdelphi.com/foros/showthread.php?t=43242)

uper 05-05-2007 19:06:13

Como bloquear registros sin usar campos persistentes
 
saludos, no se como programar esto de los bloqueos con sql server 2000,
pues no manejo campos persistentes, y lo que prendo hacer es que si alguien quiere modificar un registro o dos usuarios estan en el mismo,
se bloque el registro, y mandarle un mensaje al otro usuario diciendole que esta ocupado el registro, se que el componente AdoQuery tiene algo tipo de bloqueo que por lo gral. es optimista.
explico como lo ve el usuario:

busca un regsitro ya sea por id o nonbre en el caso de la tabla de clientes, cuando le da el resultado, le da el boton de editar, pero simplemente lo que hago como programacion es pasar los datos a controles estandar (nada de campos persistentes), el usuario corrige los datos y guarda el registro con el boton de guardar en es momento, cierro la tabla y me guardo el ID para hacer una actualizacion con el update.

Como podria implementarse que al dar un click en el boton de modificar se bloque el registro y se desbloque al guardar y como lo mencione se pueden mandar mensajes a otro user que quiera intentar editar el mismo registro.

Les agradesco
gracias.

lucasarts_18 06-05-2007 20:29:29

Cita:

Empezado por uper
Como podria implementarse que al dar un click en el boton de modificar se bloque el registro y se desbloque al guardar y como lo mencione se pueden mandar mensajes a otro user que quiera intentar editar el mismo registro.

Les agradesco
gracias.

Hasta donde yo sé los bloqueos se manejan a través de transacciones, es decir, es la misma transacción la encargada de hacer el bloqueo del registro, puedes consultar la ayuda del SQL Server, seguro que algo sale allí.

Con respecto a lo del mensaje, no tengo la menor idea....:confused:


Hasta Luego .-

nuk3zito 11-07-2007 18:10:06

Pues debes iniciar una transacción cuando pretendan editar el registro.
Luego haces un update sencillo para que se bloquee, por ejemplo:
Código:

AdoConnection1.BeginTrans;
with AdoQuery1 do
begin
  SQL.Close;
  SQL.Clear;
  SQL.Add('update Clientes');
  SQL.Add('set Id_Cliente = Id_Cliente');
  SQL.Add('where Id_Cliente = ' + IntToStr(iCliente));
  ExecSQL;
end;

Con esto garantizas que se genera un bloqueo, y a los demás usuarios que intenten entrar a modificar este registro, les marcará el error de "tiempo de espera" mientras no hayas confirmado o cancelado la transacción.

Luego, al momento de guardar, haces tus updates yliberas el bloqueo (confirmando la transacción):
Código:

with AdoQuery1 do
begin
  SQL.Close;
  SQL.Clear;
  SQL.Add('update Clientes');
  SQL.Add('set Nombre = :Nombre,');
  ...
  SQL.Add('where Id_Cliente = ' + IntToStr(iCliente));
  ExecSQL;
end;

AdoConnection1.CommitTrans;

El inconveniente es que, si el usuario da click al botón de "modificar" y se va y se toma un café (o hay quienes duran 30 minutos cuando van al baño) el bloqueo estará ahí, esperando a que el usuario lo libere o alguien con acceso al SQL Server lo mate. Sin embargo, eso es lo que hay de bloqueos para SQL Server.


La franja horaria es GMT +2. Ahora son las 11:31:17.

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