Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.23;
Скачать: CL | DM;

Вниз

Создание индекса таблицы 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 не создается вышеописанным методом?


 
sniknik ©   (2003-10-01 10:52) [41]

Ильш © (01.10.03 08:43) [40]
а ты сам проверь, только не из своей проги а в Database Desktop к примеру. только не бери свою "100% dBase III" табличку, начни с ее создания в нем, и вот если Database Desktop тебе откажет в создании mdx-а (а именно так и должно быть) то потом попробуй применить вышеописанным метод именно к этой табличке.
сам и выясниш получится или нет (99% за то что не получится, 1% на влияние фаз луны).


 
Ильш ©   (2003-10-01 12:27) [42]

Ну, ребята, ну вы че думаете я ничего не проверил и лажу тут гоню??? :(((
Эээх! В Database Desktop все отрабатывает правильно! Для dBase III создается ndx (не mdx)!!! Но проблема то в том, что AddIndex-су наплевать на это. Он прикручивает MDX !!!!!!!!
Повторяю!!! Условия задачки: Табличка dBase III, в Database Desktop создается NDX индекс, а AddIndex все равно создает MDX !


 
sniknik ©   (2003-10-01 13:12) [43]

Ильш © (01.10.03 12:27) [42]
твоя правда, решил проверить и получил то же самое, более того он еще и тип таблички на dBase IV поменял. (посмоти на тип гденибудь до и после, я в SQL explorer смотрел)
значит надо просто по другому делать если нужен именно NDX. (может можно и это исправить но если честно разбиратся неохота)


 
sniknik ©   (2003-10-01 13:18) [44]

кстати не подскажете в какой фазе у нас сегодня луна находится? :о)))


 
Anatoly Podgoretsky ©   (2003-10-01 15:18) [45]

Ильш © (01.10.03 12:27) [42]
Database Desktop создает через БДЕ, а не через VCL
Что бы создавать через VCL надо выполнить многое, а что у тебя как настроено, народу не известно, телепатов здесь нет.
Я писал уже не умеешь через VCL, делай через БДЕ, и надежнее будет, поскольку будет работать не взирая на настройки


 
Ильш ©   (2003-10-02 09:56) [46]

Ну раз вы Anatoly все умеете, в отличие от меня. Скажете народу, рассекретьте информацию. Что там надо настраивать. Ато все про настройки VCL говорите, но ничего конкретного?


 
Anatoly Podgoretsky ©   (2003-10-02 11:56) [47]

Это не я про настройки БДЕ не говорю (не VCL, а БДЕ, про настройки VCL я не говорил), а ты или автор вопроса, так же если ты читал внимательно, то заметил, что нужны не только настройки БДЕ, а правильный файл должного форматае, правильное создание индексов и полей (иначе файл будет автоматически преобразован в более старшую версию), правильные установки свойств свойств компонент и т.д.
Я же лично предпочитаю использовать функции БДЕ, хотя последнии 5 лет уже не было нужды создавать подобные индексы, поэтому возможны изменения в поведении БДЕ, по крайней мере установка уровня 7 весьма сильно влияет на все поведение, требуются большие разборки, что бы обеспечить правильную работу.



Страницы: 1 2 вся ветка

Текущий архив: 2003.10.23;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.022 c
8-74328
Александр Маленький
2003-06-21 14:24
2003.10.23
MP3


1-74300
Yahidze
2003-10-12 14:34
2003.10.23
Как подключить правильно Нelp


14-74435
Knight
2003-10-04 22:07
2003.10.23
Кто встречал...


6-74366
BillyJeans
2003-08-29 15:40
2003.10.23
UCP протокол...


3-74018
StarCon
2003-09-29 13:12
2003.10.23
Список серверов в combo-box