Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Опять про воостановление индексов в Paradox 


sad   (2002-03-21 14:19) [0]

Здравствуйте, сразу же извиняюсь за повтор темы, но вот такая штука происходит, пытаюсь воостанавливать индексы функцией DBiRegenIndexes , то есть как советовали мастера

Check(DbiRegenIndexes(Table.Handle));

Но выдает мне она exception следующего вида :
Must use baseorder for this operation.

Прим.Таблица открыта как Exclusive



sniknik   (2002-03-21 14:41) [1]

А индекс точно присутствует? Хоть в каком виде, может сами индексные файлы удалены? Хотя в этом случае ошибки не даст просто проигнорирует.
Проверьте тип таблицы (может не Paradox вовсе). Или у вас индексы нестандартные или заголовок индексного файла порушен (не распознает он его).
Это на одной таблице или на всех?
Проверьте функцию на 100% рабочей таблице.
Или просто путаница и хендл вы ей не от таблици даете.



sad   (2002-03-21 14:52) [2]

Таблица рабочаяж открывается. редактируетсяб индексы тоже целы.

Но если я нажимаю кнопку которая запускает функцию восстановления, то выдается эта ошибка.
sniknik не могли бы вы поподробней рассказать про хендл, что там может быть неверно.Если конечно не затруднит, или ссылку на хелп (я с Delphi недавно работаю, к тому же описания функциий BDE у меня нет)



sniknik   (2002-03-21 15:11) [3]

Расказывать особо нечего вот весь (рабочий) код.
У батона Caption как наверное догадываетесь "Переиндексация"

procedure TForm1.Reindex(Table: TTable);
begin
Check(DbiRegenIndexes(Table.Handle));
end;

procedure TForm1.Button2Click(Sender: TObject);
var OldCursor : TCursor;
begin
OldCursor := Screen.Cursor;
Screen.Cursor := crHourglass;
if Table1.Active then Reindex(Table1);
Screen.Cursor:= OldCursor;
end;

А хендл он одинаковый что для таблици что для формы только на разные данные указывает. т.е. поставьте так Check(DbiRegenIndexes(Handle)); функцию и Delphi возьмет хендл формы и даст ошибку (не при компиляции а на этапе выполнения).



sad   (2002-03-21 15:27) [4]

sniknik, Все равно тоже самое.
А где можно прочитать что это за exception и результатом чего являетс.
Может ли это быть следствием того, что таблица не принадлежит данной форме, а принадлежит дата модулю.



sniknik   (2002-03-21 15:55) [5]

В хелпе можно найти но сложно.
Вряд ли дата модуль виноват если указатель правильный.
должна передаватся ссылка примерно такая

Check(DbiRegenIndexes(DatMod.Table1.Handle));

А можно функцию переиндексации прям в Дата Модуле написать. Если это от этого.



sad   (2002-03-21 16:05) [6]

Попробывал с таблицей, которая принадлежит форме все получилось без всяких проблем.
Но параллельно возник другой вопрос:
допустим у меня случайно поломался Primary index либо какой другой (из-за сбоя диска или т.п) таким образом, что при открытии таблицы выдает exception : Corrupted table/index header
функция DbiRegenIndexes уже не помогает возможно ли восстановление в таком случае, или кроме восстановления с резервной копии нничего не поможет?



sniknik   (2002-03-21 16:15) [7]

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



deleon   (2002-03-21 16:18) [8]

Handle - TTable к VCL никакого отношения не имеет и уходит корнями в Bde API, а Bde API функциям все-равно на чем там Table находится, так как Handle формируется функциями BDE API, а не VCL Delphi!



sniknik   (2002-03-21 16:44) [9]

Ну ты прям умными словами у человека охоту к программированию отобьеш :). Тоже думаю путаница у него гдето но неважно нашол рабочий вариант и ладно хватит (для начала).



vopros   (2002-03-21 17:06) [10]

У меня не знает таких фунций что надо подключить чтобы заработало:Check(DbiRegenIndexes(DatMod.Table1.Handle))?



sad   (2002-03-21 17:10) [11]

Надо подключить DBTable для Check и BDE для DbiRegenIndexes
Да, если используете Abort для выхода из чего-либо то придется использовать SysUtil.Abort т.к в BDE свой Abort и компилятор будет ругаться



vopros   (2002-03-21 17:23) [12]

Что-то у меня Dbtable нету...



sad   (2002-03-21 17:26) [13]

Пардон DBTables



vopros   (2002-03-25 14:28) [14]

Товарщи поясните по подробнее.
Делаю утилиту восстановления индексов. Есть form1.
На форме валяется таблица Table1. У нее Должно быть свойсвто Ative=true или false, Exclusive:=true или false.
У меня все в true но при
Check(DbiRegenIndexes(DatMod.Table1.Handle));
выдает invalid handle...Что делать поясните..как это сделать?



sniknik   (2002-03-25 15:56) [15]

Послал пример рабочий. Разбирайся. Единственная просьба ответить при получении. Не получиш через час пиши еще раз вышлю.



VAleksey   (2002-03-26 09:45) [16]

Была такая ошибка. Возьми абсолютно свободный компонент TTable, и назначь его свойствам DatabaseName и TableName соответственно имя (псевдоним) базы данных и имя таблицы для которой нужно перестроить индексы. Теперь запусти функцию.



vopros   (2002-03-26 12:25) [17]

Что-то я не допонимаю.
VAleksey (26.03.02 09:45) Все сделал также...пишет..Что не могу иницализировать Bde движок. Bde понятно стоит.
>sniknik@rambler.ru Пример для какого-делфи? Не работает. Смотрю код-делаю такж облом какой-то..Где-то проблема?



sniknik   (2002-03-26 12:36) [18]

Для шестого. Пример рабочий на 100%. В принципе ничего там нет специфического и в 5 должен работать. Но если у тебя с BDE проблемы то ясно работать не будет. Ктати что говорит при компиляции? или в рантайме облом?
Могу выслать скомпилированный провериш.



vopros   (2002-03-26 12:44) [19]

sniknik © (26.03.02 12:36)
Он не мог повредиться при архивации?...потому что там пишет при открытии неверное окончание строки...Я в 6 тоже пробывал открыть..Если не трудно скинь exe и саморапаковывающийся архив.
А bde нормально работает , только тут что-то непонятное твориться.



vopros   (2002-03-26 13:14) [20]

Теперь пишет Object not locked...



sniknik   (2002-03-26 20:05) [21]

To vopros ©
почисть ящик. третий раз посылаю. вот ответ (архив 410кб). и пиши на почту когда готов будеш.

This message was created automatically by mail delivery software.

A message that you sent could not be delivered to all of its recipients. The
following address(es) failed:

for_paolo@mail.ru:
Mailbox full:
for_paolo@mail.ru



VAleksey   (2002-03-27 07:16) [22]

Уважаемый вопрос не примудрствуй сделай по моему . все будет работать . Держи код. У меня это так работает:

var TbArr: Array [1..19] of string;
i:integer;
begin
While dm1.Database1.DataSetCount-1<>-1 do
begin
dm1.Database1.DataSets[dm1.Database1.DataSetCount-1].Close;
end;
ProgressBar1.Max:=18;
TbArr[1]:="Z_Staff.DB";//dm1.tbStaff;
// Ну набил список таблиц рукми ... лень было придумывать...
TbArr[19]:="Reports.db";
for i:=1 to 19 do
begin
Table1.TableName:=tbArr[i];
Table1.Exclusive:=true;
Table1.open;
Check(dbiRegenIndexes(Table1.Handle));
ProgressBar1.Position:=i;
Table1.close;
Table1.Exclusive:=false;
end;
lbMessage.Caption:="";
ProgressBar1.Position:=0;



deleon   (2002-03-27 08:53) [23]

Скачайте пакет DegisyDb там есть компонент упаковки и реиндексации всех таблиц базы данных (dBase & Paradox)!
http://www.dbwork.kuban.ru/download/degisydb.zip



vopros   (2002-03-27 10:01) [24]

Всем спасибо я разобрался.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.027 c
1-57700           kull                  2002-04-08 00:12  2002.04.18  
Как перевести string в другой charset?


1-57744           andr                  2002-04-05 13:13  2002.04.18  
Как посчитать кол-во дней между 2 датами?


14-57861          Mystic                2002-03-08 15:39  2002.04.18  
Дети


3-57620           Yuri Btr              2002-03-27 17:12  2002.04.18  
Связанные таблицы


3-57593           B_A_V                 2002-03-27 07:57  2002.04.18  
оператор select