Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Funcion para saber si un registro .dbf esta bloqueado ( en red no me funciona ) (https://www.clubdelphi.com/foros/showthread.php?t=36081)

Wonni 02-10-2006 10:32:47

Funcion para saber si un registro .dbf esta bloqueado ( en red no me funciona )
 
Hola

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

Código Delphi [-]
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:

Código Delphi [-]
{
  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...
Código Delphi [-]
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 !!


La franja horaria es GMT +2. Ahora son las 17:58:03.

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