La Web del Programador: Comunidad de Programadores
 
    Pregunta:  44094 - COMPACTAR BASE DE DATOS ACCESS CON DELPHI
Autor:  Cristóbal
Hola a todos
Soy principiante en programación en delphi y se me presento un problema.
Tengo una base de datos Access 97, hay tablas de esta BD que tiene campos autonumericos por lo que siempre se van incrementando cuando se insertan nuevos registros, el problema es que necesito compactar mi base de datos de manera que el indice vuelva a su orden inicial, esto es si hay un registro que el indice diga 1 y no diga el numero de indice que tenia antes. Por ejemplo. si tenia 100 registros (entonces el ultimo indice es 100) si los elimino necesito que el indice vuelva a uno.

He leido varios articulos pero todos eran enfocados a paradox y dbase.

Me despido Atte y dando gracias de antemano

  Respuesta:  Octavio Herrera Flores
// Compilado en Delphi 7 com Access 2000
// agrega en USES comobj,variants

function GetEngine(var DbEngine: Variant): Boolean;
begin
Result := False;
try
DbEngine := CreateOleObject('Dao.DbEngine.35'); // Para Access'97
except
try
DbEngine := CreateOleObject('Dao.DbEngine.36'); // Para Access 2000
except
ShowMessage('No es posible inicializar el DAO.'#13 +
'Microsoft DAO debe de estar instalado en este equipo.'#13 +
'Para instalarlo, debes saber que forma parte de '+
'MS Access, Visual Basic, MS Office, etc.');
Exit;
end;
end;
Result := VarType(DbEngine) = VarDispatch;
end;

function CompactDataBaseDao(DbAccessName: String): Boolean;
var
DbEngine: Variant;
TmpFile: String;
begin
Result := False;
if Dir = '' then Exit;

TmpFile := Dir + 'TmpAccess.Mdb';
if Pos( '.MDB', UpperCase(DbAccessName)) = 0 then
DbAccessName := DbAccessName + '.MDB';

if not FileExists(DbAccessName) then Exit;

try
if not GetEngine(DbEngine) then Exit;
if FileExists(TmpFile) then
DeleteFile(TmpFile);
// Antes de compactar la Base de Datos, ésta se repara.

DbEngine.CompactDataBase(DbAccessName, TmpFile);
DeleteFile(DbAccessName);
RenameFile(TmpFile, DbAccessName);
// En caso de caida del sistema aquí, tendremos la base compactada en TmpFile.
Result := True;
except
Exit;
end;
end;

// llama esta funcion asi: CompactDataBaseDao('datos.mdb');

  Respuesta:  Octavio Herrera
Si te sirvio?

  Respuesta:  Javier Navarro
Que tal Cristobal, mira, en SQL Server primero debes eliminar todos los registros, después en diseño de la tabla le debes especificar que el valor de inicio sea 1 y ahora si cuando ingreses un registro va a empezar nuevamente en 1, como te digo esto si se puede en SQL, necesitarías checar en Access, la otra opción sería que crearas una tabla pero ya no especifiques el campo como autonumerico, solo como entero, y tu ve incrementando el índice con un valor que lo tienes guardado en otra tabla donde tomas ese valor y le incrementas 1 y lo guardas p.e.

TablaProductos TablaFolio
folio descrip folio
1 Plato 4
2 Cuchara
3 Lápiz

Para el próximo artículo entras a la TablaFolio, tomas el no. 4 y lo agregas a la TablaProductos con el nuevo artículo y en la TablaFolio le incrementas 1. Si quieres iniciar la tabla eliminas los registros de TablaProductos e inicializas en 1 en TablaFolio. Espero te sirva.