![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переиндексация
Term © (2003-05-28 10:21:00)Для переиндексации использую
procedure ReindexTable(Table: TTable);
var
WasActive: Boolean;
WasExclusive: Boolean;
begin
with Table do begin
WasActive := Active;
WasExclusive := Exclusive;
DisableControls;
try
if not (WasActive and WasExclusive) then Close;
try
Exclusive := True;
Open;
Check(dbiRegenIndexes(Handle));
finally
if not (WasActive and WasExclusive) then begin
Close;
Exclusive := WasExclusive;
Active := WasActive;
end;
end;
finally
EnableControls;
end;
end;
end;
взял процедуру на этой конференции автор Dred2K, при её выполнении выдаётся ошибка "Must use baseorder for this operation", может или автор или еще ктонить разъяснит в чом проблема?
VAleksey (2003-05-28 10:46:00) [1]table.free;
Не забудь сделать.
Verg (2003-05-28 10:44:00) [2]Я вот так переиндексировал:
var
SrcTbl : TTable;
function RebuildIndexes(const Name : string; Se : boolean):boolean;
begin
result:=false;
try
SrcTbl.Close;
SrcTbl.TableName:=Name;
SrcTbl.IndexFieldNames:="";
SrcTbl.Exclusive:=true;
try
SrcTbl.Open;
SrcTbl.FieldDefs.Update;
SrcTbl.IndexDefs.Update;
FRecCount:=SrcTbl.RecordCount;
DBP.Active:=true;
DbTables.Check(DbiRegenIndexes(SrcTbl.Handle));
result:=true;
finally
SrcTbl.Close;
SrcTbl.Exclusive:=false;
end;
except
end;
end;
Но эта штука не всегда помогает, поэтому потом я стал применять "ломовой" метод: удаляю все индексные файлы у таблицы, а затем строю индексы заново по образцу.
Term (2003-05-28 10:43:00) [3]спасибо буду пробовать
гончий (2003-05-28 10:43:00) [4]2VAlexey - так делать необязательно, тк в вышеуказанной процедуре набор данных и так закрывается и переоткрывается в эксклюзивном режиме. А вот на счет ошибки, это скорее всего и есть lookup поля(возможно Referential Integrity)
VAleksey (2003-05-28 10:40:00) [5]Надо так:
Table:=TTable.Create(nil);
Table.DataBaseName:=TableForReindex.DataBaseName;
Table.TableName:=TableForReindex.TableName;
TableForReindex.Close;
procedure ReindexTable(Table);
TableForReindex.Open;
baseorder - Непосредственный доступ к таблице. Ес-сно его нет если ты используешь объекты поля или лукап поля и тому подобное.
Term (2003-05-28 10:38:00) [6]да чо все поумерли штоли
Term (2003-05-28 10:34:00) [7]поясни как это " "база порядка" используется некорректно"?
Term (2003-05-28 10:33:00) [8]Народ ну ктонить, неужто никто не переиндексировал парадокс не разу, так не бывает, ответьте
Новачок (2003-05-28 10:32:00) [9]Такая ошибка встречается обычно, когда "база порядка" используется некорректно.
Я сам сейчас мучаюсь над этой проблемой.
Если найдется решение - очень хотелось бы услышать.