:: Visual Foxpro, Foxpro for DOS
Проблема с SET FILTER TO
ZenTigra

Сообщений: 514
Дата регистрации: 03.12.2004
Для таблицы устанавливаю фильтр командой
SET FILTER TO mark=.T.

мне нужно чтобы фильтр начал действовать, но в хелпе написано
Выражение фильтрации не вычисляется до тех пор, пока не будет перемещен указатель текущей записи.

Как обойти это? Не делаю SKIP +/- 1

Если б таблица была б в Grid-е, я бы просто сделал Refresh, а так не пойму как заставить фильтр действовать, не перемещая запись...

PS.Отказаться от фильтра не предлагать...



Исправлено 1 раз(а). Последнее : ZenTigra, 15.06.17 19:31
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Запомнить № записи.
Переместить курсор на др. запись. Вернуться.


------------------
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
ZenTigra

Сообщений: 514
Дата регистрации: 03.12.2004
Спасибо за ответ, не успел написать, что нашел очень простое решение
LOCATE FOR key=1
Условие задачи было, что если запись не попадает в фильтр то необходимо переместить курсор на початок таблицы...

PS.Вопрос решен...
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
GO TOP тоже на початок таблицы встает...
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
GO TOP не оптимизируется, а LOCATE даже без условия - оптимизируется.
2 ТС фильтр SET FILTER - это условия для ПЕРЕХОДОВ по записям. Он никуда сами "неподходящие" записи не убирает. Чтобы проверить одну текущую запись не нужно никаких SET FILTER - просто само условие и проверяй.
логическое поле/выражение=.T. это "масло масляное". Вполне достаточно писать ПРОСТО логическое поле/выражение. Т.е. SET FILTER TO mark или там IF mark


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Проблема с SET FILTER TO
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
...не понял, про GO TOP, который "не оптимизируется". Как понять? 2 вопроса:
1. В текущем ORDER фокс не может найти "самая верхняя запись" (ну, под произвольным фильтром оптимизируется, согласно выражению фильтра, как и LOCATE и любая другая команда "поиск в таблице")
2. ТС хочет встать на начало ("початок") таблицы, об ORDER не упоминает. GO TOP разве не сделает перемещение в таблице, и курсор встанет на "первую" существующую запись под фильтром (в терминах ТС "фильтр начнет действовать")
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
ZenTigra

Сообщений: 514
Дата регистрации: 03.12.2004
Задача вот в чем была
Есть две таблицы, в них не больше 10 записей, обе они используются в качестве меню. Но отображение записей во второй таблице зависит от выбранной записи в первой таблице. То есть необходимо накладывать фильтр для второй таблицы. И для этого подходит SET FILTER TO...,
но возникла проблема, что при выборе записи в первой таблице, когда предыдущая запись во второй не удовлетворяет условием фильтра, необходимо установить запись на начало отфильтрованных записей во второй таблице...
Код вышел что-то на подобии этого
SELECT table1
T_key=table1.key
SELECT table2
SET FILTER TO mark=.T.
LOCATE FOR table2.key=T_key
IF FOUND()=.F.
GO TOP
ENDIF

PS.Простите за беспокойство, но бывают простые вещи не сразу в голову приходят. До кода не придираться, то просто пример...



Исправлено 1 раз(а). Последнее : ZenTigra, 15.06.17 21:33
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
akvvohinc

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
ZenTigra
Условие задачи было, что если запись не попадает в фильтр то необходимо переместить курсор на початок таблицы...

Что-то здесь не так.

Если условие задачи описано верно, а условие фильтра - значение .T. в поле mark, то для решения этой задачи надо проверить значение именно этого поля в текущей записи table2:
SELECT table2
SET FILTER TO mark
IF !mark
* текущая запись не попала в фильтр => встать на початок
LOCATE && или GO TOP
ELSE
* надо ли что-то делать, если текущая запись попала в фильтр, пока знаете только вы
ENDIF



Исправлено 3 раз(а). Последнее : akvvohinc, 16.06.17 02:32
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
akvvohinc

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
ZenTigra
Выражение фильтрации не вычисляется до тех пор, пока не будет перемещен указатель текущей записи.

Эта фраза не означает, что команда фильтрации не начала действовать.
Она всего лишь говорит о том, что текущая запись в фильтруемой таблице не изменится автоматически, даже если она не удовлетворяет условию фильтра.

Но то же самое будет и в том случае, если после наложения фильтра вы переместитесь на запись, не удовлетворяющую условию фильтра, командой GO <recno>, или захотите изменить запись, не попадающую в фильтр, командой REPLACE RECORD <recno> и т.д. и т.п.

То есть, фильтр "ощущается" лишь при работе с диапазоном записей и относительных перемещениях (начало, конец, следующая, предыдущая), но не защищает от абсолютных перемещений и правок.



Исправлено 1 раз(а). Последнее : akvvohinc, 16.06.17 02:29
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Про SET FILTER уже все изложили)
ZenTigra
Есть две таблицы, в них не больше 10 записей, обе они используются в качестве меню. Но отображение записей во второй таблице зависит от выбранной записи в первой таблице. То есть необходимо накладывать фильтр для второй таблицы.
Но есть и другой путь, может и не очень эффективный в данной ситуации, но достаточно стандартный для клиент-сервера.
Вообще, описана типичная ситуация мастер-детали.
И по мастеру, просто делают перевыборку в новый курсор.
И никаких фильтров. (ведь бывает не 10 записей, и миллионы)
Это явно создает свои сложности. Но решив их однажды, этим механизмов можно пользоваться многократно.


------------------
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
...не понял, про GO TOP, который "не оптимизируется". Как понять?
А что тут не понятного то?
CREATE CURSOR tmp (id I, name c(251))
FOR ln1 = 0 TO 4999999
INSERT INTO tmp (id, name) VALUES (m.ln1, STR(100-INT(m.ln1/100000), 10, 0))
ENDFOR
INDEX on LEFT(name, 20) TAG name
SET ORDER TO 0
SET FILTER TO LEFT(name, 20) = STR(60, 10, 0)
lnsec = SECONDS()
GO TOP
? "GO TOP", SECONDS() - m.lnsec, RECNO()
lnsec = SECONDS()
LOCATE
? "LOCATE", SECONDS() - m.lnsec, RECNO()


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Проблема с SET FILTER TO
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
И правда... Так специально в фоксе сделано, что GO TOP не видит индекса при наличии фильтра, подходящего под индекс?

побыстрее чтобы тестировалось:
Доб. Исправил в соотв. с замечанием ниже.



Исправлено 1 раз(а). Последнее : of63, 16.06.17 17:02
Ratings: 0 negative/0 positive
Re: Проблема с SET FILTER TO
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Так будет не совсем корректно, т.к. в этом малом курсоре нет записи с "подходящим" кодом 97 какой надо брать тогда уж для фильтра, или менять генерилку для второго поля...


------------------
WBR, Igor
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика