No sé si te habrás dado cuenta, pero cuando borras registros en una tabla, en realidad no desaparecen físicamente del fichero, sino que el BDE los marca como borrados.
Esto puede traer consecuencias fatales en determinadas aplicaciones en las que se borren muchos registros en una tabla.
Para hacer desaparecer dichos registros marcados para borrar necesitaremos compactar la tabla.
Aqui tienes un ejemplo de como se hace:
Incluye 'bde' en el uses de tu form
y utiliza esta funcion para compactarla:
procedure PackDBF(Tabla: TTable);
begin
Check(DbiPackTable(Tabla.DBHandle, Tabla.Handle, nil, szDBASE, True))
end;
|
Pero cuidado, para poder compactar la tabla, ésta debera estar abierta en modo exclusivo
Ejemplo:
{Cerramos la tabla/Close table}
Table1.Close;
{En Modo exclusivo/Exclusive mode}
Table1.Exclusive:=True;
{Abrimos tabla/Open table}
Table1.Open;
{Compactar/pack}
PackDBF(Table1);
{Reabrir tabla/reopen table}
Table1.Close;
Table1.Exclusive:=False;
Table1.Open;
|
Compactar tablas DBF con una función:
procedure PackDBF(Const ADatabase, ATable : String);
Begin
with TTable.Create(nil) do
try
DatabaseName := ADataBase;
TableName := ATable;
Exclusive := True;
Open;
Check(DbiPackTable(Database.Handle,Handle,'','',True));
finally
Free;
end;
End;
|
Ejemplo de llamada:
PackDBF('Alias','Table1');
|
Para tablas Paradox:
Procedure PackParadox(Const ADatabase, ATable : String);
var
ADB :TDataBase;
SaveKC : Boolean;
PdxStruct : CRTblDesc;
Begin
with TTable.Create(nil) do
try
DatabaseName := ADatabase;
TableName := ATable;
Exclusive := True;
Open;
ADB := DAtabase;
SaveKC := ADB.KeepConnection;
ADB.KeepConnection := True;
try
Close;
FillChar(PdxStruct,SizeOF(PdxStruct),0);
StrPCopy(PdxStruct.szTblName,ATable);
PdxStruct.bPack := True;
Check(DbiDoRestructure(ADB.Handle,1,
@PdxStruct,nil,nil,nil,False));
finally
ADB.KeepConnection := SaveKC;
end;
finally
Free;
end;
End;
|
Ejemplo de llamada:
PackParadox('Alias','Table1');
|
|