Список результатов поиска в выпадающем списке - PullRequest
2 голосов
/ 04 августа 2010

Я хочу изменить наш поиск, так как он немного хакерский. В настоящее время это работает так:

  1. Пользователь вводит текст в текстовое поле, например Volvo и начинает поиск.
  2. Этот поиск с помощью SQL всех сообщений, содержащих Volvo.
  3. Результатом является список из 2 столбцов, BoldID и DisplayValue.
  4. BoldID - это просто уникальный номер для идентификации объекта в базе данных.
  5. DisplayValue - это то, что пользователь видит в списке результатов.
  6. Каждая строка в наборе результатов идентифицируется номером строки в списке пользователей. Первый с 1, второй с 2 ​​и т. Д.
  7. Существует также ограничение, позволяющее показывать максимум 99 обращений только по намерению, зацикливая запрос в коде. Нехорошо иметь запрос, который возвращает много обращений, поскольку не имеет смысла иметь больше в списке совпадений пользователей. В этом случае поиск должен быть более конкретным.

Список результатов отображается в отдельном глобальном окне, называемом правой панелью. Хакерская часть заключается в том, что при поиске в модальном диалоговом окне правая панель должна быть отсоединена от главного окна, чтобы можно было выбрать значение с помощью мыши. Мы подозреваем, что это может быть причиной того, что приложение иногда блокируется с помощью модального диалога за главным окном.

После изменения он должен работать так:

Пользователь вводит текст в Combobox и начинает поиск по SQL, как и раньше. Но набор результатов отображается в выпадающем списке. Поэтому я хочу изменить отображение только, если это возможно, так как есть много старых SQL-запросов, которые используются и работают нормально.

Мы используем Delphi 2007, Interbase 2009 и компоненты DevExpress. Вчера я пытался подключить пользовательский источник данных к комбинированному списку, но я понимаю, что это еще не было реализовано. См. Как использовать TcxCustomDataSource в TcxExtLookupComboBox . Я хочу использовать пользовательский источник данных для реализации номера строки и максимального количества попаданий. Se 6 и 7 в списке выше.

Так что теперь я вижу 2 варианта:

  • Используйте комбинированный список с поддержкой БД
  • Используйте текстовое поле и прикрепите к нему сетку для отображения набора результатов.

Поле со списком проще, потому что это целый компонент, но я не знаю, как реализовать функцию 6 и 7 из списка выше. Текстовое поле + сетка дают больше свободы, но требуют больше работы.

Я предпочитаю первый вариант. Текущие проблемы:

  • Я думаю, что Interbase SQL не может ограничить количество попаданий в набор результатов. Это должно быть сделано с кодом. Как это сделать с помощью комбинированного списка с поддержкой БД?
  • Как отобразить номера строк в наборе результатов?

Обновление 1: Требование 7 решено благодаря Марьяну, спасибо. Что касается 6, я думаю, что это сложнее. В идеале я хочу, чтобы это было в SQL, чтобы я мог извлечь собственный столбец, такой как Добавление строки № . Но Interbase этого не поддерживает.

Ответы [ 2 ]

3 голосов
/ 04 августа 2010

Требование 6:

Предполагая, что значение идентификатора базы данных является целым числом, вы можете использовать тег элемента управления или объект строк в поле со списком / списком для хранения значения идентификатора.

[псевдокод]

while not eof do
  ComboBox.Items.AddObject(<DisplayText From Db>, TObject(<IntegerID from Db>));

и используйте его вот так

id := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);

Требование 7:

Использование комбинированного списка / списка со списком с учетом db, проходящего по запросудо 99 или 99 строк.Так что вам нужно полагаться на SQL.Даже если вы не хотите изменять какие-либо текущие операторы SQL, вы можете использовать функцию SQL «TOP», чтобы ограничить количество строк.Например,

SELECT TOP 99 FROM (<your original SQL>)

В Interbase SQL вы можете использовать фразу:

ROWS 1 TO 99 

сразу после предложения порядка (см. Пример в http://blogs.teamb.com/craigstuntz/dtpostname/ibsqlintro/ - почти в нижней частистраница)

...