Большие данные и Lookup-поля

Вопросы стыковки визуальных компонент (DataControls, EhGrid, VirtualTreeView, DevExpress и т.п.) с данными из БД.

Модераторы: kdv, CyberMax

Ответить
Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Большие данные и Lookup-поля

Сообщение Lars » 14 июл 2006, 05:46

Каким образом организовать интерфейс в случае, когда:
1. справочник очень большой - 5000 -10000 записей
2. необходимо из справочника взять значение.
3. использование LOOKUP поля в датасете приводит к торможению - долго открывается справочник.
4. при нажатии кнопки выбора открывается мое окошко выбора чего-либо, значение подставляется в компонент.


хотелось бы КОМПОНЕНТ, который отображает то, что требуется(например наименование чего-либо), а хранит данные о ключевом поле(например, ID). И сохраняет именно ID в связанной таблице.

Кто-нибудь встречался с таким компонентом???

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 июл 2006, 06:09

хотелось бы КОМПОНЕНТ, который отображает то, что требуется(например наименование чего-либо), а хранит данные о ключевом поле(например, ID). И сохраняет именно ID в связанной таблице.
TDBLookupComboBox (TDBLookupComboBoxEh в случае использования EhLib).

По поводу больших справочников - создай соответствующую тему в разделе FAQ - это не проблема визуальных компонент.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 06:26

CyberMax писал(а): TDBLookupComboBox (TDBLookupComboBoxEh в случае использования EhLib).
Для отображения чего-либо необходимо указывать ListSource, что в свою очередь означает открытие вспомогательного запроса. Мне надо без него обойтись.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 июл 2006, 06:31

А как ты получаешь наименования? У тебя жестко заданный список что-ли? И чем тебе вспомогательный запрос не устраивает?

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 06:41

CyberMax писал(а):А как ты получаешь наименования? У тебя жестко заданный список что-ли? И чем тебе вспомогательный запрос не устраивает?
Допустим, есть документы, подлежащие выдачи. Их около 5000-10000(буду увелич.). Необходимо отобразить выданные документы. запрос выглядит вот так:
SELECT DATE, ID_MAINDOC, MAINDOCS.NAME
FROM MAINDOCS
INNER JOIN JOBS ON (MAINDOCS.ID = JOBS.ID_MAINDOC)
Вот так будет правильно: есть код документа и его наименование с датой выдачи. Лишние данные не тягаются с сервере. Компонент (по моему желанию должен хранить в тексте NAME, в FieldName - ID_MAINDOC).

Когда происходит подключение лукап поля, то открывается запрос по ключу ID_MAINDOC, в список (который комбобокс) заполняются значения NAME's и грузятся все 5000-10000. даже при просмотре в гриде будет открытие запроса.

НАДО. Поле с "..." и нажатие на кнопочку (ТОЛЬКО ТОГДА и при необходимости добавления или изменения) открывать полный список документов с возможностью выбора.

фух... много

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 06:46

CyberMax писал(а):И чем тебе вспомогательный запрос не устраивает?
много данных открывается даже при просмотре в гриде. о открывать может и никто не будет запись для редактирования/добавления.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 июл 2006, 06:58

Теперь понял тебя. У меня была такая же проблема. Там, правда, еще одна грабля есть. Надо постоянно открывать весь набор справочника, так как если скрыть ненужные сейчас записи, то при показе старых документов в комбобоксе пустота будет.
Я решил это проблему просто - сделал наследника от TDBCustomEditEh 8). В конструкторе создается кнопочка "...", которая открывает окно с сеткой выбора (естественно, добавлена еще пара свойств). Готовых таких компонент не встречал.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 07:01

CyberMax писал(а): Я решил это проблему просто - сделал наследника от TDBCustomEditEh 8). В конструкторе создается кнопочка "...", которая открывает окно с сеткой выбора (естественно, добавлена еще пара свойств). Готовых таких компонент не встречал.
не жалко поделиться СВОИМ готовым компонентом?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 июл 2006, 07:12

Как такового компонента нет - у меня почти все формы в ран-тайме создаются. Код наследника прост до ужаса:

Код: Выделить всё

  TCMExternalEdit = class(TDBEditEh)
  strict private
    FViewForm: TForm;
    procedure EditClick(Sender: TObject; var Handled: Boolean);
  public
    constructor Create(AOwner: TComponent); override;
    property ViewForm: TForm read FViewForm write FViewForm;
  end;

{ TCMExternalEdit }

constructor TCMExternalEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ShowHint := True;
  ReadOnly := True;

  with EditButtons.Add do
  begin
    Style := ebsEllipsisEh;
    Hint := 'Изменить';
    OnClick := EditClick;
  end;
end;

procedure TCMExternalEdit.EditClick(Sender: TObject; var Handled: Boolean);
begin
  if Assigned(FViewForm) then
    FViewForm.ShowModal;
end;

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 07:16

спасибо

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 07:18

Стоп!
А где сохраняется значение (ID)? Свойства нет?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 июл 2006, 07:28

А где сохраняется значение (ID)? Свойства нет?
Это в компетенции ViewForm. У Edit'а дело маленькое - показать форму выбора значения, когда пользователь этого хочет. Остальное - не ее дело. Поэтому ViewForm - это у тебя специализированный класс формы, который ты линкуешь к набору сетки.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 07:49

CyberMax писал(а): Это в компетенции ViewForm. У Edit'а дело маленькое - показать форму выбора значения, когда пользователь этого хочет. Остальное - не ее дело. Поэтому ViewForm - это у тебя специализированный класс формы, который ты линкуешь к набору сетки.
ясно.
Видишь ли, у меня тоже формы создаются динамически, читаются кол-во полей и формируется форма редактирования данных рекордсета текущей записи.

А как быть,если несколько таких полей. Форма имеет стэк или лист? Вообще все справочники перенести на такую основу. Какой тогда смысл от SQL варианта??? Тягается вся таблица как в старые добрые времена(прошу прощение за отсупление...)

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 июл 2006, 08:11

Lars писал(а):Тягается вся таблица как в старые добрые времена(прошу прощение за отсупление...)
Ты имеешь ввиду таблицы справочников? Ну да. Они вытягиваются один раз при клике на "..." эдита. А что, есть какие-то еще варианты?
А вообще по абзацу распиши поподробнее, что тебе не нравится.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 14 июл 2006, 10:10

CyberMax писал(а):Ты имеешь ввиду таблицы справочников? Ну да. Они вытягиваются один раз при клике на "..." эдита. А что, есть какие-то еще варианты?
А вообще по абзацу распиши поподробнее, что тебе не нравится.
А как быть,если несколько таких полей. Форма имеет стэк или лист? Где она хранит данные ID о каждом таком поле?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 15 июл 2006, 07:08

Lars писал(а):А как быть,если несколько таких полей. Форма имеет стэк или лист? Где она хранит данные ID о каждом таком поле?
Для каждого эдита - свой экземпляр формы. У класса формы соответствующие свойства: FieldNameID и прочее. Точно сказать не могу - сам пока лукапкомбобокс еще не менял (только в планах). Ты же программист, подумай, как будет удобней и правильней с точки зрения архитектуры :).

Ответить