Форум: "Базы";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизСоздание индекса таблицы dBaseIII+ Найти похожие ветки
← →
Ada (2003-09-25 11:29) [0]Подскажите пожалуйста как создать индекс для таблицы dBaseIII+ программным путем, у меня выдается масса ошибок.
При создании индекса через Database Desktop все получается отлично.
← →
Ильш (2003-09-25 11:30) [1]Код то давай! Где код????
← →
DenK_vrtz (2003-09-25 11:36) [2]Ada, значит что-то не так в консерватории!
← →
Ada (2003-09-25 11:36) [3]with Table1 do
begin
Table1.IndexDefs.Clear;
DatabaseName:="D:\Dbf\";
TableName:="RK.DBF";
AddIndex("RK","TN",[ixExpression]);
Table1.Active:=True;
end;
← →
DenK_vrtz (2003-09-25 12:11) [4]А текст ошибок где?
← →
Ada (2003-09-25 12:16) [5]Index does not exist
← →
Sandman25 (2003-09-25 12:19) [6]Попробуйте дать другое имя, и не указывать ixExpression.
Например, так:
AddIndex("ixTn_RK","TN",[]);
← →
Ada (2003-09-25 12:26) [7]Не получается, выдается та же самая ошибка
← →
Sandman25 (2003-09-25 12:30) [8]Попробуйте вызвать Table1.IndexDefs.Update перед открытием - это обновит информацию об индексах.
← →
Ada (2003-09-25 13:04) [9]Увы, но опять та же ошибка
← →
Sandman25 (2003-09-25 13:11) [10]К сожалению, тогда не знаю :(
Там еще есть куча свойств типа IndexName, IndexFiles, попробуйте пошаманить с ними.
← →
Ильш (2003-09-25 13:17) [11]В общем выяснил в чем проблема.
Ситуация такая если взять новую таблицу без индекса, создать индекс, а потом его удалить средствами Виндоус, то сразу же появляется такая ошибка. Все дело видимо в том что AddIndex что-то меняет в хедере DBF-ки.
Поэтому надо удалять индексный файл с помощью DeleteIndex.
Я у себя попробовал. Все нормально. Индекс создается и удаляется.
Т.е. вам придется создать где-то такую же базу с такой же структурой и все данные переписать. И заменить ею существующую.
И вообще эти авто-подцепляемые индексы такая бяка порой. :((
← →
Ильш (2003-09-25 13:37) [12]Точно в описании формата dbf указано, что есть такой флаг, который ставится при создании mdx индекса. Вот из-за него и проблема.
← →
Sandman25 (2003-09-25 13:44) [13]Возможно, AddIndex не учитывает различия между dBaseIII+ и, скажем, dBaseIII или IV, и неправильно изменяет тот заголовок, о котором говорит Ильш.
← →
Ильш (2003-09-25 13:55) [14]Во во ! В описании сказано, что этот флаг поддерживается в DBASE IV только. Соответственно выводы делаем сами :)
← →
Ильш (2003-09-25 13:56) [15]Но только не "не правильно", а нельзя удалять индекс пуками. Надо тока программно через DeleteIndex. Тогда все ОКЕЙ !!! Сейчас тока проверял!
← →
Ada (2003-09-25 14:06) [16]Спасибо, я сейчас тоже попробую
← →
Ada (2003-09-25 14:52) [17]Не хочу показаться совсем глупенькой, но у меня опять проблема.
Я сделала как вы сказали: заменила старую базу на новую, индекс у меня создался. Когда я запустила приложение 2 раз появилась ошибка "Index already exists"я попыталась удалить старый индекс выдается сообщение:"Index already exists", Index:название индекса
← →
Sandman25 (2003-09-25 15:38) [18]Делайте индекс, только если его нет. if Table1.IndexDefs.IndexOf(имя индекса) = -1
Теперь уже лучше повторите создание новой базы, наверное. Правда, странная ругань Index already exists. Такое ощущение, что Вы постоянно пытаетесь сделать этот индекс.
← →
Ada (2003-09-25 16:18) [19]Когда я пытаюсь осуществить поиск индекса Table1.IndexDefs.IndexOf(имя индекса), почему то индекс не находится, хотя на самом деле он существует. Может там что-то с тегом связано?
← →
Sandman25 (2003-09-25 16:33) [20][19] Ada (25.09.03 16:18)
А Вы делаете Table1.IndexDefs.Update перед этим?
← →
Ada (2003-09-25 16:53) [21]Да делаю, но индекс не находится
← →
Sandman25 (2003-09-25 17:14) [22]Есть идея поставить создание индекса в try except. Или при открытии опять будет ошибка?
← →
Ada (2003-09-25 17:28) [23]Создание индекса у меня стоит уже в try except
← →
Ильш (2003-09-26 06:11) [24]Как это так вы удаляли старый индекс, что появилось сообщение Index already exists.
Table1.DatabaseName:="D:\";
Table1.TableName:="opl.DBF";
Table1.DeleteIndex("OPL");
Больше ничего не надо. Все нормально удаляется. И еще зачем вы ищете его. В реальной программе надо индекс создавать один раз, если его нет. Зачем постоянно то его создавать-удалять.
DeleteIndex - работает так: удаляет физический mdx файл и в dbf переключает флаг отвечающий за наличие или отсутствие индекса mdx.
← →
Anatoly Podgoretsky (2003-09-26 07:39) [25]Ильш © (26.09.03 06:11) [24]
Откуда в dBaseIII+ индексы mdx
← →
Ильш (2003-09-26 08:50) [26]
> Откуда в dBaseIII+ индексы mdx
Надо это спросит у тех кто писал процедуру AddIndex, потому что, по всей видимости, эй пофиг dBaseIII+ или еще что.
В описании dbf сказано, что mdx есть тока у dBaseIV, но реально это оказалось не так. Я ж не просто придумал, а проверил все это !!!
← →
Term (2003-09-26 09:43) [27]а откуда такая необходимость именно dBaseIII+, пусть тогда dBaseIV использует. У меня таких проблем ни разу не всплывало, лучше сразу создать все индексы в design time и подключать в нужное время, а строить и удалять, лишь в том случае если с ними проблемы
← →
Anatoly Podgoretsky (2003-09-26 09:53) [28]Ильш © (26.09.03 08:50) [26]
Ей не пофиг, просто надо умень готовить.
А твоя проверка оказалась хреновой, ни как не соответсвующей действительность, нет и не придвидится никаких mdx у dBaseIII
И описание ты тоже наверно неверно читал, или эе просто выкинь ту книжку, посколько в ней ложь.
← →
Andrey_and (2003-09-26 10:59) [29]Я незаметил в коде Table1.Exclusive:=true; перед addindex!!!
← →
Term (2003-09-26 11:01) [30]а если таблица используется локально, то это вроде не обязательно
← →
Ильш (2003-09-26 12:53) [31]
> А твоя проверка оказалась хреновой, ни как не соответсвующей
> действительность, нет и не придвидится никаких mdx у dBaseIII
> И описание ты тоже наверно неверно читал, или эе просто
> выкинь ту книжку, посколько в ней ложь.
Во-первых - выбирай выражения!!! (на счет хреновой)
Во-вторых - сам проверь если уж не верится. Все так и есть. AddIndex наплевать на твои изречения. Функция прикручивает в dbf файл mdx. Я сам знаю, что mdx у dBaseIII не должно быть, но AddIndex считает по другому. Если ты видишь какое то другое решение проблемы - предлагай.
описание формата dbf -
http://www.whitetown.com/link/xbase.html#DBF_STRUCT
← →
Anatoly Podgoretsky (2003-09-26 13:05) [32]Зачем проверять то что заподлинно известно.
Компаундный индексный файл, он же Production поддержан для dBase версий 4/5/5.5/5.7/7/2000/Internet, то есть все что выше или равно 4
Для нижних версий только не обслуживаемые NDX файлы
Так что не надо оспаривать очевидное.
Зачем ты приводишь эту статью, там указана не совсем верная информация, за верной информацие надо ходить к разработчику или критически относиться к другим источникам
Насчет "проверь" я уже сказал, ты просто не умеешь их готовить. И это не AddIndex считает, а ты!!!
Ты создал файл формата 4 или выше.
← →
gydi (2003-09-26 20:24) [33]from forum:
Вопрос:
[DBF] Как открыть индексированную таблицу DBASE, если нет файла *.MDX?
Ответ:
Для DBASE-таблицы встроенными средствами ты не перестроишь индекс, если его нет. Для этой цели мне пришлось написать процедуру для физического удаления признака индексации в самом DBF файле и после ее применения добавлять индексы заново. Для этого в заголовок файла DBF по смещению 28(DEC) записываешь 0. По другому никак не выходит(я долго бился)- вот для PARADOX таблиц все OK.
← →
Anatoly Podgoretsky (2003-09-26 20:37) [34]gydi (26.09.03 20:24) [33]
Зачем писать что то и еще и закерскими способами, когда в БДЕ есть все необходимое? dbiRegisterCallback
← →
Ильш (2003-09-30 09:33) [35]
> Ты создал файл формата 4 или выше.
Блин! Ну неужели я пишу не по-русски??? Я создал файл DBASEIII+ !!! Ну да ладно! Проехали уже. :)
Странно, что Ada ничего не говорит??? Помогло или нет. Жаль :(
← →
Ильш (2003-09-30 09:45) [36]Все таки вся проблема в том, что то место где этот флаг ставится у dBaseIV в dBaseIII+ и ниже просто зарезервированная область. Т.е. в нее AddIndex легко может писать все что захочет !!!!!
← →
Anatoly Podgoretsky (2003-09-30 10:14) [37]Ильш © (30.09.03 09:33) [35]
Как не старайся, но ты создал файл формата 4 или выше, об этом говорит наличие mdx.
← →
Ильш (2003-10-01 06:15) [38]Для Adы!
http://e-dok.narod.ru/delphi/question1/bd/bd-291.html
почитай!!!
> Anatoly Podgoretsky © (30.09.03 10:14) [37]
Вот тут обнаружилась такая бяка! Беру 100% файл dBaseIII. Специально проверил структуру! Делаю AddIndex. Заглядываю опять в структуру. Такое чувсьво, что AddIndex не разбирает какая версия dBase используется. Он настойчиво пишет в 28 позицию флаг наличия mdx файла и создает этот файл. Чего по теории быть не должно! Вы проверьте сами!!!
← →
Anatoly Podgoretsky (2003-10-01 07:41) [39]Для того, что бы получилось, надо многое сделать, правильно настроить БДЕ, правильно установить свойства компонентов, должен быть 100% чистый dBaseIII файл, правильно создать правильные индексы.
Как минимимум, что бы получить помощь, надо привести все эти данные. И конечно надо понимание форматов dBase и FoxPro, понимание VCL и его азаимодействия с БДЕ.
Только зачем мучиться с VCL?,когда это легче и правильнее сделать через BDE, тогда не будет такой жесткой завязки на настройки БДЕ и конмпонент, но и в этом случае все равно надо выполнить все условия по созданию индекса.
" Вы проверьте сами" нет необходимости повторно проверять, то что работает.
← →
Ильш (2003-10-01 08:43) [40]Т.е. у вас значит для файла dBaseIII mdx не создается вышеописанным методом?
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.01 c