Форум » [x]Harbour » Подсчет кол-ва записей по полям.... на "лету" » Ответить

Подсчет кол-ва записей по полям.... на "лету"

Andrey: Есть база с полями KCITY, KSTREET, HOUSE, и т.д. Кол-во записей порядка 3-5 тыс. База проиндексирована: 1-индекс "KCITY" 2-индекс "KSTREET" 3-индекс "STR(KCITY)+STR(KSTREET)+UPPER(HOUSE)" и т.д. Как сделать БЫСТРЫЙ подсчет кол-ва записей на "лету" ? Т.е. юзер выбирает город, высвечивается кол-во записей в БД по этому городу, далее выбирает улицу по этому городу - высвечивается кол-во записей по этой улице и т.д.

Ответов - 15

AlexMyr: Примерно так ordsetfocus(tag) // "STR(KCITY)+STR(KSTREET)+UPPER(HOUSE)" ordscope(0,str(KCITY)) ordscope(1,str(KCITY)) ordkeycount() // количество записей для количества улиц ordscope(0,str(KCITY)+STR(KSTREET)) ordscope(1,str(KCITY)+STR(KSTREET)) ordkeycount() // количество записей и так далее.

Andrey: AlexMyr пишет: AlexMyr Спасибо большое. Я по документации видел ordscope, но он у меня не заработал... Интересно, а по скорости создание условного индекса быстрей будет ?

Vlad04: ordscope - давно пользуюсь условный индекс быстрее не будет- это создание условный индекс использую для сложной выборки где можно и подождать


Andrey: Vlad04 Спасибо большое ! Остановился на условном индексе. Дальше нужно выбирать по адресу список домов и корпусов. А под ordscope переделываю другую часть программы, где долго идет подсчет кол-ва записей....

Dima: Andrey пишет: Остановился на условном индексе. Ну и не верно ! Не правильный подход в данном контексте.

Andrey: Dima пишет: Ну и не верно ! Не правильный подход в данном контексте. Не понял ? Мне нужно: 1) подсчитать кол-во записей. 2) создать список домов по этим записям (по выбранной улице). Далее создать список корпусов и подъездов по дому ! Условный индекс все равно приходиться строить ! Строиться он ОЧЕНЬ быстро... даже и не чувствуется в задача по сетке.

AlexMyr: Andrey пишет: Не понял ? Уже есть индекс: Andrey пишет: 3-индекс "STR(KCITY)+STR(KSTREET)+UPPER(HOUSE)" по нему делается только ordscope и все что нужно Andrey пишет: Мне нужно: 1) подсчитать кол-во записей. 2) создать список домов по этим записям (по выбранной улице). Далее создать список корпусов и подъездов по дому ! этим ordscope и считается и создается список и тд, зачем условный индекс дополнительно?

Andrey: AlexMyr пишет: и создается список и тд, зачем условный индекс дополнительно? А как создать список ? Не пользовался ни разу другими средствами ! Я делаю примерно так: cIndex := "Numkorp" cFilterTo := "KSTREET == "+ALLTRIM(STR(nStreet))+".AND.UPPER(cNumHOUSE)=='" cFilterTo += UPPER(Dom)+"' .AND. DELETED() == .F." cTag := "DOG_HOUSE" cFileIndx := M->SetTemp+"tmp_recno_dogovor_house.cdx" IF FILE (cFileIndx) DELETE FILE (cFileIndx) // всегда удалять индекс-файл (на всякий случай) ENDIF SELECT DOGOVOR DBSetOrder(6) GOTO TOP SEEK(nStreet) INDEX ON &cIndex TAG(cTag) TO (cFileIndx) FOR &cFilterTo ADDITIVE nKolvoHouse := ORDKEYCOUNT() ...... aKorpus := {} ; nKorp2 := 0 // Подсчет и вывод КОРПУСОВ по ДОМУ DBSetOrder(7) FOR nJ := 1 TO nKolvoHouse ORDKEYGOTO(nJ) IF nKorp2 # FIELD->Numkorp IF FIELD->Numkorp # 0 AADD( aKorpus, ALLTRIM(STR(FIELD->Numkorp)) ) ENDIF nKorp2 := FIELD->Numkorp ENDIF NEXT // а дальше вывод списка корпусов на экран ....

AlexMyr: use your_table index on STR(KCITY)+STR(KSTREET)+UPPER(HOUSE) to file_index tag tt1 ordsetfocus("tt1") ordscope(0,str(город1)) ordscope(1,str(город1)) dbgotop() ordkeycount() // количество записей dbedit() // тут список по конкретному городу или свой browse // дальше клацаешь enter ordscope(0,str(город1)+str(улица1)) ordscope(1,str(город1)+str(улица1)) dbgotop() ordkeycount() // количество записей dbedit() // тут список по конкретному городу плюс по улице ну и так далее

AlexMyr: по такому принципу у меня работает многоуровневый справочник, номер уровня записывается в массив, а ordscope фильтрует записи и показывает через browse в hwgui. Все просто.

Andrey: AlexMyr Спасибо большое за методику ! Буду применять у себя в дальнейшем.

Andrey: AlexMyr пишет: use your_table index on STR(KCITY)+STR(KSTREET)+UPPER(HOUSE) to file_index tag tt1 ordsetfocus("tt1") ordscope(0,str(город1)) ordscope(1,str(город1)) dbgotop() ordkeycount() // количество записей dbedit() // тут список по конкретному городу или свой browse // дальше клацаешь enter ordscope(0,str(город1)+str(улица1)) ordscope(1,str(город1)+str(улица1)) dbgotop() ordkeycount() // количество записей dbedit() // тут список по конкретному городу плюс по улице ну и так далее Переделал. Появилась разница в кол-ве записей. Т.е. подсчитываются удаленные записи. Как от них избавиться ?

Loach: index on STR(KCITY)+STR(KSTREET)+UPPER(HOUSE) tag tt1 to file_index for !deleted()

Andrey: Loach пишет: index on STR(KCITY)+STR(KSTREET)+UPPER(HOUSE) tag tt1 to file_index for !deleted() Не хотелось бы это использовать.... А другие варианты есть ?

Loach: Andrey пишет: А другие варианты есть ? К сожалению SET DELETED тут не срабатывает. Ну, например как такой вариант: index on iif(your_table->(deleted()),'1','0')+STR(KCITY)+STR(KSTREET)+UPPER(HOUSE) tag tt1 to file_index и тогда соответственно ordscope(0,"0"+str(город1)) ordscope(1,"0"+str(город1))



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