Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

фильтруемый lookup-список   Найти похожие ветки 

 
multiplier   (2006-11-11 17:54) [0]

Есть у меня cxGrid, есть в нем lookup-поле, связанное с запросом. Но для каждой записи нужно ограничить выбор в lookup-списке лишь несколькими значениями из запроса. Какие именно значения должны выбираться – определяется по значению столбца ID в строке.

Т.е. например, запрос возвращает набор значений:
"ВАЗ", "ГАЗ", "Ауди", "Ниссан", "Рено", "Хонда", "Тойота".

Для записи с ID=1 lookup-список должен содержать, например, только
"ГАЗ", "Ауди", "Хонда".

Для записи с ID=2:
"ВАЗ", "ГАЗ", "Ниссан", "Хонда"

и т.д.

Такую фишку почти удалось сделать путем определения параметрического запроса и передачи значения ID в качестве параметра в событии Properties.OnInitPopup

Но возникла такая проблема, что если например, я выберу сначала для записи с ID=1 "Ауди", а потом что-нибудь выберу для записи с ID=2 (для которой "Ауди" выбрать нельзя), то из первой строки значение "Ауди" исчезнет.

Вот как бы такую проблему решить? (Не поверю, что в навороченном cxGrid"е это невозможно :) )


 
Sam Stone ©   (2006-11-11 19:22) [1]

фильтр включай, только перед выпадением списка.


 
Johnmen ©   (2006-11-11 23:09) [2]

Надо включить кеширование лукапного поля.


 
Stanislav ©   (2006-11-13 09:04) [3]

То же только с ehlib.
http://delphimaster.net/view/3-1162984122/


 
Johnmen ©   (2006-11-13 09:52) [4]

Что лишний раз подтверждает, что дело не в гридах там всяких...


 
multiplier   (2006-11-13 18:25) [5]

установка фильтра для датасета не помогает - значения так же пропадают


> Надо включить кеширование лукапного поля.

как включить кэширование?

А вообще то, чего я хочу добиться, реализуемо?


 
Sam Stone ©   (2006-11-13 21:04) [6]

> А вообще то, чего я хочу добиться, реализуемо?

реализуемо. У меня подобное недавно было - решил предложенным мной способом: перед разворачиванием списка, если надо было, включал фильтр, выбирал из ограниченного списка значение, убирал фильтр. Все работало прекрасно.


 
Johnmen ©   (2006-11-13 22:08) [7]


> А вообще то, чего я хочу добиться, реализуемо?


Об этом сказано в [2].


> как включить кэширование?


LookupCache:=True;


 
multiplier   (2006-11-13 23:25) [8]


> LookupCache:=True;


это свойство чего? у меня cxGrid, там вроде нет TField


 
Johnmen ©   (2006-11-13 23:35) [9]


> это свойство чего? у меня cxGrid, там вроде нет TField


Ещё раз - причём тут вообще какой-либо грид???
См. [4]
Также подумай на тему "А что же показывает грид? Откуда он это берёт?"


 
multiplier   (2006-11-14 00:13) [10]


> у меня cxGrid, там вроде нет TField


OK, это я глупость сказал :)

Ставил я LookupCache в True и фильтр ставил в событии OnPopup, и снимал его в событии OnCloseUp. А все равно именно в момент когда комбобокс показывается на экране, в части строк поле становится пустым.


 
Johnmen ©   (2006-11-14 09:35) [11]

Набор данных, по которому строится лукапное поле, получен в отсутствии фильтра?


 
multiplier   (2006-11-14 12:32) [12]

Лукапное поле связано с нефильтрованным ADOQuery

В событии Properties.OnPopup ставлю фильтр

ADOQuery1.Close;
ADOQuery1.Filtered := true;
ADOQuery1.Filter := "id = " + id;
ADOQuery1.Open;


В событии Properties.OnCloseUp снимаю фильтр

ADOQuery1.Close;
ADOQuery1.Filter := "";
ADOQuery1.Filtered := false;
ADOQuery1.Open;


 
Johnmen ©   (2006-11-14 12:44) [13]


> В событии Properties.OnPopup ставлю фильтр


Что за событие? Чьё? Когда наступает?


 
multiplier   (2006-11-14 13:06) [14]

У столбца cxGrid"а есть свойство Properties, в котором устанавливается класс редактора полей в этом столбце. Для столбца, где нужен лукап, задаю LookupComboBox, вот у него есть событие OnPopup, наступающее при раскрытии выпадающего списка, и событие OnCloseUp, наступающее при закрытии этого спсика


 
ЮЮ ©   (2006-11-14 13:11) [15]

Кстати, для фильтрации разве надо переоткрывать запрос? Может из-за этого LookupCache и накрывается?


 
Johnmen ©   (2006-11-14 13:40) [16]

В общем, понятно. Не додумали авторы грида по поводу своей лукапной фичи...
Забей на это. Сделай нормальное настоящее лукап поле в наборе данных. Фильтр ставь, когда в гриде переходят к колонке, отображающей это самое поле.


 
multiplier   (2006-11-14 20:28) [17]

Блин, меня этот лукап уже с ума сводит.

Делаю, как сказано выше.

Создаю ADOQuery как источник лукапных значений. Создаю датасет для грида, делаю в нем лукапное поле, связанное с ADOQuery. Создаю столбцы в гриде и для столбца с лукапными значениями в событии OnGetPropertiesForEdit пишу код:


ADOQuery1.Filter := "ID = " + IntToStr(id);
ADOQuery1.Filtered := true;


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

Дальше – делаю все то же самое, но датасет, датасоурс и квери на этот раз создаю на отдельном DataModule, где у меня все пободные объекты расположены. Код для столбца естественно изменяется на


DModule.ADOQuery1.Filter := "ID = " + IntToStr(id);
DModule.ADOQuery1.Filtered := true;


Ничего не фильтруется. Писец. Я в шоке.

PS Скажите, это я так жестоко торможу, или Delphi надо мной издевается?


 
sniknik ©   (2006-11-14 20:51) [18]

ЮЮ ©   (14.11.06 13:11) [15]
> Кстати, для фильтрации разве надо переоткрывать запрос?
нет конечно, фильтр действует на локальном рекордсете уже выбранном на клиента.
> Может из-за этого LookupCache и накрывается?
вполне.

multiplier   (14.11.06 20:28) [17]
> PS Скажите, это я так жестоко торможу, или Delphi надо мной издевается?
и то и другое, похоже... начал с того что вообще используешь ADOQuery (сделан похоже исключительно для издевательств, как ADOTable для вредительства), а не ADODataSet, ну а отсюда уже и логика исковеркалась... фильтром условие запроса устанавливаешь.  

попробуй сделай полную выборку (все что понадобится), а после отфильтровывай нужное  для конкретного (без пере открытий!), ну и смени ADOQuery на ADODataSet конечно.


 
ЮЮ ©   (2006-11-15 03:52) [19]

Код для столбца естественно изменяется на
DModule.


Кроме кода есть ещё и св-ва компонентов. Фильтруешь в коде один НД, а в компоненте видишь другой - не фильтрованный.


 
multiplier   (2006-11-15 08:07) [20]

Все, у меня наконец-то все заработало :)
Большое всем спасибо за то, что так долго и терпеливо мне объясняли



Страницы: 1 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.463 c
15-1169022430
shikitomedo2
2007-01-17 11:27
2007.02.04
Как распознать на собеседовании неадекватного работодателя?


6-1157020830
РВА
2006-08-31 14:40
2007.02.04
Добавить клиента


15-1168702458
Footballer
2007-01-13 18:34
2007.02.04
Для тех, кто разбирается в cs 1.6


2-1168863421
Есипенко
2007-01-15 15:17
2007.02.04
Определить оператор слово или нет


15-1168405419
Steep
2007-01-10 08:03
2007.02.04
Какими компонентами, библиотеками вы пользетесь