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)
-   -   EBDEngineError "Object not Locked" (https://www.clubdelphi.com/foros/showthread.php?t=74305)

jhonalone 10-06-2011 17:21:12

EBDEngineError "Object not Locked"
 
Hola compañeros.
Os agradecería que alguien me explicara de donde puede provenir este error, o dónde puedo informarme acerca de su significado y origen.
Estoy tratando de Reindexar una BD Paradox.

Código Delphi [-]
procedure Reindexar (Tabla : ttable);
begin
    Check (dbiregenindexes (tabla.Handle));
end;

Gracias de antemano.

ecfisa 10-06-2011 19:22:15

Hola jhonalone.

Lamento no poder aportarte mucho sobre Paradox, pero revisá si este enlace te sirve de ayuda: Reindexar en Paradox

Aquí tenes un listado completo de los códigos de error de BDE BDE Error Codes, aunque realmente no es muy explícito que digamos...

Saludos.

Chris 10-06-2011 19:26:58

Talvez debas abrir la tabla en modo exclusivo.

Bueno, así a cómo ecfisa, yo también tengo experiencia nula en Paradox.

Saludos,
Chris

jhonalone 10-06-2011 20:09:34

Gracias Ecfisa.
El enlace propone un problema casi idéntico al mío, pero quedó sin resolver...
El listado de errores del BDE me es muy útil para controlar excepciones.

Gracias Cris.
No he copiado todo el código, porque el error lo da justo en ésa sentencia. Pero te copio el código que la precede, donde abro la tabla en modo exclusivo.
Código Delphi [-]
        ...
        TTabla.Close;
        TTabla.DatabaseName := DirActual;
        TTabla.Exclusive := True;
        TTabla.TableName := ExtractFilename(lstFicheros.FileName);
        TTabla.Open;
        Reindexar (TTabla);
        ...
Al parecer esto ya es un problema antiguo. La solución que propone Cabanyaler en el link de Ecfisa podría ser una solución. Pero ¿cómo se hace el procedimiento que propone para generar los índices después de borrarlos?

Seguiré investigando. Si encuentro una solución válida la publicaré en este hilo para ayuda de otros.

Gracias amigos.

jhonalone 10-06-2011 21:58:51

Gracias, como siempre, por vuestra desinteresada ayuda.

He resuelto el problema, o por lo menos a mí me funciona. Estas son las conclusiones a las que he llegado. (Por si son de utilidad para alguien)

Algunas Condiciones para que funcione Reindexar:
1.- Las tablas master/detail deben estar cerradas (Salvo la que se Reindexa)
2.- Las tablas que compartan Dataset deben estar cerradas (Salvo la que se Reindexa)
3.- Usar Table1.DisableControls para que no interfieran los controles conectados

Así me quedó el código funcionando:
Código Delphi [-]
procedure Reindexar (Tabla : TTable);
begin
  Check (DbiRegenIndexes (Tabla.Handle));
end;
 
...
        TTabla.TableName := ExtractFilename(lstFicheros.FileName);
        TTabla.Close;
        TTabla.DatabaseName := DirActual;
        TTabla.Exclusive := True;
        TTabla.TableName := ExtractFilename(lstFicheros.FileName);
        TTabla.Open;
        TTabla.DisableControls; // que no actualice los controles conectados
        Reindexar (TTabla);
        TTabla.Close;  // Cerramos la tabla por si comparte un Dataet con la siguiente que reindexemos
...

Saludos.


La franja horaria es GMT +2. Ahora son las 12:13:19.

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