Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-74279
Roksolan
2003-10-13 09:19
2003.10.23
Install Shield Express


14-74396
Manfred
2003-10-02 16:03
2003.10.23
Визуальное программирование: расслабляет?


1-74220
Abikos
2003-10-09 17:22
2003.10.23
Ищу бесплатные компоненты для отображения animated gifs


3-74071
gedd
2003-10-01 19:45
2003.10.23
Проблема с выборкой в Access


3-74007
Ahmad K
2003-10-05 16:04
2003.10.23
Самый ламерский вопрос!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский