Форум: "Базы";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Внизфильтруемый 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c