|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Поискал по форуму ничего похожего не нашел подскажите, вот такая задача: есть грид, есть текстовое поле, при вводе в текстовое поле (textbox) букавок грид должен обновлятся а на таблицу в гриде накладываться фильтр если есть совпадение, в слове и тексте из фильтра. вот че получилось: в interactivechange текстбокса if empty(This.Value) set filter to go top else SELECT adress set filter to iif(at(allt(This.Value),fio,1)>1,.t.,.f.) GO TOP endif thisform.grid1.refresh() выдает ошибку fuction argument value есть решения? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 05:48 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
во-первых, iif(at(allt(This.Value),fio,1)>1,.t.,.f.) эквивалентно простому at(allt(This.Value),fio,1)>1 во-вторых, поместите this.value в переменную и используйте в фильтре её в-третьих, отладчик вам зачем дан? ищете строку с ошибкой и разбираетесь, при выполнении/вычислении чего именно она возникла... ну и в-четвёртых, я бы сделал хотя бы полусекундную задержку выполнения этого кода, чтобы не гонять байты понапрасну ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 06:09 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
по п.1, там даже ещё проще: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 06:12 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
tanglir, благодарю вот такой код заработал if empty(This.Value) set filter to go top else SELECT adress lcpoisk = this.value set filter to alltrim(lcpoisk) $ fio GO TOP endif ThisForm.Grid1.refresh() а как паузу организовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 06:26 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Scorp1978а как паузу организовать?например кидаете на форму таймер в интерактивчейндже: если не стартовал - стартовать если стартовал, но полсекунды не прошло, то рестартовать а в таймере при срабатывании выполнить фильтрацию и остановить таймер ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 06:34 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
понял. почему вот такая связка неработает if empty(This.Value) set filter to go top else SELECT adress lcpoisk1 = lower(allt(ThisForm.Text1.value)) lcpoisk2 = lower(allt(ThisForm.Text2.value)) lcpoisk3 = lower(allt(ThisForm.Text3.value)) lcpoisk4 = lower(allt(ThisForm.Text4.value)) lcpoisk5 = lower(allt(ThisForm.Text5.value)) set filter to (alltrim(lcpoisk3) $ lower(allt(street)) and alltrim(lcpoisk5) $ lower(allt(fio))) GO TOP endif ThisForm.Grid1.refresh() т.е. по отдельности работает а вместе нет ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 06:51 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
вернее работает но как то коряво ставит фильтр на все ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 07:01 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Выражение set filter проверяется в момент перемещения по таблице, т.е. когда ты перемещаешься по гриду, поэтому This.Value это Grid.Value, а не TextBox.Value как тебе надо. Сделай свойство формы ThisForm.cPoisk и пользуйся им. Будет работать только внутри формы. С lcpoisk тоже должна быть проблема если переменная имеет область видимости PRIVATE или LOCAL. Вероятно у тебя работает потому что ты эту переменную объявил в командном окне фокса. Можно ее PUBLIC сделать, но тоже не лучший выход. В данном случае самый универсальный способ: макроподстановка. Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 07:41 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
все заработало всем спасибо, вопрос вот я от фильтровал таблицу как посчитать количество получившихся записей recc() считает всю таблицу ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:11 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
select AnyValue from Mytable into array laTmp where MyCondition wait wind _tally ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:26 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
set filter to работает на select? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 12:01 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Нет, не работает Но у тебя же есть готовое условие MyCondition , типа at(allt(This.Value),fio,1) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 12:42 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Можно так Код: sql 1.
Только считать не советую, это тормоз, причем существенный. Сам set filter тормозов не вызывает, тормоза начинаются на действиях использующих фильтр: GO TOP - будет сканировать с начала таблицы до нахождения первой записи удовлетворяющей условию thisform.grid1.refresh() - будет сканировать пока не наполнится видимая часть грида записями count to - скан от начала до конца с проверкой каждой записи Если хочешь считать, то лучше переделай сразу SET FILTER на SELECT в курсор и в гриде показывай курсор, тогда RECCOUNT() будет количество давать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 12:43 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Scorp1978, А как тебе такая идея, чтоб заменить Textbox1 из колонки Grid своим Textbox1 (ReadOnly), в котором метод KeyPress ловит нажатия букв и цифр в этой колонке, собирает их в своём дополнительном поле Pattern_c и отбражает это поле просто в окошке WAIT THIS.Pattern_c WINDOW NOWAIT. Еще ловит нажатия Esc и Backspace. Ну, и конечно, на каждое изменение набранной маски делает с таблицей что тебе надо. Фильтр - так фильтр, или поиск строки. Главное - тебе не нужно управлять высветкой лишнего поля-окна на форме. А что касаемо решений по ошибкам - решение одно: ошибки надо исправлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 23:06 |
|
Динамический поиск в гриде?
|
|||
---|---|---|---|
#18+
Dima TВыражение set filter проверяется в момент перемещения по таблице, т.е. когда ты перемещаешься по гриду, поэтому This.Value это Grid.Value, а не TextBox.Value как тебе надо. Сделай свойство формы ThisForm.cPoisk и пользуйся им. Будет работать только внутри формы. С lcpoisk тоже должна быть проблема если переменная имеет область видимости PRIVATE или LOCAL. Вероятно у тебя работает потому что ты эту переменную объявил в командном окне фокса. Можно ее PUBLIC сделать, но тоже не лучший выход. В данном случае самый универсальный способ: макроподстановка. Код: sql 1. 2. 3.
Всем привет! Попробовал вот такой универсальный способ, что приведен выше! Фильтр не устанавливается на записи, где условие вхождения стоит в начале. То есть ищу товар например Durasel, он фильтрует все записи с таким словом, но не те в которых это условие стоит в самом начале. Мой косяк или надо как то схитрить? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2013, 11:26 |
|
|
start [/forum/topic.php?desktop=1&fid=41&tid=1582793]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 254ms |
0 / 0 |