Compactar tablas (Pack)  

Enviado Por: Q3 Team
Web : http://www.q3.nu
Email: dlib@q3.nu
Fecha: 10/07/99

Truco accedido 74 veces

 


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');