Форум » [x]Harbour » Обьясните, кто знает » Ответить

Обьясните, кто знает

Pasha: Хочу создать 3 индекса, каждый в отдельном файле (bag) Делаю: Field Key, N1, N2 request DBFCDX func main rddSetdefault("DBFCDX") dbCreate("tt", {{"KEY", "C", 4, 0}, {"N1", "N", 10, 0}, {"N2", "N", 10, 0}}) use tt new index on Key tag tt to tt ? OrdKey(), ordCount() // Результат - 1 открытый индекс index on n1 tag n1 to t1 ? OrdKey(), ordCount() // Результат - 2 открытых индекса index on n2 tag n2 to t2 ? OrdKey(), ordCount() // Результат - 2 открытых индекса. А почему не 3 ? return nil После создания и открытия 2-го индекса 1-й остается открыт А после открытия 3-го 2-й почему-то закрывается, а открытым остается только 1-й Почему ?

Ответов - 12

Andrey: Нужна команда ADDITIVE (не помню точно, а хелпа нет с собой), тогда индексы будут добавляться в стек, и переключаться между ними: Dbsetorder(1) 2, 3 ......

Pasha: Andrey пишет: Нужна команда ADDITIVE (не помню точно, а хелпа нет с собой), тогда индексы будут добавляться в стек, и переключаться между ними: Dbsetorder(1) 2, 3 ...... Не то Это опция команды set index, если она задана - не выдается OrdListClear Я же выдаю index on Почему-то при этом не все индексы остаются открытыми. Обьясню, зачем мне это надо. Хочу создавать несколько temporary индексов. Создаю 2-й, а 1-й при этом закрывается, зараза.

Dima: Pasha пишет: Это опция команды set index [pre2] INDEX ON <indexExpr> ; [TAG <cIndexName>] ; [TO <cIndexFile>] ; [FOR <lForCondition>] ; [WHILE <lWhileCondition>] ; [ALL] ; [NEXT <nNumber>] ; [RECORD <nRecNo>] ; [REST] ; [EVAL <bBlock>] ; [EVERY <nInterval>] ; [UNIQUE] ; [ASCENDING|DESCENDING] ; [USECURRENT] ; [ADDITIVE] ; [CUSTOM] ; [NOOPTIMIZE] ; [TEMPORARY] ; [USEFILTER] ; [EXCLUSIVE] [/pre2]


Pasha: Dima пишет: цитата: Это опция команды set index INDEX ON <indexExpr> ; [TAG <cIndexName>] ; [TO <cIndexFile>] ; [FOR <lForCondition>] ; [WHILE <lWhileCondition>] ; [ALL] ; [NEXT <nNumber>] ; [RECORD <nRecNo>] ; [REST] ; [EVAL <bBlock>] ; [EVERY <nInterval>] ; [UNIQUE] ; [ASCENDING|DESCENDING] ; [USECURRENT] ; [ADDITIVE] ; [CUSTOM] ; [NOOPTIMIZE] ; [TEMPORARY] ; [USEFILTER] ; [EXCLUSIVE] Спасибо, это то, что надо. Проглядел

ММК: Pasha пишет: Почему-то при этом не все индексы остаются открытыми. На самом деле результат ordCount() у Вас должен быть 1 Двоечка т.к. совпадает имя базы, имя индекса и тага :) index on Key tag ttt to tot ? OrdKey(), ordCount() // Результат - 1 открытый индекс index on n1 tag n1 to t1 ? OrdKey(), ordCount() // Результат - 1 открытых индекса index on n2 tag n2 to t2 ? OrdKey(), ordCount() // Результат - 1 открытых индекса. Но если сделать вот так - index on Key tag ttt to tt ? OrdKey(), ordCount() // Результат - 1 открытый индекс index on n1 tag n1 to tt ? OrdKey(), ordCount() // Результат - 2 открытых индекса index on n2 tag n2 to tt ? OrdKey(), ordCount() // Результат - 3 открытых индекса. :)

Pasha: Так у меня разные bagname для всех 3-х индексов, т.е. создаются tt.cdx t1.cdx t2.cdx в каждом по одному тэгу

ММК: Pasha пишет: в каждом по одному тэгу tt.cdx переименуйте в t0.cdx ( к примеру ) И Вы увидите , что при таком раскладе всегда открыт один индекс. Если надо сразу три то создавайте один индексный файл с , но с разными тэгами Попробуйте свой примерчик :))))

AlexMyr: Паша, насколько я понял, то ordcount() возвращает количество индексов в индексном файле. Если переделать прогу след. образом: Field Key, N1, N2 request DBFCDX func main rddSetdefault("DBFCDX") dbCreate("tt", {{"KEY", "C", 4, 0}, {"N1", "N", 10, 0}, {"N2", "N", 10, 0}}) use tt new index on Key tag tt to tt ? OrdKey(), ordCount("tt"),ordbagname() // Результат - 1 открытый индекс index on n1 tag n1 to t1 ? OrdKey(), ordCount("t1"),ordbagname() // Результат - 2 открытых индекса index on n2 tag n2 to t2 ? OrdKey(), ordCount("t2"),ordbagname() // Результат - 2 открытых индекса. А почему не 3 ? return nil то в результате получим, что в каждом индексном файле по одному индексу: Key 1 tt n1 1 t1 n2 1 t2 А если прога следующая Field Key, N1, N2 request DBFCDX func main rddSetdefault("DBFCDX") dbCreate("tt", {{"KEY", "C", 4, 0}, {"N1", "N", 10, 0}, {"N2", "N", 10, 0}}) use tt new index on Key tag tt to tt ? OrdKey(), ordCount("tt"),ordbagname() // Результат - 1 открытый индекс index on n1 tag n1 to t1 index on n2 tag n2 to t1 ? OrdKey(), ordCount("t1"),ordbagname() // Результат - 2 открытых индекса index on n2 tag n2 to t2 ? OrdKey(), ordCount("t2"),ordbagname() // Результат - 2 открытых индекса. А почему не 3 ? return nil то в результате получим: Key 1 tt n2 2 t1 n2 1 t2 т.е. в t1.cdx два индекса.

AlexMyr: Еще как пример по ordcount можно посмотреть \harbour\contrib\hbnetio\tests\netiot03.prg , т.е. идет перебор индексов в индексном файле: ... proc testdb( cName ) local i, j use (cName) ? "used:", used() ? "nterr:", neterr() ? "alias:", alias() ? "lastrec:", lastrec() ? "ordCount:", ordCount() for i:=1 to ordCount() ordSetFocus( i ) ? i, "name:", ordName(), "key:", ordKey(), "keycount:", ordKeyCount() next ...

Pasha: AlexMyr пишет: Паша, насколько я понял, то ordcount() возвращает количество индексов в индексном файле. Нет, это общее к-во тэгов во всех открытых индексных файлах

ММК: Pasha пишет: Нет, это общее к-во тэгов во всех открытых индексных файлах Неааа :) это правильно только в том случае если все тэги в одном файле. Точнее количество тэгов в открытом файле ( индексном ) Вот Ваш исправленный пример : index on Key tag ttt to tot ? OrdKey(), ordCount() // Результат - 1 открытый индекс index on n1 tag n1 to t1 ? OrdKey(), ordCount() // Результат - 1 открытых индекса index on n2 tag n2 to t2 ? OrdKey(), ordCount() // Результат - 1 открытых индекса. Вот так он работает :) Команда index on создает индекс и если Вы создаете их несколько , то открыт всегда последний. Открывается командой SET INDEX : Opens one or more index files in the current work area. Syntax SET INDEX TO [<cIndexFile,...>] [ADDITIVE] Вот так ...

Dima: Подниму старую темку ММК пишет: Pasha пишет: цитата: Нет, это общее к-во тэгов во всех открытых индексных файлах Неааа :) это правильно только в том случае если все тэги в одном файле. Точнее количество тэгов в открытом файле ( индексном ) Так выяснили кто прав ? Сделал примерчик. use test new index on first tag aaa index on last tag bbb index on street tag ccc to aats additive ? ordcount() // 3 Паша прав однако.



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