Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Динамический поиск в гриде?  [new]
Scorp1978
Member

Откуда: Омск
Сообщений: 364
Поискал по форуму ничего похожего не нашел подскажите, вот такая задача:
есть грид, есть текстовое поле, при вводе в текстовое поле (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 сен 13, 05:48    [14899528]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
tanglir
Member

Откуда:
Сообщений: 28966
во-первых, iif(at(allt(This.Value),fio,1)>1,.t.,.f.) эквивалентно простому at(allt(This.Value),fio,1)>1
во-вторых, поместите this.value в переменную и используйте в фильтре её
в-третьих, отладчик вам зачем дан? ищете строку с ошибкой и разбираетесь, при выполнении/вычислении чего именно она возникла...
ну и в-четвёртых, я бы сделал хотя бы полусекундную задержку выполнения этого кода, чтобы не гонять байты понапрасну
30 сен 13, 06:09    [14899532]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
tanglir
Member

Откуда:
Сообщений: 28966
по п.1, там даже ещё проще:
alltrim(this.value) $ fio -- (насчёт this.value см.выше) 
30 сен 13, 06:12    [14899533]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Scorp1978
Member

Откуда: Омск
Сообщений: 364
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 сен 13, 06:26    [14899539]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Scorp1978
а как паузу организовать?
например
кидаете на форму таймер
в интерактивчейндже:
если не стартовал - стартовать
если стартовал, но полсекунды не прошло, то рестартовать

а в таймере при срабатывании выполнить фильтрацию и остановить таймер
30 сен 13, 06:34    [14899544]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Scorp1978
Member

Откуда: Омск
Сообщений: 364
понял.

почему вот такая связка неработает

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 сен 13, 06:51    [14899553]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Scorp1978
Member

Откуда: Омск
Сообщений: 364
вернее работает но как то коряво ставит фильтр на все
30 сен 13, 07:01    [14899560]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Dima T
Member

Откуда:
Сообщений: 15285
Выражение set filter проверяется в момент перемещения по таблице, т.е. когда ты перемещаешься по гриду, поэтому This.Value это Grid.Value, а не TextBox.Value как тебе надо.
Сделай свойство формы ThisForm.cPoisk и пользуйся им. Будет работать только внутри формы.

С lcpoisk тоже должна быть проблема если переменная имеет область видимости PRIVATE или LOCAL. Вероятно у тебя работает потому что ты эту переменную объявил в командном окне фокса. Можно ее PUBLIC сделать, но тоже не лучший выход.

В данном случае самый универсальный способ: макроподстановка.
local lcFilter
lcFilter = "iif(at([" + allt(This.Value) + "],fio,1)>1,.t.,.f.)"
set filter to &lcFilter
30 сен 13, 07:41    [14899586]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Scorp1978
Member

Откуда: Омск
Сообщений: 364
все заработало всем спасибо, вопрос вот я от фильтровал таблицу как посчитать количество получившихся записей recc() считает всю таблицу
30 сен 13, 11:11    [14900161]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Dag
Member

Откуда:
Сообщений: 842
select AnyValue from Mytable into array laTmp where MyCondition
wait wind _tally
30 сен 13, 11:26    [14900266]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Scorp1978
Member

Откуда: Омск
Сообщений: 364
set filter to работает на select?
30 сен 13, 12:01    [14900481]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Dag
Member

Откуда:
Сообщений: 842
Нет, не работает
Но у тебя же есть готовое условие MyCondition , типа
at(allt(This.Value),fio,1)
30 сен 13, 12:42    [14900798]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Dima T
Member

Откуда:
Сообщений: 15285
Можно так
count to lnCount

Только считать не советую, это тормоз, причем существенный. Сам set filter тормозов не вызывает, тормоза начинаются на действиях использующих фильтр:
GO TOP - будет сканировать с начала таблицы до нахождения первой записи удовлетворяющей условию
thisform.grid1.refresh() - будет сканировать пока не наполнится видимая часть грида записями
count to - скан от начала до конца с проверкой каждой записи

Если хочешь считать, то лучше переделай сразу SET FILTER на SELECT в курсор и в гриде показывай курсор, тогда RECCOUNT() будет количество давать.
30 сен 13, 12:43    [14900809]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Rostislav D. Kudryashov
Member

Откуда:
Сообщений: 237
Scorp1978, А как тебе такая идея, чтоб заменить Textbox1 из колонки Grid своим Textbox1 (ReadOnly), в котором метод KeyPress ловит нажатия букв и цифр в этой колонке, собирает их в своём дополнительном поле Pattern_c и отбражает это поле просто в окошке WAIT THIS.Pattern_c WINDOW NOWAIT. Еще ловит нажатия Esc и Backspace.
Ну, и конечно, на каждое изменение набранной маски делает с таблицей что тебе надо. Фильтр - так фильтр, или поиск строки.
Главное - тебе не нужно управлять высветкой лишнего поля-окна на форме.

А что касаемо решений по ошибкам - решение одно: ошибки надо исправлять.
30 сен 13, 23:06    [14904183]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Сидорво Илья
Member

Откуда:
Сообщений: 12
Dima T
Выражение set filter проверяется в момент перемещения по таблице, т.е. когда ты перемещаешься по гриду, поэтому This.Value это Grid.Value, а не TextBox.Value как тебе надо.
Сделай свойство формы ThisForm.cPoisk и пользуйся им. Будет работать только внутри формы.

С lcpoisk тоже должна быть проблема если переменная имеет область видимости PRIVATE или LOCAL. Вероятно у тебя работает потому что ты эту переменную объявил в командном окне фокса. Можно ее PUBLIC сделать, но тоже не лучший выход.

В данном случае самый универсальный способ: макроподстановка.
local lcFilter
lcFilter = "iif(at([" + allt(This.Value) + "],fio,1)>1,.t.,.f.)"
set filter to &lcFilter


Всем привет! Попробовал вот такой универсальный способ, что приведен выше! Фильтр не устанавливается на записи, где условие вхождения стоит в начале. То есть ищу товар например Durasel, он фильтрует все записи с таким словом, но не те в которых это условие стоит в самом начале. Мой косяк или надо как то схитрить?
22 дек 13, 11:26    [15329396]     Ответить | Цитировать Сообщить модератору
 Re: Динамический поиск в гриде?  [new]
Сидорво Илья
Member

Откуда:
Сообщений: 12
Разобрался. В условии поставил 1, заработало.
22 дек 13, 11:50    [15329426]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить