Выпадающий список для Master-Detail...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Выпадающий список для Master-Detail...

Сообщение Роман1971 » 05.10.2007 15:02:28

Задача: на форме TDBGrid в нём отражаются данные.
Вопрос: как сделать фильтр в виде выпадающих списков.
    1. Компонент DBGrid с построением Master-Detail справляется хорошо, но он занимает много места.
    2. Компонент типа TDBComboBox подошёл бы идеально, но у него список не из источника данных формируется... Просто делать DBComboBox.Items.Append... не годиться, так как в базе может быть несколько десятков или сотен тысяч записей для фильтра и я не уверен, что это всё влезет в память... :-(
    3. Проблема в том, что TRxLookUp компоненты редактируют данные в DataSource, а мне нужно только выбрать данные из выпадающего списка и использовать их в качестве значений для sql-переменных. Если DataSource не указать, то TRxLookUp выдаёт ошибку.

Нужен просто выпадающий список, который формировался бы на основе запроса данных(DataSource) и был неограничен по длине, а выбранное значение можно было бы использовать по своему усмотрению(или изымать его из DataSource.FieldByName например, и т.п.)
Может я не там смотрю и это делается очень просто? :-)
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Сообщение alexs » 05.10.2007 15:16:59

Иди по 3-му пути
положи на форму RxMemDataSet - в нём создай одно фиктивное поле - для хранения значения которые оператор выберет через RxLookup - и назначь это поле в DataField у RxLookup

при создании формы сделай
RxMemDataSet.Open;
RxMemDataSet.Append;

можеш также, если нужно, проинициальзировать это поле начальным значением
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Выпадающий список для Master-Detail...

Сообщение Сергей Смирнов » 05.10.2007 15:26:01

Роман1971 писал(а):...Если DataSource не указать, то TRxLookUp выдаёт ошибку...
ИМХО, поведение TRxLookUp надо бы скорректировать.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение Сергей Смирнов » 05.10.2007 15:30:11

Можно ещё пойти классическим путём: заполнять комбобокс вручную, помещая в качестве элементов списка наименования из запроса, а в качестве объектов указывая коды этих наименований.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение Роман1971 » 05.10.2007 15:40:55

Сергей Смирнов писал(а):Можно ещё пойти классическим путём: заполнять комбобокс вручную, помещая в качестве элементов списка наименования из запроса, а в качестве объектов указывая коды этих наименований.

Оно конечно можно, но выборка в худшем случае может составить до 600000 записей... :-( и не факт, что связанный список сможет разместиться в памяти.
Лучше третий вариант.
Поведение компонента действительно лучше скорректировать. Кстати, в Delphi тоже какие-то глюки в этом случае, но ошибку правда не выдаёт.

Всем спасибо за советы... :-)
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Сообщение Сергей Смирнов » 05.10.2007 15:55:10

ИМХО, 600000 записей выведут из равновесия практически любой компонент. Разве что кроме VirtualTreeView.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение alexs » 05.10.2007 16:08:01

Роман1971 писал(а):Оно конечно можно, но выборка в худшем случае может составить до 600000 записей...

ТЫ ЧТО ЗАСТАВЛЯЕШ ОПЕРАТОРА ИСКАТЬ В ВЫПАДАЮЩЕМ СПИСКЕ ТАКОЕ КОЛ-ВО ЗАПИСЕЙ? :shock:
они тебя не растерзали за это?
в таких списках наиболее оптимально держать максимум до 50 записей
и то этом ноговато - если болеше - надо переделывать систему поиска.

Вобще по рекомендациям к созданию интерфесов всякие ComboBox-ы (а RxLockup - это просто частный случай) лучше не использовать - оптимальнее давать операторы видеть выбор сразу - в списках, поэтому, также, по вомзможности советуют использовать вместо CheckBox-ов RadioButton-ы.

А насчёт дописывания RxLockup - чтобы он работал без временного поля их RxMemTable - у меня есть это в планах - когда нить сделаю.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Роман1971 » 05.10.2007 16:12:18

Сергей Смирнов писал(а):ИМХО, 600000 записей выведут из равновесия практически любой компонент. Разве что кроме VirtualTreeView.

Ну не скажи... :-)
TDBGrid чувствует себя прекрасно при любом количестве записей, хоть 600 млрд. :-) , так как данные в DataSource кэшируются в "курсоре".
TDBGrid читает именно курсор, и по мере необходимости данные обновляются, а вот обычный TStringList такого конечно не умеет... :-(
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Сообщение alexs » 05.10.2007 17:18:27

Роман1971 писал(а):так как данные в DataSource кэшируются в "курсоре"

а ты не задумывался как кэш курсора сделан для запросов (для DBF там проще)? ведь всё равгно память отъедается, а если в запросе на выборку справочника вместо спика полей вставят *, а спровчник сложный?
вобще мрак. Формы с такими справочниками открываются минут по 20.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Роман1971 » 05.10.2007 19:13:57

Записей не должно быть много, но это заранее не гарантировано...
Т.е. их может быть 2-3, а может и 200-300 - достаточно большое количество... 600 000 - это конечно крайность... возможна только при отладке...
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Сообщение Attid » 05.10.2007 19:19:58

Роман1971
заполнять запросом select first 10 ***
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

Рейтинг@Mail.ru