Очень часто ипользуется выбор значения из справочника с помощью ComboBox, но инкрементный поиск позволяет перейти к нужному значению по первой букве или буквам. Я хочу предложить другое решение поиск по любому сочетанию букв по первым, по вхождению с выводом списка удовлетворяющих значений в выпадающем списке.
Идею по созданию данного класса подсказал Internet Explorer.При наборе адреса
сайта Explorer выдает список совпадающий по первым с вводимым адресом. Идея
была хорошая и решил я ее применить в своих проектах для выбора значений из
справочников.
И вот просмотрев всю документацию по Combobox я создал данный класс.
Для его использования необходимо определить следующие свойства:
IncrementalSearch - определяет возможность поиска (.T. - поиск разрешен, .F. -
поиск запрещен)
RowSource - определяет источник данных. Источником данных всегда является SQl
команда которая выбирает значения для выбора их из Combo.
cNmTexAlias - определяет наименование курсора в которое выбираются данные с
помощью SQL-Select'а, чтобы при закрытии Destroy объекта закрыть
открытый в данный момент курсор (т.е. убираем мусор за собой)
сSrchRowSource - данное свойство управляет поиском, здесь и можно определить
как искать введенное выражение по первым буквам или любое
совпадение символов. Поиск построен с использованием LIKE
SELECT-SQL поэтому действуют все правила для LIKE.
Примеры значений свойств:
1. Поиск по первым символам
RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR
TexSrch"
сSrchRowSource="THIS.cOldRowSource+' WHERE UPPER(name) LIKE ['+;
UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;
THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"
cNmTexAlias="TexSrch"
2. Любое совпадение символов
RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR
TexSrch"
сSrchRowSource="THIS.cOldRowSource+' WHERE UPPER(name) LIKE [%'+;
UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;
THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"
cNmTexAlias="TexSrch"
3. Выбор значений из основной таблицы по определенным условиям.
RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR
TexSrch WHERE Group="1""
сSrchRowSource="THIS.cOldRowSource+' AND UPPER(name) LIKE [%'+;
UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;
THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"
cNmTexAlias="TexSrch"
** Следует обратить внимание что WHERE располагается в конце SELECT-SQL, а
всвойстве WHERE заменяется на AND. Будьте внимательны, т.к. используется в
коде макроподстановка.
P.S. И еще одно замечание, если необходимо из основной таблицы выбирать больше
полей то в свойство cSrchRowSource необходимо указать CHR(0) или другое
выражение чтобы правильно работал UNION.
Ну и последнее обязательно определяйте ORDER BY по отдельной строке иначе
введенное поисковое выражение не будет располагаться в верхней строке.
Все замечания, пожелания и вопросы присылайте на E-mail.
Немного изменил под себя, но в целом мне понравилось решение, простое и удобное.
Спасибо.
Kaiser
13.04.06 15:27:15
Немного изменил под себя, но в целом мне понравилось решение, простое и удобное.
Спасибо.
Kaiser
13.04.06 15:27:26
Немного изменил под себя, но в целом мне понравилось решение, простое и удобное.
Спасибо.
serjo123
15.06.06 16:45:50
Изумительная штука, действительно то что надо, без лишних контролов и т.п. Большое спасибо автору,
решение выручило в минуту когда действительно было срочно надо а своё писать нет времени.
Для большего удобства в классе cbosearch метод KeyPress вынес в отдельный новый метод
NewKeyPress, а в KeyPress вызов NewKeyPress, дабы если понадобится добавить что-то своё конкретное
для текущего объекта, то переопределённый метод уже не вызовется, а вынесев это сделать можно ИМХО
Автору творческих успехов и удачи по жизни :-)
serjo123
16.06.06 15:28:56
Изумительная штука, действительно то что надо, без лишних контролов и т.п. Большое спасибо автору,
решение выручило в минуту когда действительно было срочно надо а своё писать нет времени.
Для большего удобства в классе cbosearch метод KeyPress вынес в отдельный новый метод
NewKeyPress, а в KeyPress вызов NewKeyPress, дабы если понадобится добавить что-то своё конкретное
для текущего объекта, то переопределённый метод уже не вызовется, а вынесев это сделать можно ИМХО
Автору творческих успехов и удачи по жизни :-)
serjo123
16.06.06 15:29:05
Изумительная штука, действительно то что надо, без лишних контролов и т.п. Большое спасибо автору,
решение выручило в минуту когда действительно было срочно надо а своё писать нет времени.
Для большего удобства в классе cbosearch метод KeyPress вынес в отдельный новый метод
NewKeyPress, а в KeyPress вызов NewKeyPress, дабы если понадобится добавить что-то своё конкретное
для текущего объекта, то переопределённый метод уже не вызовется, а вынесев это сделать можно ИМХО
Автору творческих успехов и удачи по жизни :-)