La Web del Programador: Comunidad de Programadores
 
    Pregunta:  1439 - ELIMINACION DE REGISTROS POR SQL
Autor:  Jorge Cortés
Tengo unas tablas Paradox locales, una vez que estas tablas
tienen informacion y procedo a borrarle algunos registros
por medio de un TQuery con un DELETE de SQL:

QryDepurador.RequestLive:=True;

QryDepurador.Close
QryDepurador.SQL.Clear;
QryDepurador.SQL.Add(´DELETE FROM historial´);
QryDepurador.SQL.Add(´WHERE bitacora=1´)
QryDepurador.ExecSQL;

Efectivamente los registros son borrados pero el tama&o de
la tabla no decrementa en absoluto, esto es:
si el tama&o consta de 56K y una vez borrados estos registros,
la tabla queda con 56K. Esto lo hace cuando la tabla esta
indexada y no lo esta, ambos casos dan el mismo resultado.

A que se puede deber, esto ?

De hecho realize una prueba haciendo un ciclo:

QryDepurador.Close
QryDepurador.SQL.Clear;
QryDepurador.SQL.Add(´SELECT * FROM historial´);
QryDepurador.SQL.Add(´WHERE bitacora=1´)
QryDepurador.Open;
While not QryDepurador.Eof do
QryDepurador.Delete;

Pero igual la tabla original queda inflada !

* Igual le coloque el "Pack Table" al momento de estructurarla
pero igual.


De antemano Gracias.

  Respuesta:  Diego Jose Muñoz Carbajo
En dBase los registros borrados solamente se marcan como borrados, no se elimina espacio en disco
En Paradox, los registros borrados se pierden, pero no se recupera el espacio en disco.
Para recuperarlo, con el Database Desktop, utiliza la opcion ´Reestructure table´ y marca ´Pack table´, asi funciona. Este proceso debe realizarse por tanto de vez en cuando.
Para hacerlo desde codigo, hay que llamar al Api del bde, concretamente a DbiDoReestructure pero este tema ya es mas complicado (busca informacion sobre el api del bde y como
utilizar DbiDoReestructure, es sencillo)