On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение





Пост N: 368
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 08.11.13 13:41. Заголовок: DBFNTX: как грамотно прервать работу SET FILTER ?


Добрый день

Есть некая таблица:
date D8
idx1 N5
idx2 N5
flags C5
string C80

И есть фрагмент программы:
filter_sx := "" 
SELE table
SET FILT TO IIF(LEN(filter_sx)==0,TRUE,(filter_sx $ table->str))
DBEDIT(...)

Т.е. пока в строку фильтра ничего не попало - видны все записи.
Если юзер хочет отфильтровать часть записей по содержимому строки - срабатывает фильтр.

Возникает ситуация: если таблица большая (>100 тыс записей), расположена на сервере и юзер желает увидеть какие-то "редкие" записи, процесс фильтрации начинает занимать непозволительно долгое время. Юзер понимает, что лучше набрать в фильтре что-то другое, но как остановить процесс текущей фильтрации ?

Делал так:
filter_sx := "" 
SELE table
SET FILT TO MyFilter()
DBEDIT(...)
...

FUNC MyFilter()

IF LEN(filter_sx) == 0
RETURN TRUE
ELSEIF INKEY(0) == K_ESC // юзер устал ждать ?
filter_sx := "" // выключаем фильтр
RETURN TRUE
ELSE
RETURN (filter_sx $ table->string)
ENDIF
RETURN TRUE

Но данный метод приводит вообще к чудным результатам: в 90% случаев после нажатия Esc - DBEDIT() начинает бешено прокручивать список вверх и зависает на первом элементе таблицы. Насколько понял по отладчику, что-то непонятное (для меня) происходит в недрах объекта в районе :Stabilize()

С какой стороны к этому вопросу подступиться?

PS: в Clipper было тоже самое - но когда тормозило всё, это было не так заметно, а сейчас, на фоне быстрой и адекватной работы Harbour... напрягает....

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 120 , стр: 1 2 3 4 5 6 All [только новые]


постоянный участник




Пост N: 3120
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.11.13 21:52. Заголовок: Pasha пишет: Не буд..


Pasha пишет:

 цитата:
Не буду даже пытаться объяснить, что к чему, просто покажу, как надо сделать:


Спасибо БОЛЬШОЕ !
Как увидел, так сразу понял, раньше так делал. Просто уже глаза замылились....

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3737
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.11.13 22:02. Заголовок: Andrey пишет: Прост..


Оффтоп:
Andrey пишет:

 цитата:
Просто уже глаза замылились


Глазам отдых нужен !


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3121
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.11.13 11:44. Заголовок: dbEvalDirect() - зар..


dbEvalDirect() - заработал. Но Browse() ломается при показе после него и программ вылетает.
Массив создается нормально.

// Создание блока кода из выражения поиска
bFilter := &("{||" + cFilterTo + "}")
SELECT DOGOVOR
dbEvalDirect(bDo, bFilter)
BROWSE(1,0,MAXROW(),MAXCOL())



Как починить dbEvalDirect() или после него нельзя вызывать browse() ?
C dbeval() таких проблем нет.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 265
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.11.13 13:40. Заголовок: Pasha dbEvalDirect()..


Pasha
dbEvalDirect() портит что-то ...
prg: Скрытый текст

hb_out.log:Скрытый текст

мой log, тест работы:Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3052
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.11.13 18:54. Заголовок: SergKis пишет: Pash..


SergKis пишет:

 цитата:
Pasha
dbEvalDirect() портит что-то ...



Поправил, переименовал функцию в dbfEval, добавил поддержку всех параметров, как в dbEval, сборку под xharbour:

http://files.mail.ru/A324711CF8A94781808E50C7BEB48B30

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 267
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.11.13 20:43. Заголовок: Pasha prg: a := {} d..


Pasha
prg:Скрытый текст

без Browse не снимается с Browse валится hb_out.log:
Скрытый текст


содержимое hb_out.log получено за один запуск exe.
вариант со стандартным dbEval работает.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 268
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.11.13 20:50. Заголовок: Pasha это hb 3.2 bcc..


Pasha
это hb 3.2 bcc.
под MSVC и hb 2.0 без browse валится на USE закрытия. hb_out.log:Скрытый текст



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3126
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.11.13 21:17. Заголовок: Pasha Не собирается..


Pasha
Не собирается под
xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903)
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 131
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 28.11.13 10:53. Заголовок: Andrey пишет: Не со..


Andrey пишет:

 цитата:
Не собирается под


Пока возникли небольшие технические трудности я вас немножко развлеку. Необходимость в функции поиска возникает регулярно.
И регулярно появляются разные варианты (но в Харбор , как стандартную функцию их почему то не включают :) )
Вот один из таких :))

http://files.mail.ru/4B45968E44E6429AB810802AB86AE7DF

База shared , без индекса. Записей чуть больше трех с половиной лимонов. При поиске используются стандартные управляющие
символы "?" и "*" . Анализ кодировки ( дос или win) и формирование массива с номерами найденных записей.
Формат функции : поле, шаблон поиска, кодировка.

#include "FiveWin.ch"
Function Main

Local nTime,n:=0
Local popa:={}, vr

RDDSetDefault('DBFCDX')
Use dr new shared

nTime := Seconds()
while (vr:=FLocate('TYJ','D?d*','D'))<>-1
N:=n+1
aadd(popa,vr)
enddo
MsgInfo( Seconds() - nTime )
for vr=1 to len(popa)
MsgInfo( popa[vr] )
next
Return NIL

Скорость ,естественно , зависит от машины. Есть небольшая погрешность - память очищается не "до" , а "после " поэтому запустите
примерчик два-три раза.... На моей машине это приблизительно 0.7 секунды



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 269
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.13 11:35. Заголовок: MMK пишет:На моей ма..


MMK пишет:
 цитата:
На моей машине это приблизительно 0.7 секунды


у меня ~ 1.37. но в данном примере 4 поля и длина записи 40, в моем 92 и 912. Функция dbfEval работает в 4 раза быстрее стабильно:
 
Do while: 2.2470 ARRAY[51218] 206904
DbEval : 2.2460 ARRAY[51218] 206904
DbfEval : 0.5140 ARRAY[51218] 206903


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3740
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.11.13 11:39. Заголовок: ММК пишет: FLocate ..


ММК пишет:

 цитата:
FLocate


Что за черный ящик ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 132
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 28.11.13 14:56. Заголовок: SergKis пишет: но ..


SergKis пишет:

 цитата:
но в данном примере 4 поля и длина записи 40, в моем 92 и 912


Ну это понятно, понятно.... А не затруднит Вас сделать поиск по моей базке и сформировать массив?
Шаблон D?d* . Т.е. с учетом ? и * . Для чистоты эксперемента :))))

Dima пишет:

 цитата:
Что за черный ящик ?



Да старые архивы перебирал :) Нашел Fast Locate




Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3741
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.11.13 14:58. Заголовок: ММК пишет: Нашел Fa..


ММК пишет:

 цитата:
Нашел Fast Locate


Исходничек тоже есть ? :)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 270
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.13 18:04. Заголовок: MMK пишет: А не затр..


MMK пишет:
 цитата:
А не затруднит ...


Сделал:
маску превратил в: upper(left(TYJ,1)+subs(TYJ,3,1)) == 'DD'
 
Do while: 35.1160 ARRAY[5] 3506491
DbEval : 35.7870 ARRAY[5] 3506491
DbfEval : 7.3320 ARRAY[5] 3506490

Результат FastLocate впечатляет !

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3054
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.11.13 19:20. Заголовок: SergKis пишет: без ..


SergKis пишет:

 цитата:
без Browse не снимается с Browse валится hb_out.log:



Я пока в затруднении. Дело в том, что я таких ошибок не получаю, никакого последействия нет. Вот прицепил эту функцию к своему dbedit, тоже все работает.
Да и кода в dbfEval с гулькин нос, непонятно, откуда взяться ошибке.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3127
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.11.13 19:30. Заголовок: Pasha Не собирается ..


Pasha
Не собирается под
xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903)

Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 271
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.13 20:59. Заголовок: Pasha собрал как ест..


Pasha
собрал как есть: http://gfile.ru/a2yK5
browse перестал слетать и пару раз даже без снятия отработал.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 133
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 29.11.13 10:31. Заголовок: SergKis пишет: Do ..


SergKis пишет:

 цитата:
Do while: 35.1160 ARRAY[5] 3506491
DbEval : 35.7870 ARRAY[5] 3506491
DbfEval : 7.3320 ARRAY[5] 3506490


Результат FastLocate впечатляет !



Спасибо , что уделили внимание !

Pasha пишет:

 цитата:
Я пока в затруднении. Дело в том, что я таких ошибок не получаю, никакого последействия нет.



Если у Вас есть желание и время я пришлю Вам исходник. Может из двух вариантов получится что хорошее для народа :))
Dima пишет:

 цитата:
Исходничек тоже есть ? :)


Вот ,собственно говоря , ответ :)))


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3742
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.11.13 14:25. Заголовок: ММК пишет: Если у В..


ММК пишет:

 цитата:
Если у Вас есть желание и время я пришлю Вам исходник. Может из двух вариантов получится что хорошее для народа :))


Ждем Пашу !

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3055
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.11.13 14:42. Заголовок: Да я уже со всем раз..


Да я уже со всем разобрался, вечером скину.
Должен сказать, что в letodb выборка по установленному фильтру по скорости сопоставима с dbfEval, (хотя чуть медленнее)
Но так и должно быть, поскольку letodb работает в монопольном режиме.
А насчет fast locate - если его скорость сопоставима или лучше, чем в dbfEval, есть смысл на него глянуть.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 120 , стр: 1 2 3 4 5 6 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 221
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет