La Web del Programador: Comunidad de Programadores
 
    Pregunta:  27562 - ¿PORQUE AUMENTA DE MB UNA BD AL COMPACTARLA?
Autor:  Paco
Alguien me puede decir algun método efieciente para compactar y reparar una BD de Access 97 desde Visual Basic 5, ya lo he intentado con las instrucciones DBEngine.RepairDatabase "ruta" y DBEngine.CompactDatabase "ruta, pero ocurre que me la dejó con mas megas de los q tenia en principio, ¿como puede ser esto si al compactarla desde Access se fue a menos megas?
Un saludo y gracias.

  Respuesta:  Dante Cantone
Paco:
La sentencia "DBEngine.RepairDatabase " siempre te aumenta la db de un 10 a un 25 % de volumen, segùn los tipos de datos que contenga y cuàn indexada estè. Sucede que en vez de trabajar con un temporal en disco (como la mayorìa de las aplicaciones windows) lo hace sobre el mismo archivo, lo cual hace que aumente su volumen. Luego al ejecutar la sentencia "DBEngine.CompactDatabase " se reordena la DB en "OTRO" archivo sin copiar la info redundante...
Es decir... al realizar ABM sobre las tablas estas modificaciones se van guardando siempre "al final" con punteros que indican a que tabla, registro, indice, etc corresponde. informaciòn que desaparece al aplicar las ABM sobre los registros involucrados.

Sospecho que en la rutina de compactaciòn que utilizas hay un error y solo se ejecuta la de reparaciòn(y por eso aumenta de volumen, en vez de disminuir). Prueba (si es que lo tienes en el còdigo) quitando la sentencia
- On Error Resume Next
y ejecutando paso a paso....

Dim DB As Database
Dim RS As Recordset
Dim StrRuta As String '//Ruta de la DB
Dim StrDBCompactada As String '//ruta donde ubicar la DB compactada

'//Generamos un nombre, puede ser en cualquier Path
'//Puede ser tambien un UNC (por ejemplo : \\server\carpeta)
StrDBCompactada = App.Path & "\" & Format(Now, "hhmmss")

On Error Resume Next 'Siempre conviene

'//REPARAMOS
DBEngine.RepairDatabase StrRuta
'//Compactamos
DBEngine.CompactDatabase StrRuta, StrDBCompactada
If Err Then
'// Aviso de error //
Exit Sub
End If
'Y cambiamos la VIEJA DB por la NUEVA
Kill StrRuta
FileCopy StrDBCompactada, StrRuta

Perdona si he sido muy explìcito en mi explicaciòn, quizàs haya temas que ya los sabìas... cualquier duda que tengas mandame un mail...