Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Archivo .DBT Inmenso! (https://www.clubdelphi.com/foros/showthread.php?t=3868)

anitra_cattivo 22-09-2003 23:19:08

Archivo .DBT Inmenso!
 
Buenas.

Estoy haciendo un programa de control de asistencias.
Tengo varias tablas de uso local para calculos.
Una de las tablas de de Observaciones, donde el programa define algunos errores de marcacion del trabajador. "No marco ingreso, no marco salida, marcio doble vez ingreso, etc".

Estos comentarios que se generan a la hora de recibir la informacion del Reloj via archivo .TXT que nos entrega el reloj. Se registran en un campo Memo por cada Trabajador y luego los registros de esta tabla pueden ser eliminados.

Mi problema es que veo que cada vez que hago pruebas, el archivo Receptor_obs.DBT que supongo es donde estan los memos de Receptor_obs.DBF va creciendo y creciendo.

Por ejemplo, ahora los tamaños son los siguientes:

Receptor_obs.DBF 309K
Receptor_obs.DBT 590,621K

La forma que uso para limpiar las tablas es con un Delete del Query, luego pasado un tiempo, las compatare. Pero veo que el .DBT no se reduce :(

Que me recomiendan?.

Muchas Gracias.

Lmas 23-09-2003 01:13:11

Hola anitra_cattivo.

Creo que exite la función DbiPack..., pero mirando un programa donde compactaba tablas dBase, utilizaba este código que si que funcionaba:


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
    SetLength(cTablePath, MAX_PATH);
    DbiGetDirectory(ATable.DBHandle, True, PChar(cTablePath));
    cTablePath := PChar(cTablePath);
    if (cTablePath <> '') and (cTablePath[Length(cTablePath)] <> '\') then
      cTablePath := cTablePath + '\';
    cTablePath := cTablePath + ATable.TableName;
    FillChar(TblDesc, SizeOf(CRTblDesc), 0);
    with TblDesc do
    begin
      StrPCopy(szTblName, cTablePath);
      bPack := True;
    end;
    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;

SalU2.

marcoszorrilla 23-09-2003 08:24:33

Que yo recuerde los .DBT de Dbase no se redución mediante un Pack, no sé si el BDE lo logrará, pero la solución era, crear una nueva tabla idéntica y pasarle los registros, de esta manera se reducía el DBT.

Un Saludo y dinos de que manera lo arreglas.

Lmas 23-09-2003 13:08:06

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 :o 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;

SalU2


La franja horaria es GMT +2. Ahora son las 06:18:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi