:: Visual Foxpro, Foxpro for DOS
SET FILTER
Каратаев
Автор

Сообщений: 3931
Откуда: Алматы
Дата регистрации: 04.12.2001
Туплю на ровном месте. Есть таблица stov, в которой имеется поле kod_par. Есть курсор cur_nosert, в котором тоже есть поле kod_par.
Мне надо навесить на таблицу фильтр по полю kod_par имеющемуся в курсоре. Именно фильтр, а не выборку сделать.
Конструкция типа
SELECT stov
SET FILTER TO kod_par IN (SELECT kod_par FROM cur_nosert)
понятно, что не проходит.
И вот что-то затупил, как такой фильтр навесить?


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: SET FILTER
PaulWist

Сообщений: 14501
Дата регистрации: 01.04.2004
Добавь в stov доп. поле в котором будет признак наличия в курсоре cur_nosert, по этому полю фильтр.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: SET FILTER
Каратаев
Автор

Сообщений: 3931
Откуда: Алматы
Дата регистрации: 04.12.2001
Спасибо, Паша... Я думал о подобном варианте, но хотелось бы как-то налету, без модификации таблицы. Если ничего другого в голову не придёт, то буду этим способом изворачиваться...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: SET FILTER
PaulWist

Сообщений: 14501
Дата регистрации: 01.04.2004
Попробуй indexseek() возможно сработает, но думаю, что нет.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: SET FILTER
akvvohinc

Сообщений: 4001
Откуда: Москва
Дата регистрации: 11.11.2008
Каратаев
Мне надо навесить на таблицу фильтр по полю kod_par имеющемуся в курсоре.
1) либо в выражении SET FILTER использовать SEEK() / INDEXSEEK() / KEYMATCH()
2) либо установить SET RELATION с курсором, а в выражении SET FILTER проверять на NOT EOF(<курсор>)
Ratings: 0 negative/1 positive
Re: SET FILTER
Владимир Максимов

Сообщений: 14063
Откуда: Москва
Дата регистрации: 02.09.2000
Если количество строк в курсоре относительно небольшое, то можно еще через массивы организовать

public gaKod_par(1)
select distinct kod_par FROM cur_nosert INTO ARRAY gaKod_par
SELECT stov
SET FILTER TO ascan(gaKod_par, kod_par) > 0

Но в этом случае надо будет тщательно следить за областью видимости этого массива. Чтобы он был виден из фильтра. Если глобальный - вовремя удалять

И еще, если в результате выборки нет данных (нет записей в cur_nosert), то и массив создан не будет. Поэтому определять массив в таких случаях надо явным образом до команды Select-SQL
Ratings: 0 negative/0 positive
Re: SET FILTER
of63

Сообщений: 24629
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
()
Если первый селект рядом (в одной процедуре) с вторым, то достаточно не "PUBLIC gaKod_par(1)", а PRIVATE...
Если в результате первой выборки "нет данных" (и массив "пуст", хотя в фоксе - это условное понятие - переменная-масси определена, размер-то есть =1), то надо придумать условность, что бы отличить массив из одного элемента от массива без элементов, например, если ISNULL(gaKod_par) - то в массиве нет элементов. Но об этом надо позаботиться, например, если после первой выборки _TALLY=0, то STORE .NULL. TO gaKod_par...
Ratings: 1 negative/0 positive
Re: SET FILTER
akvvohinc

Сообщений: 4001
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Но в этом случае надо будет тщательно следить за областью видимости этого массива.
"Видимость" в случае чего просто свалит программу, и ошибка будет исправлена.
А вот то, что такой способ перестанет правильно работать при изменении курсора, на мой взгляд, важнее, так как программа внешне будет продолжать нормально работать, но фильтр перестанет отражать реальность. Заметить такое не всегда просто.
В общем, этот массив будет требовать обновления при каждой операции с курсором, затрагивающей ключевое поле. И об этом действительно придется постоянно помнить.

Я бы не стал без особой нужды пользоваться таким способом.
Ну, только если по каким-то причинам курсор не может быть проиндексирован по нужному полю.
Ratings: 0 negative/0 positive
Re: SET FILTER
Каратаев
Автор

Сообщений: 3931
Откуда: Алматы
Дата регистрации: 04.12.2001
Владимир Максимов
Если количество строк в курсоре относительно небольшое, то можно еще через массивы организовать
Спасибо, Владимир. Возьму на заметку такой способ. Но в данном случае, в курсоре несколько тысяч записей... Наверное тут через массив нецелесообразно...
PaulWist
Попробуй indexseek() возможно сработает, но думаю, что нет.
akvvohinc
1) либо в выражении SET FILTER использовать SEEK() / INDEXSEEK() / KEYMATCH()
Признаюсь честно - я даже и не подумал о таком способе. Но вот именно это замечательно и сработало.
SELECT stov
SET filter TO INDEXSEEK(stov.kod_par,.F.,"cur_nosert")
GO TOP
Естественно, что курсор предварительно проиндексирован по этому полю.
Спасибо всем за помощь!


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/1 positive


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

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

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