Форум » [x]Harbour » BMDBFCDX » Ответить

BMDBFCDX

Dima: Занятный RDD. Позволяет ставить оптимизированные фильтры даже без наличия индексов по фильтруемым полям а так же фильтры типа CUSTOM Есть пара вопросов [pre2] proc main local afilt:={} local nsec:=0 REQUEST BMDBFCDX REQUEST _BMDBF RDDSETDEFAULT( "BMDBFCDX" ) cls USE karta new // 10 полей 700000 записей set optimize on // не понятно назначение сией команды , результат одинаков // при OFF или ON nsec:=seconds() set filter to nomer==1454 go top ? seconds()-nsec // 0.14 секунд , DBFCDX выдал чуть хуже результат да и бровс с ним получился с тормозом. aadd(afilt,1) aadd(afilt,400000) aadd(afilt,700000) nsec:=seconds() BM_DBSETFILTERARRAY(afilt) go top ? seconds()-nsec // 0.0 секунд afilt:={} aadd(afilt,100) aadd(afilt,4000) aadd(afilt,7000) aadd(afilt,8000) aadd(afilt,17000) nsec:=seconds() BM_DBSETFILTERARRAY(afilt) go top ? seconds()-nsec // 0.0 секунд BM_DBSETFILTERARRAYADD(afilt,18000) // добавляем 6 запись ? len(BM_DBGETFILTERARRAY()) // но длина массива не изменилась //странно , возможно не так ее юзаю wait go top browse() // бровс летает close all return nil И не понятно что за зверь такой BM_Turbo() ? BM_Turbo(.t.) ? BM_Turbo(.f.) Вернет .F. в обоих случаях [/pre2]

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

Dima: Dima пишет: И не понятно что за зверь такой BM_Turbo() ? BM_Turbo(.t.) ? BM_Turbo(.f.) Вернет .F. в обоих случаях Ага , что то видимо задумывалось но ....... [pre2] HB_FUNC( BM_TURBO ) { hb_retl( HB_FALSE ); } [/pre2]

Dima: Dima пишет: BM_DBSETFILTERARRAYADD(afilt,18000) Разобрался. Надо так aadd(afilt,18000) BM_DBSETFILTERARRAYADD(afilt)

Pasha: Dima пишет: Надо так aadd(afilt,18000) BM_DBSETFILTERARRAYADD(afilt) Можно просто: BM_DBSETFILTERARRAYADD({18000}) Параметр - это массив номеров записей, которые добавляются к существующему фильтру.


Dima: Pasha пишет: BM_DBSETFILTERARRAYADD({18000}) Спасибо !

Панченко: Dima пишет: бровс летает Я так понимаю, что база локальная. А сетевой вариант не пробовали?

Dima: Панченко пишет: Я так понимаю, что база локальная Да Панченко пишет: А сетевой вариант не пробовали? Нет и смысла в этом не вижу без сервера базы данных. Вот если сделают поддержку в LetoDB этого RDD тогда другое дело. Хотя ради интереса завтра попробую , но результат уже предвижу.

Pasha: Dima пишет: Вот если сделают поддержку в LetoDB этого RDD тогда другое дело. Да я уже можно сказать что сделал. Осталось еще потестировать, подумать, не упустил ли что-нибудь, оформить все как положено, и выложить.

Dima: Pasha пишет: Да я уже можно сказать что сделал Готов тестить. Что нужно от меня ? Мыло ты знаешь если что.

Pasha: Отправил. Твой пример работает. Завтра постараюсь выложить на CVS, если глюков не обнаружится конечно.

Pasha: Поправил сброс фильтра, и сбросил изменения на CVS.

Dima: Pasha пишет: Отправил. Глянь мыло

Dima: Pasha Все работает отлично. Спасибо ! А собрать уже можно под Harbour 3.0 или все таки юзать 3.2 ?

Pasha: В связи с этим вопрос, может быть кто подскажет В скрипте hbp для hbmk2 можно задать локальную переменную окружения: -env:__BM=yes и затем ее использовать: {__BM}source/client/letobmcl.prg т.е, включать в сборку модуль letobmcl.prg, только если задан макрос __BM В harbour 3.0 этот способ не работает, работает только в 3.2dev Как можно сделать сборку по условию, т.е. включать в проект модуль только тогда, когда задан определенный макрос ? Интересует способ, который работал бы и в более ранних версиях Harbour, хотя бы до 3.0

Dima: Первые глюки в LetoDB и LBM Ставим Set filter to какой то , в BMDBFCDX BM_DBSETFILTERARRAY() вернет не пустой массив если в фильтре есть записи В Leto LBM_DBSETFILTERARRAY() вернет 0 да и фильтр получится не оптимизированным Установка Set filter to (или установка нового фильтра) не сбрасывает предыдущий фильтр , в BMDBFCDX это работает

Dima: Dima пишет: BM_DBSETFILTERARRAY() ошибся имел в виду BM_DBGETFILTERARRAY

Dima: Пример [pre2] BMDBFCDX set filter to nomer==1 go top ? len(BM_DBGETFILTERARRAY()) // 37 set filter to go top ? len(BM_DBGETFILTERARRAY()) // 0 set filter to nomer==5 go top ? len(BM_DBGETFILTERARRAY()) //63 [/pre2] [pre2] LETO set filter to nomer==1 go top ? len(LBM_DBGETFILTERARRAY()) // 0 set filter to go top ? len(LBM_DBGETFILTERARRAY()) // 0 set filter to nomer==5 go top ? len(LBM_DBGETFILTERARRAY()) //0 [/pre2]

Pasha: Оказывается, в харборе есть такая глобальная настройка: Set(_SET_FORCEOPT. <lOnOff>) Для bmdbfcdx она означает, что по set filter будет выполнен цикл по всему файлу, и заполнен массив записей Если она включена, то фильтр будет устанавливаться медленно (из-за цикла), но работать потом мгновенно. Сейчас получается, он в сервере выключен. Это очень важный параметр, и автоматически его в сервере устанавливать нельзя. Наверное, надо сделать глобальную настройку в letodb.ini, или отдельную команду для этой настройки А есть еще и настройка RDDI_FORCEOPT, но в BMDBF она не используется.

Dima: Pasha пишет: или отдельную команду для этой настройки лучше команду мне кажется давать из клиента или включать(выключать) на автомате в зависимости от RDD

Pasha: Сейчас это глобальная настройка. Если ее включить, то по любой команде set filter будет выполняться полный перебор всей записей файла, даже без учета set scope Это может быть медленно, если файл большой. Но так работает BMDBF Кстати, мне не очень понравился способ, как выполняется цикл Примерно так: for i:= 1 to nCount goto(i) next я по своему опыту знаю, что такой цикл выполняется медленнее, чем цикл по skip. Но так в этом rdd у Przemek'a Кстати, у Miguel Angel Marchuet было по другому. Но в его варианте свои недостатки. У Przemeka все правильно и красиво, только этот момент сделан по другому.

Dima: Мдя , засада.... И да если установлен фильтр через LBM_DBSETFILTERARRAY() то снять его обычными командами не получается



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