Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с очисткой таблицы [D7, dBase, FoxPro]


HID ©   (2007-07-30 16:59:00) 

Есть таблица DBF. Мне нужно периодически удалять из нее все записи. Я это делаю запросом.

delete from table

все записи удаляются, только файл с каждым удалением весит все больше и больше. По ходу дела, записи удаляются только логически. Подскажите, пожалуйста, как мне физически очишать таблицу.


HID   (2007-07-31 11:20:00) [1]

Вобщем, сделал, как посоветовал ЮЮ
DROP Table ...
CREATE Table ...
остался доволен и не парюсь.
Спасибо всем, ребят.


Jeer   (2007-07-31 10:09:00) [2]

Если необходимо удалить все записи, то не стоит употреблять термин "упаковка" - эта операция используется, как правило, для сжатия таблицы при наличии удаленных записей.

Для удаления всех записей и сжатия таблицы:
 tb.EmptyTable; // вызывается dbiEmptyTable

Для Pdx упаковка может быть произведена через dbiDoRest*, а dbiPack, как верно заметил AP в [3], для Pdx не сработает.

procedure PackTable(PackDataSet: TDataSet);
var
 Props: CURProps;
 hDb: hDBIDb;
 TableDesc: CRTblDesc;
begin
 if (PackDataSet is TTable) then
 begin
   PackDataSet.Close;
   (PackDataSet as TTable).Exclusive := True;
   PackDataSet.Open
 end
 else exit;
 Check(DbiGetCursorProps((PackDataSet as TTable).Handle, Props));
 FillChar(TableDesc, sizeof(TableDesc), 0);
 Check(DbiGetObjFromObj(hDBIObj((PackDataSet as TTable).Handle), objDATABASE, hDBIObj(hDb)));
 StrPCopy(TableDesc.szTblName, (PackDataSet as TTable).TableName);
 StrPCopy(TableDesc.szTblType, Props.szTableType);
 TableDesc.bPack := True;
 PackDataSet.Close;
 Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
 (PackDataSet as TTable).Exclusive := False;
 PackDataSet.Open;
end;

//
PackTable(tbMy {TTable});


ЮЮ   (2007-07-31 09:51:00) [3]

>а как на счет TQuery

тогда в другом TQuery последовательно выполнить запросы
DROP Table ...
CREATE Table ...

P.S. А данные не жалко?


Sergey13   (2007-07-31 09:18:00) [4]

> [6] HID ©   (31.07.07 08:50)

Пустышечный автомат ничуть не порнографичнее паковательного автомата. Намного более порнографично "периодически удалять из нее все записи".


HID   (2007-07-31 08:50:00) [5]

Пустышками я как раз и пользуюсь, но это порнография. Все должно работать автоматом. Кстати, на счет пакования, я знаю, что с использованием TTable, пакование делается, а как на счет TQuery, я через него таблицу юзаю.


MsGuns   (2007-07-31 08:11:00) [6]

>Desdechado ©   (30.07.07 20:20) [4]
>Хранить пустышку-болванку таблицы и класть ее поверх боевой при надобности.

Если еще все "пустышки" хранить в отдельной папке, то будет самое то


Desdechado   (2007-07-30 20:20:00) [7]

Хранить пустышку-болванку таблицы и класть ее поверх боевой при надобности.


Anatoly Podgoretsky   (2007-07-30 19:20:00) [8]

для paradox функция DbiPackTable не применима, зато для dbase самое то. А с ФоксПро работать в режиме RW себе вредить. С ФоксПро надо работать через АДО


Jeer   (2007-07-30 17:12:00) [9]

1.DbiPackTable(..) для paradox и dbase
Для fox может не пойти.
2. Если удаляются все записи, то проще грохнуть файл и заново пересоздать.


vtur   (2007-07-30 17:08:00) [10]

table.clear


Наверх

Титульная страница Поиск, карта сайта Написать письмо