Hola a todos.
Veo que el código tenía un error, al no poner el editor de post la barra invertida (la contraria al '/'). He sustituido esa parte del código por la función IncludeTrailingPathDelimiter y, por lo menos ayer
funcionaba el código; vamos, que reducía el tamaño del DBT.
Aquí va de nuevo:
Código:
uses BDE;
procedure PackTable(ATable: TTable);
var
TblDesc: CRTblDesc;
hDb: hDbiDb;
cTablePath: string;
begin
if not ATable.Active then
raise Exception.Create('La tabla debe estar abierta.');
hDb := nil;
try
// La tabla debe estar abierta para obtener su ruta física
SetLength(cTablePath, MAX_PATH);
DbiGetDirectory(ATable.DBHandle, True, PChar(cTablePath));
cTablePath := PChar(cTablePath);
// El editor de post se come la barra delimitadora del path.
//*** if (cTablePath <> '') and (cTablePath[Length(cTablePath)] <> '/') then
//*** cTablePath := cTablePath + '/';
//*** cTablePath := cTablePath + ATable.TableName;
cTablePath := IncludeTrailingPathDelimiter(cTablePath) + ATable.TableName;
// Poner la ruta en la estructura.
FillChar(TblDesc, SizeOf(CRTblDesc), 0);
with TblDesc do
begin
StrPCopy(szTblName, cTablePath);
bPack := True; // Esto indica que se debe compactar
end;
// Cerrar la tabla. DbiOpenDatabase la abrirá en modo esclusivo.
ATable.Active := False;
DbiOpenDatabase(nil, 'STANDARD', dbiReadWrite, dbiOpenExcl, nil,
0, nil, nil, hDb);
DbiSetDirectory(hDb, PChar(cTablePath));
DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False);
finally
DbiCloseDatabase(hDb);
end;
end;
Sal
U2