Как в базах DBF логически удаленные записи удалить физически.
Table1->Close();
Table1->Exclusive=true;
Table1->Open();
DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
но как дело подходит к етой строчке Table1->Open(); выскакивает сообщение что таблица занята
Так вот вопрос как мне её освободить ?
поставь Table1->Active в false
А в фун-ию FormCreate()
{
Table1->Open();
}
Далее
Table1->Close();
Table1->Exclusive=true;
DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
Table1->Open();
Но физического del-a нет (размер dbf-фа не меняется)
ЗЫ только надо, чтобы к базе был доступ через драйвер BDE STANDART, а тип был DBASE.
// упаковка таблицы
DBIResult __fastcall PackLog(AnsiString asDatabase, AnsiString asTable)
{
DBIResult dbiResult;
CURProps CurProps;
hDBIDb hdbiDb;
hDBICur hCursor;
char cError[255];
// открыть БД
dbiResult = DbiOpenDatabase(asDatabase.c_str(), NULL,
dbiREADWRITE, dbiOPENSHARED,
NULL, 0, NULL, NULL, hdbiDb);
dbiResult = DbiGetErrorString (dbiResult, cError);
if (dbiResult != DBIERR_NONE) return dbiResult;
// открыть таблицу
dbiResult = DbiOpenTable(hdbiDb, asTable.c_str(), NULL,
NULL, NULL, 0, dbiREADWRITE,
dbiOPENEXCL, xltFIELD, TRUE,
NULL, hCursor);
dbiResult = DbiGetErrorString (dbiResult, cError);
if (dbiResult != DBIERR_NONE) goto CleanUp;
dbiResult = DbiGetCursorProps(hCursor, CurProps);
if (dbiResult != DBIERR_NONE) goto CleanUp;
strcpy(cError, CurProps.szTableType);
if(strcmp(CurProps.szTableType, szDBASE) == 0)
// {
// Get the database handle from the cursor handle
dbiResult = DbiPackTable(hdbiDb, hCursor, NULL, NULL, false);
dbiResult = DbiGetErrorString (dbiResult, cError);
// }
CleanUp
dbiResult = DbiCloseCursor(hCursor);
dbiResult = DbiCloseDatabase(hdbiDb);
return dbiResult;
}
//---------------------------------------------------------------------------