powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Динамический поиск в гриде?
16 сообщений из 16, страница 1 из 1
Динамический поиск в гриде?
    #38411329
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поискал по форуму ничего похожего не нашел подскажите, вот такая задача:
есть грид, есть текстовое поле, при вводе в текстовое поле (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

есть решения?
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411330
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых, iif(at(allt(This.Value),fio,1)>1,.t.,.f.) эквивалентно простому at(allt(This.Value),fio,1)>1
во-вторых, поместите this.value в переменную и используйте в фильтре её
в-третьих, отладчик вам зачем дан? ищете строку с ошибкой и разбираетесь, при выполнении/вычислении чего именно она возникла...
ну и в-четвёртых, я бы сделал хотя бы полусекундную задержку выполнения этого кода, чтобы не гонять байты понапрасну
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411331
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по п.1, там даже ещё проще:
Код: sql
1.
alltrim(this.value) $ fio -- (насчёт this.value см.выше) 
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411335
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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()

а как паузу организовать?
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411336
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scorp1978а как паузу организовать?например
кидаете на форму таймер
в интерактивчейндже:
если не стартовал - стартовать
если стартовал, но полсекунды не прошло, то рестартовать

а в таймере при срабатывании выполнить фильтрацию и остановить таймер
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411338
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял.

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

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()

т.е. по отдельности работает а вместе нет
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411340
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернее работает но как то коряво ставит фильтр на все
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411346
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выражение set filter проверяется в момент перемещения по таблице, т.е. когда ты перемещаешься по гриду, поэтому This.Value это Grid.Value, а не TextBox.Value как тебе надо.
Сделай свойство формы ThisForm.cPoisk и пользуйся им. Будет работать только внутри формы.

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

В данном случае самый универсальный способ: макроподстановка.
Код: sql
1.
2.
3.
local lcFilter
lcFilter = "iif(at([" + allt(This.Value) + "],fio,1)>1,.t.,.f.)"
set filter to &lcFilter
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411502
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все заработало всем спасибо, вопрос вот я от фильтровал таблицу как посчитать количество получившихся записей recc() считает всю таблицу
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411522
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select AnyValue from Mytable into array laTmp where MyCondition
wait wind _tally
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411584
Scorp1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set filter to работает на select?
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411661
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не работает
Но у тебя же есть готовое условие MyCondition , типа
at(allt(This.Value),fio,1)
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38411667
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так
Код: sql
1.
count to lnCount


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

Если хочешь считать, то лучше переделай сразу SET FILTER на SELECT в курсор и в гриде показывай курсор, тогда RECCOUNT() будет количество давать.
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38412419
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scorp1978, А как тебе такая идея, чтоб заменить Textbox1 из колонки Grid своим Textbox1 (ReadOnly), в котором метод KeyPress ловит нажатия букв и цифр в этой колонке, собирает их в своём дополнительном поле Pattern_c и отбражает это поле просто в окошке WAIT THIS.Pattern_c WINDOW NOWAIT. Еще ловит нажатия Esc и Backspace.
Ну, и конечно, на каждое изменение набранной маски делает с таблицей что тебе надо. Фильтр - так фильтр, или поиск строки.
Главное - тебе не нужно управлять высветкой лишнего поля-окна на форме.

А что касаемо решений по ошибкам - решение одно: ошибки надо исправлять.
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38509148
Dima TВыражение set filter проверяется в момент перемещения по таблице, т.е. когда ты перемещаешься по гриду, поэтому This.Value это Grid.Value, а не TextBox.Value как тебе надо.
Сделай свойство формы ThisForm.cPoisk и пользуйся им. Будет работать только внутри формы.

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

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



Всем привет! Попробовал вот такой универсальный способ, что приведен выше! Фильтр не устанавливается на записи, где условие вхождения стоит в начале. То есть ищу товар например Durasel, он фильтрует все записи с таким словом, но не те в которых это условие стоит в самом начале. Мой косяк или надо как то схитрить?
...
Рейтинг: 0 / 0
Динамический поиск в гриде?
    #38509156
Разобрался. В условии поставил 1, заработало.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Динамический поиск в гриде?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]