Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.052 c
15-1169034579
stone
2007-01-17 14:49
2007.02.04
Сегодня с утра прям истерика с терактами


15-1167243972
tesseract
2006-12-27 21:26
2007.02.04
ННМП


2-1169119105
Garacio
2007-01-18 14:18
2007.02.04
переключение чтение/запись-чтение для USB


2-1168862862
Ломов
2007-01-15 15:07
2007.02.04
Control "Has no parent window"


15-1168920229
Стаффаж
2007-01-16 07:03
2007.02.04
Какие профессии в Германии самые выгодные





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский