Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Фильтрация данных / 12 сообщений из 12, страница 1 из 1
11.01.2009, 23:45
    #35751572
XoTaBbI4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
Имеется 3 таблицы: Ответсвенное_лицо(с полями Код_отв_лица, ФИО....), Оборудование(Код_оборуд, Код_отв_лица, номер_кабинета,.... ), Кабинеты (номер_кабинета, код_отв_лица,...).
На форме (frm_kab) имеется следующее: Combo1 (данные берутся из таблицы Ответсвенное_лицо по полю ФИО), Combo2 (данные берутся из таблицы Кабинеты по полю номер_кабинета), grdOborudovanie(грид по таблице оборудование)

Combo1.click()
thisform.Refresh
SELECT kabinet
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica
SELECT oborudovanie
thisform.combo1.SetFocus
thisform.combo2.SetFocus
thisform.grdOborudovanie.SetFocus
thisform.grdOborudovanie.Refresh
thisform.Refresh

Combo2.click()
SELECT oborudovanie
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica AND nom_kab = kabinet.nom_kab
thisform.Refresh
thisform.grdOborudovanie.SetFocus

frm_kab.Activate()
thisform.Refresh
CLEAR MEMORY
SELECT oborudovanie
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica AND nom_kab = kabinet.nom_kab
GO TOP
SELECT otv_lico
thisform.combo1.SetFocus
thisform.combo2.SetFocus

Смысл работы такой: При выборе ФИО из Combo1 записи должны отфильтроваться в Combo2 и в гриде(grdOborudovanie), и при выборе Номера_кабинета из Combo2 записи должны отфильтроваться в гриде(grdOborudovanie), но этого почему-то не происходит. Может быть кто-нибудь подскажет где ошибка?
...
Рейтинг: 0 / 0
12.01.2009, 09:01
    #35751775
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
При изменении источника комбо - наложение нового фильтра это тоже изменение источника - необходимо делать комбо Requery а не Refresh
...
Рейтинг: 0 / 0
12.01.2009, 14:35
    #35752649
XoTaBbI4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
Burn, все равно не работает.
...
Рейтинг: 0 / 0
12.01.2009, 18:46
    #35753322
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
SET FILTER вступает в силу, только после перемещения указателя записи (или после попытки перемещения). Это значит, что после команды SET FILTER надо дать команду GO TOP

Кроме того, событие Click() - это не есть выбор. Точнее, не есть завершение выбора. Это просто щелкнули по ComboBox. Факт завершения выбора следует проверять в событии ComboBox.Valid()

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
* Combo1.valid()

SELECT kabinet
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica
GO TOP

ThisForm.Combo2.ListIndex =  1 
ThisForm.Combo2.Refresh()
ThisForm.Combo2.Valid()

* Combo2.valid()
SELECT oborudovanie
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica AND nom_kab = kabinet.nom_kab
GO TOP

thisform.grdOborudovanie.SetFocus()

В данном случае, выполняется "каскад" модификаций. При выборе элемента Combo1 изменяется только и исключительно значение в Combo2 и вызывается метод, обрабатывающий изменения в Combo2. А вот уже Combo2 накладывает фильтр на Grid.

Если источником данных ComboBox является таблица или поля таблицы, то при наложении фильтра вызывать ComboBox.Requery() не надо.

Метод Refresh() вызывается только в том случае, если значение объекта изменяется из-вне самого объекта.

Что-то делать в событии Activate() особого смысла не имеет, поскольку событие Activate() может выполняться многкратно за время существования формы. Переключились на другую форму, затем вернулись в эту и снова сработает Activate()

Если стоит задача инициализации значений при открытии формы, то это делается в событии Init() формы. Примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
* frm_kab.Init()

select otv_lico
GO TOP

select kabinet
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica
GO TOP

SELECT oborudovanie
SET FILTER TO Kod_otv_lica = otv_lico.kod_otv_lica AND nom_kab = kabinet.nom_kab
GO TOP

Обратите внимание, что никаких SetFocus() и Refresh() в событии Init() давать не следует. Это может привести к не предсказуемому поведению формы.

Именно поэтому, здесь и не делается вызов Combo.Valid(), как хотелось бы. Поскольку внутри Valid() - методов идет явный вызов методов SetFocus() и Refresh().
...
Рейтинг: 0 / 0
13.01.2009, 23:36
    #35756168
XoTaBbI4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
ВладимирМ, Спасибо огромное за столь понятное объяснение. Записи фильтруются, но не вполной мере, т.е. показывает(в гриде) не все то, что должно по сути. Да и выводится ошибка(приложено изображение), на срочке thisform.grdOborudovanie.SetFocus(). Пробовал убирал, тогда вообще фильтрация не происходит...
Если Вам не трудно объясните пожалуйста. Спасибо Заранее!
...
Рейтинг: 0 / 0
14.01.2009, 09:00
    #35756381
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
В сообщении об ошибке ясно сказано - нельзя делать SetFocus из методов When, Valid и длее по списку. Если необходимо то перенисите его в LostFocus или GetFocus
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.02.2010, 14:32
    #36482035
curys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
Здраствуйте.

Подскажите как мне лучше поступить, в данном случае, у меня имеется два комбо, в одном находятся регионы городов, а в другом города этих регионов.
Вопрос в следующем, как мне правильно составить таблицу городов, чтобы при выборе региона в 1 комбо во втором комбо был список городов этого региона(дело в том, что у меня 90 регионов и где-то 1100 городов этих регионов) Как мне лучше сделать?
...
Рейтинг: 0 / 0
21.02.2010, 19:11
    #36482270
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
curys,

Начните новый топик со своим вопросом
...
Рейтинг: 0 / 0
21.02.2010, 20:02
    #36482312
curys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
igorbik,

это все из одной оперы:)

Я сделал 2 таблицы region с полями idreg, region и goroda с полями idgorod, gorod, idreg
Исходя из выше изложеного я сделал следующее:

в 1 комбо.valid

SELECT region
SET FILTER TO idreg = region.idreg
GO TOP

ThisForm.Combo2.ListIndex = 1
ThisForm.Combo2.Refresh()
ThisForm.Combo2.Valid()

вo 2 комбо.valid

SELECT gorod
SET FILTER TO idreg = region.idreg AND idreg = gorod.idreg
GO TOP

Дело в том что при выборе в 1 комбо любого региона, список 2 комбо всегда остается одним и темже! Что у меня не правильно?
...
Рейтинг: 0 / 0
21.02.2010, 21:11
    #36482366
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
авторЯ сделал 2 таблицы region с полями idreg, region и goroda с полями idgorod, gorod, idreg
<...>
SELECT gorod
SET FILTER TO idreg = region.idreg AND idreg = gorod.idreg
GO TOP
Выделенное стоит убрать. Удивлён, что у вас во втором комбобоксе вообще что-то отображается (наверное, "повезло" с совпадением ид-ов).
...
Рейтинг: 0 / 0
21.02.2010, 22:16
    #36482408
curys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
tanglir,

все сделал как вы написали, а резельтата никокого:(

посмотрите тестовый проектик, может я что в настройках комбо неправльно делаю
...
Рейтинг: 0 / 0
23.02.2010, 21:10
    #36484865
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация данных
--SET FILTER вступает в силу, только после перемещения указателя записи (или после попытки перемещения). Это значит, что после команды SET FILTER надо дать команду GO TOP

я просто хочу добавить что
есть не документированная фича еще с фпд
вместо GO TOP можно написать locate
и если фильтр тяжелый - то отработает гораздо быстрей

зы а ваще лучше set key - хотя оно имеет ограничение -
но самая быстрая команда была в fpd да и в vfp тоже быстро - просто там есть и другие
варианты


зы SET FILTER TO idreg = region.idreg AND idreg = gorod.idreg
не люблю таких фильтров - предпочитал формировать строку
а потом
Usl = 'idreg =' + Alltr(str(region.idreg)) + ' AND idreg = ' + gorod.idreg

SET FILTER TO &Usl
но это дело вкуса
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Фильтрация данных / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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