Форум » [x]Harbour » Idx , Ntx vs Cdx » Ответить

Idx , Ntx vs Cdx

Dima: Так уж сложилось что начинал с NTX индексов , затем пересел на IDX (Six , Ads) Эти индексные файлы можно подключать к базе в произвольном порядке. А как дело обстоит в CDX ? ЗЫ Хочу прогу переделать с ADS (IDX) на LetoDB (CDX). Пока не представляю с какими трудностями придется столкнуться.

Ответов - 24, стр: 1 2 All

Andrey: CDX - драйвер в Клипере появился в 5.3, это (насколько помню) MsFox - драйвер, аналогичный SIX. Да они все примерно одинаковые. Драйвер классный, в одном индексном файле можно держать ХХХ количество индексных ключей. Работать с ним тоже нужно уметь, я с ним на возился в свое время. Я с 1996 года делаю так: в одном файле - одно индексное выражение (так как в винде нет теперь ограничения по файлам, ДОС-255 ). Перед созданием индекса, удаляю сам индексный файл (если он уже есть), это связано с тем что при построение индекса, новый индекс добавляется к существующему. И тогда нужно помнить на какое индексное выражение переключаться в программе. А так получается ОДНА база и МНОГО индексных файлов. В каком порядке открыл индексные файлы, в таком и пользуешься, переключаешь функцией DBSETORDER(N). Далее по индексу "влет" можно построить другой индексный файл (временный) и по ней работать с базой. Какие нужны будут примеры, обращайся, помогу. Так что трудностей по переходу не должно предвидеться.

Dima: Andrey Поиграюсь сам. Если будут вопросы , задам. Спасибо !

SergKis: Andrey пишет:А так получается ОДНА база и МНОГО индексных файлов. Не соглашусь. LetoDB(CDX) - ОДНА база, ОДИН индексный файл и много TAG-ов, к которым можно (и возможно лучше) обращаться по имени, а не только по номеру (например: DbSetOrder("KOD"), DbSetOrder("NAME"), ...). Имея много Tag-ов, можно комбинировать SetScope и SetFilter оптимистический. Не забудьте об использовании RDD MEMIO для выборок, tmp файлов - очень удобно.


Andrey: SergKis пишет: ОДИН индексный файл и много TAG-ов, к которым можно (и возможно лучше) обращаться по имени, а не только по номеру (например: DbSetOrder("KOD"), DbSetOrder("NAME"), ...). Имея много Tag-ов, можно комбинировать SetScope и SetFilter оптимистический. Не забудьте об использовании RDD MEMIO для выборок, tmp файлов - очень удобно. Согласен с этим. Просто как кто привык работать. А кто-то (я себя имею ввиду) и не стал дальше двигаться, текучка заедает... Занимаешься не программированием, а обслуживанием своих программ... Это тяжко... А вот как пользоваться "Имея много Tag-ов, можно комбинировать SetScope и SetFilter оптимистический" я бы хотел узнать. Если не сложно, можно пожалуйста небольшой примерчик ?

Pasha: Мне было проще, поскольку я в ads использовал индексы cdx, а это та же идеология, которая используется в harbour/letodb. Поэтому с переходом проблем не было. Сейчас посмотрел сырцы харбора, и увидел, что индексы idx не поддерживаются. Общий принцип работы с cdx: при открытии файла сразу надо открывать/создавать все используемые индексы. Даже если они в данной программе, или процедуре, или в текущем контексте не нужны. Если программа обновляет данные, то должны обновляться все индексы, даже если они этой программе не нужны. Вторая программа, или процедура, которая использует индексы, не обновленные первой программой, не увидит обновленные данные. Если программа не обновляет данные, то такая ситуация некритична. Но это частный случай. Обращаться к индексу (тэгу) можно и по номеру, и по имени. Я обращаюсь по номеру, поскольку тэги создаю в строго определенном порядке, но это необязательно. Можно и по имени. Лучшим решением я считаю упорядочить работу с индексами, а именно: для каждого файла определить обязательный перечень его индексов, и сразу их открывать/создавать при открытии файла.

SergKis: Паша пишет:Лучшим решением я считаю упорядочить работу с индексами, а именно: для каждого файла определить обязательный перечень его индексов, и сразу их открывать/создавать при открытии файла Абсолютно согласен, тем более, что в LetoDB стоит SetAutoOpen ON - индексный файл (при наличии) подключается сразу с DbSetOrder(0), что есть правильно - индексы ведутся и всегда актуальны. Andrey пишет:А вот как пользоваться "Имея много Tag-ов, можно комбинировать SetScope и SetFilter оптимистический" я бы хотел узнать. SetScope(0, _FIELD->R_CEX=='0100') SetScope(1, _FIELD->R_CEX=='0100') cFltr := "DtoS(_FIELD->R_DATE) >= '20130101' .and. DtoS(_FIELD->R_DATE) <= '20130131'" Set Filter To &cFltr dbGoTop() Паша пишет:После dbSetFilter надо вызвать проверку: LETO_ISFLTOPTIM() Фильтр может быть неоптимальным (клиентским), если в нем присутствуют переменные памяти или вызовы функций, незарегистрированных на сервере. Еще сервер не поймет ссылки на другие рабочие области. Я не рассматриваю случай просто неверного выражения.

Dima: Получается что если сегодня IDX индексы создаю так [pre2] use nomen new index on nomer to n1 index on ndok to n2 close nomen use nomen index n1,n2 new [/pre2] То для перехода на CDX достаточно сделать так [pre2] use nomen new index on nomer tag "n1" to n1 index on ndok tag "n2" to n2 close nomen use nomen index n1,n2 new [/pre2] И вопрос про Dbsetorder. C IDX использую его для установки управляющего индекса А как в CDX в моем случае ? Если я верно понял если в индексном файле всего 1 тег тогда можно юзать Dbsetorder , если не один тогда OrdSetFocus. Искал понятный мне аналог SIX функции Sx_SetTag и не нашел. Каково максимальное кол-во тегов может быть в одном индексном файле ?

PSP: INDEX ON <expKey> [ TAG <cOrderName>] [ TO <cOrderBagName>] т.е.: index on nomer tag "n1" to IndexFile index on ndok tag "n2" to IndexFile close nomen use nomen index IndexFile new OrdSetFocus( 1 ) // или нужный индекс Можно функцией: ORDCREATE(<cOrderBagName>, [<cOrderName>], <cExpKey>, <bExpKey>, [<lUnique>])

Dima: PSP пишет: INDEX ON <expKey> [ TAG <cOrderName>] [ TO <cOrderBagName>] т.е.: index on nomer tag "n1" to IndexFile index on ndok tag "n2" to IndexFile Да это я понял сразу. Просто при том подходе который я указал , переделок будет минимум. Я про это Dima пишет: use nomen new index on nomer tag "n1" to n1 index on ndok tag "n2" to n2 close nomen use nomen index n1,n2 new

Dima: По ходу еще вопрос. Можно ли проиндексировать один тег внутри составного индекса ?

alkresin: Dima пишет: Получается что если сегодня IDX индексы создаю так use nomen new index on nomer to n1 index on ndok to n2 close nomen use nomen index n1,n2 new То для перехода на CDX достаточно сделать так ... Нет необходимости ничего менять. Оставьте как есть, просто вместо idx индексов будут создаваться cdx, имя тэга по умолчанию будет то же, что имя индексного файла. Непонятно только, зачем закрывать файл и опять открывать. Если хотите, чтобы set index не закрывал уже открытые другие индексы, используйте additive. И вопрос про Dbsetorder. C IDX использую его для установки управляющего индекса А как в CDX в моем случае ? Если я верно понял если в индексном файле всего 1 тег тогда можно юзать Dbsetorder , если не один тогда OrdSetFocus В обоих случаях можно использовать и то, и другое. Если тэгов несколько, то лучше ordSetFocus(имятэга), так как сохранение определенного порядка следования тэгов никто не гарантирует. По ходу еще вопрос. Можно ли проиндексировать один тег внутри составного индекса ? Без проблем. Смысла, правда, большого не вижу. Сделайте reindex - и все.

Dima: alkresin пишет: Нет необходимости ничего менять Вообще то есть. План перехода [1]ADS(IDX) -> [2]ADS(CDX) ->[3]Обкатка ->[4]LetoDB(CDX)->[5]Обкатка Если оставить все как есть , то с пунктом [2] будет проблемка так как будут созданы IDX файлы.

alkresin: Dima пишет: План перехода [1]ADS(IDX) -> [2]ADS(CDX) ->[3]Обкатка ->[4]LetoDB(CDX)->[5]Обкатка Если оставить все как есть , то с пунктом [2] будет проблемка так как будут созданы IDX файлы. Ну так выкиньте этот пункт. Я говорю о том, что если вы не хотите менять свои программы, то можете этого не делать. Все будет работать, только индексы будут cdx. По хорошему надо, конечно, использовать возможности cdx, но для этого придется переработать код. Я это делал больше 15 лет назад, когда переходил с ntx на cdx. Для каждого dbf есть основные индексы, их имеет смысл поместить как тэги в составной cdx с тем же именем, что и dbf - тогда он будет открываться автоматически вместе с dbf, все тэги будут, соответственно, обновляться автоматически. Временные индексы имеет смысл размещать в файлах с другими именами, чтоб не "засорять" основной индексный файл.

MIKHAIL: Подскажите, а как нужно собирать программу для использования CDX? Я прилинковал dbfcdx.lib, но функция rddlist() не выдала доступного драйвера DBFCDX. Может нужно убрать сначала DBFNTX из компановки?

Dima: MIKHAIL REQUEST DBFCDX rddSetDefault("DBFCDX")

MIKHAIL: REQUEST DBFCDX rddSetDefault("DBFCDX") У меня Clipper 5.3 При сборке выдает ошибку: BLINKER : 1115 : C:\CLIP\LIB\DBFCDX.LIB(CL53INIT) : '_DBFCDX' : unresolved external

Dima: MIKHAIL пишет: У меня Clipper 5.3 А раздел этот Harbour , значит не туда пишешь !

MIKHAIL: А раздел этот Harbour , значит не туда пишешь ! Тема актуальна для обеих систем. Тем более что Harbour логическое продолжение Clipper. Если я открою аналогичную ветку в другом разделе и начну задавать те же вопросы, мне кажется это усложнит систематизацию знаний и помощь в решении для других нуждающихся...

Dima: http://clipper.borda.ru/?1-0-140-00000442-000-0-0

MIKHAIL: Спасибо большое. Однако остался вопрос по использованию драйвера DBFCDX. У них другие форматы memo-поля FPT. Как в таком случае обеспечить совместимость? Нужно специальную процедуру писать по импорту файлов в новый формат или есть другие способы использования DBT ?



полная версия страницы