PDA

Ver la Versión Completa : Funcion para saber si un registro .dbf esta bloqueado ( en red no me funciona )


Wonni
02-10-2006, 10:32:47
Hola

He probado esto para saber si un registro esta bloqueado en una tabla .dbf :


Var
Blokeado:LongBool;
begin
With Table1 Do
Begin
UpdateCursorPos;
DbiIsRecordLocked(Handle, Blokeado);
If Blokeado Then
Begin
ShowMessage(' ATENCION !!!! El registro bloqueado');
End Else
Begin
ShowMessage('Registro NO bloqueado');
End;
End;
end;


y resulta que si en el mismpo pc abro varias instancias del programa y tengo un registro editando e intento editarlo en otra instancia del programa, funciona y me muestra mi mensaje. Pero, lo probe en red y me dice que no está bloqueado. Pero al intentar editarlo, entoces si me salta el error ( en ingles ) de que efectivamente esta siendo utilizado por otro usuario.

¿en red hay otra manera de hacerlo?

Gracias

Nelet
02-10-2006, 10:51:11
Pos se me ocurre que podrias probar con las excepciones.

Wonni
05-10-2006, 22:26:32
Gracias nelet

Pues si, tambien es verdad. Pero solo queria ver si alguien tenia info al respecto. Sobre porque la funcion no rula en red.

Saludos !

roman
05-10-2006, 23:20:45
Desempolvando mi cajón me he encontrado esta que alguna vez hice:


{
Comprueba si el registro actual de la tabla especificada está bloqueado

La rutina comienza llamando a dbiIsRecordLocked para ver si el registro
está bloqueado por la sesión actual.

De no ser así, llama a dbiGetRecord para intentar poner un bloqueo de
escritura en el registro. Si el registro ya estaba bloqueado, dbiGetRecord
devuelve un error con lo cual determinamos que el registro está bloqueado.
}
function IsRecordLocked(Table: TTable): Boolean;
var
Locked : BOOL;
hCur : hDBICur;
dbiRes : DBIResult;

begin
Table.UpdateCursorPos;

{ Ver si el registro está bloqueado por la sesión actual }
Check(dbiIsRecordLocked(Table.Handle, Locked));
Result := Locked;

{ Si no, ver si está bloqueado por alguna otra sesión }
if not Result then
begin
{ hCur <- copia del cursor al registro actual }
Check(dbiCloneCursor(Table.Handle, false, false, hCur));

try
{ Intentar abrir el registro con un bloqueo de escritura }
dbiRes := dbiGetRecord(hCur, dbiWRITELOCK, nil, nil);

if (dbiRes <> DBIERR_NONE) then
begin
{ Si se trata de un error de bloqueo, devolver TRUE }
if (HiByte(dbiRes) = ERRCAT_LOCKCONFLICT) then
Result := true
else
{ En caso contrario generar una excepción }
Check(dbiRes);
end
else
{ Si no hubo error, dbiGetRecord bloqueó el registro, así que debemos }
{ desbloquearlo }
Check(dbiRelRecordLock(hCur, False));
finally
{ Liberar la copia del cursor }
Check(dbiCloseCursor(hCur));
end;
end;
end;


// Saludos

Wonni
06-10-2006, 13:26:38
Muchisimas gracias Roman :)

Funciona en red perfectamente.

Y eso que solo has desempolvado el cajón, que si haces una limpieza a fondo :D ....


Saludos !

aladelta
06-10-2006, 15:35:46
Hola a todos;

como poniendo un granito de arena en esta montaña de cajones que tiene el amigo Roman, me permito añadir que yo para controlar en red si un registro esta bloqueado, es decir, que lo esta editando otro usuario...pues me voy al evento OnEditError del componente que controla la tabla en cuestión enviando la correspondiente ventana de error...

procedure Tdatamodulo1.latabla(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
//como da el error por estar bloqueado pues manda mensaje y abortas la
//edición de la tabla
mensaje('Acceso denegado','Esta bloqueado por otro usuario. ',0);
Action:=daAbort;
end;

logicamente esto se hace al poner en edición una tabla...a lo que tambien podrias controlar el tipo de error que se puede devolver con la variable 'E' del tipo EDatabaseError...

Un saludo y espero que valga para algo, aunque sea para apreder yo mas...:)

roman
06-10-2006, 17:46:54
Me parece que ésta es la opción que yo usaría en lugar de meterme a la api del bde como en la función que puse. La verdad no recuerdo porqué usé aquella en su tiempo. Quizá no existía en la versión de Delphi o quizá simplemente no la ví, pero el caso es que veo más prolijo usar el evento que propone aladelta.

// Saludos

Wonni
06-10-2006, 18:49:32
Pues la verdad, tambien creo que mejor lo que propone aladelta. En el evento OnEditError ademas, tambien meto una funcion que tengo para hacer un loging a un fichero de texto con el E.Message. Supongo que en red funcionará. Esque ahora estoy en mi casa y soto tengo un PC. Mañana en el trabajo lo probaré en red y os cuento.

Gracias :)

Saludos !!