Автор | Сообщение |
|
| Администратор
|
Пост N: 2154
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.11 12:14. Заголовок: Обьясните, кто знает
Хочу создать 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
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1927
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.11.11 12:35. Заголовок: Нужна команда ADDITI..
Нужна команда ADDITIVE (не помню точно, а хелпа нет с собой), тогда индексы будут добавляться в стек, и переключаться между ними: Dbsetorder(1) 2, 3 ......
|
|
|
|
| Администратор
|
Пост N: 2155
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.11 12:51. Заголовок: Andrey пишет: Нужна..
Andrey пишет: цитата: | Нужна команда ADDITIVE (не помню точно, а хелпа нет с собой), тогда индексы будут добавляться в стек, и переключаться между ними: Dbsetorder(1) 2, 3 ...... |
| Не то Это опция команды set index, если она задана - не выдается OrdListClear Я же выдаю index on Почему-то при этом не все индексы остаются открытыми. Обьясню, зачем мне это надо. Хочу создавать несколько temporary индексов. Создаю 2-й, а 1-й при этом закрывается, зараза.
|
|
|
|
| |
Пост N: 2195
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.11.11 13:09. Заголовок: Pasha пишет: Это оп..
Pasha пишет: цитата: | Это опция команды 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]
|
|
|
|
| Администратор
|
Пост N: 2156
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.11 13:29. Заголовок: Dima пишет: цитата..
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] |
| Спасибо, это то, что надо. Проглядел
|
|
|
|
| постоянный участник
|
Пост N: 79
Зарегистрирован: 29.05.10
|
|
Отправлено: 15.11.11 13:30. Заголовок: Pasha пишет: Почему..
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 открытых индекса. :)
|
|
|
|
| Администратор
|
Пост N: 2157
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.11 13:51. Заголовок: Так у меня разные ba..
Так у меня разные bagname для всех 3-х индексов, т.е. создаются tt.cdx t1.cdx t2.cdx в каждом по одному тэгу
|
|
|
|
| постоянный участник
|
Пост N: 80
Зарегистрирован: 29.05.10
|
|
Отправлено: 15.11.11 14:04. Заголовок: Pasha пишет: в кажд..
Pasha пишет: tt.cdx переименуйте в t0.cdx ( к примеру ) И Вы увидите , что при таком раскладе всегда открыт один индекс. Если надо сразу три то создавайте один индексный файл с , но с разными тэгами Попробуйте свой примерчик :))))
|
|
|
|
| |
Пост N: 318
Зарегистрирован: 11.06.10
|
|
Отправлено: 15.11.11 16:36. Заголовок: Паша, насколько я по..
Паша, насколько я понял, то 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 два индекса.
|
|
|
|
| |
Пост N: 319
Зарегистрирован: 11.06.10
|
|
Отправлено: 15.11.11 16:44. Заголовок: Еще как пример по or..
Еще как пример по 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 ...
|
|
|
|
| Администратор
|
Пост N: 2158
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.11 17:00. Заголовок: AlexMyr пишет: Паша..
AlexMyr пишет: цитата: | Паша, насколько я понял, то ordcount() возвращает количество индексов в индексном файле. |
| Нет, это общее к-во тэгов во всех открытых индексных файлах
|
|
|
|
| постоянный участник
|
Пост N: 81
Зарегистрирован: 29.05.10
|
|
Отправлено: 15.11.11 17:50. Заголовок: Pasha пишет: Нет, э..
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] Вот так ...
|
|
|
|
|
| |
Пост N: 4715
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.04.15 16:04. Заголовок: Подниму старую темку..
Подниму старую темку ММК пишет: цитата: | Pasha пишет: цитата: Нет, это общее к-во тэгов во всех открытых индексных файлах Неааа :) это правильно только в том случае если все тэги в одном файле. Точнее количество тэгов в открытом файле ( индексном ) |
| Так выяснили кто прав ? Сделал примерчик. use test new index on first tag aaa index on last tag bbb index on street tag ccc to aats additive ? ordcount() // 3 Паша прав однако.
|
|
|
|