Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 19
Wonni Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 02-10-2006
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 21
Nelet Va por buen camino
Pos se me ocurre que podrias probar con las excepciones.
__________________
_____________________________________
And follow me to where the real fun is
Responder Con Cita
  #3  
Antiguo 05-10-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 19
Wonni Va por buen camino
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 !
Responder Con Cita
  #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
Poder: 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
  #5  
Antiguo 06-10-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 19
Wonni Va por buen camino
Muchisimas gracias Roman

Funciona en red perfectamente.

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


Saludos !
Responder Con Cita
  #6  
Antiguo 06-10-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
Post

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...
Responder Con Cita
  #7  
Antiguo 06-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 06-10-2006
Avatar de Wonni
Wonni Wonni is offline
Miembro
 
Registrado: abr 2006
Posts: 261
Poder: 19
Wonni Va por buen camino
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 !!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Registro bloqueado? Jonnathan Conexión con bases de datos 3 21-03-2008 00:41:28
funcion para saber los dias que hay entre dos fechas estebanx Varios 5 19-04-2006 23:01:51
Como Saber Si Una Tabla Esta Bloqueado En Modo Escritura RMHTECTH Tablas planas 1 18-10-2004 19:13:00
Saber si un registro está bloqueado en el servidor Muten Firebird e Interbase 1 14-10-2003 14:50:55
Saber Registro Bloqueado Con Ado FernanGil Conexión con bases de datos 1 19-09-2003 17:48:15


La franja horaria es GMT +2. Ahora son las 22:01:39.


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
Copyright 1996-2007 Club Delphi