Ver Mensaje Individual
  #4  
Antiguo 05-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita