|
Фильтрация данных
|
|||
---|---|---|---|
#18+
Имеется 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), но этого почему-то не происходит. Может быть кто-нибудь подскажет где ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2009, 23:45 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
При изменении источника комбо - наложение нового фильтра это тоже изменение источника - необходимо делать комбо Requery а не Refresh ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2009, 09:01 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
Burn, все равно не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2009, 14:35 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
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 изменяется только и исключительно значение в 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.
Обратите внимание, что никаких SetFocus() и Refresh() в событии Init() давать не следует. Это может привести к не предсказуемому поведению формы. Именно поэтому, здесь и не делается вызов Combo.Valid(), как хотелось бы. Поскольку внутри Valid() - методов идет явный вызов методов SetFocus() и Refresh(). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2009, 18:46 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
ВладимирМ, Спасибо огромное за столь понятное объяснение. Записи фильтруются, но не вполной мере, т.е. показывает(в гриде) не все то, что должно по сути. Да и выводится ошибка(приложено изображение), на срочке thisform.grdOborudovanie.SetFocus(). Пробовал убирал, тогда вообще фильтрация не происходит... Если Вам не трудно объясните пожалуйста. Спасибо Заранее! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2009, 23:36 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
В сообщении об ошибке ясно сказано - нельзя делать SetFocus из методов When, Valid и длее по списку. Если необходимо то перенисите его в LostFocus или GetFocus ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2009, 09:00 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
Здраствуйте. Подскажите как мне лучше поступить, в данном случае, у меня имеется два комбо, в одном находятся регионы городов, а в другом города этих регионов. Вопрос в следующем, как мне правильно составить таблицу городов, чтобы при выборе региона в 1 комбо во втором комбо был список городов этого региона(дело в том, что у меня 90 регионов и где-то 1100 городов этих регионов) Как мне лучше сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2010, 14:32 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
curys, Начните новый топик со своим вопросом ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2010, 19:11 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
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 комбо всегда остается одним и темже! Что у меня не правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2010, 20:02 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
авторЯ сделал 2 таблицы region с полями idreg, region и goroda с полями idgorod, gorod, idreg <...> SELECT gorod SET FILTER TO idreg = region.idreg AND idreg = gorod.idreg GO TOP Выделенное стоит убрать. Удивлён, что у вас во втором комбобоксе вообще что-то отображается (наверное, "повезло" с совпадением ид-ов). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2010, 21:11 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
tanglir, все сделал как вы написали, а резельтата никокого:( посмотрите тестовый проектик, может я что в настройках комбо неправльно делаю ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2010, 22:16 |
|
Фильтрация данных
|
|||
---|---|---|---|
#18+
--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 но это дело вкуса ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 21:10 |
|
|
start [/forum/topic.php?fid=41&msg=36482270&tid=1585572]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 343ms |
total: | 456ms |
0 / 0 |