Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Механизмы поиска в наборах данных, полученных по запросу






 

Индексные механизмы поиска не работают в наборах записей, полученных с помощью запроса к нескольким таблицам базы данных. В этом случае для поиска нужной записи используется метод Locate, который не требует в своей работе наличия индекса, что сказывается при поиске в больших массивах данных. Данных метод применим и в случае набора данных на основе компонента Table, но менее эффективен. Метод имеет следующий заголовок:

 

bool __fastcall Locate(const System:: AnsiString KeyFields,

const System:: Variant & KeyValues,

TLocateOptions Options);

 

Рассмотрим предыдущий пример в более общей ситуации, когда требуется вся, имеющаяся в базе данных информация о студентах. При этом, фамилия студента и год поступления хранятся в таблице Students; название группы - в таблице Groups, а наименование специальности - в таблице Spec. Собрать воедино всю эту информацию можно с помощью следующего запроса:

 

SELECT Students.Fio, Groups.GroupName, Spec.SpecName, Students.Year

FROM Spec INNER JOIN (Groups INNER JOIN Students ON Groups.n = Students.Id_Gr) ON Spec.n = Groups.Id_Sp

ORDER BY Students.Fio

 

Будем отображать эту информацию не как ранее в компоненте DBGrid, а в нескольких компонентах DBEdit:

 

 

Рисунок 11. Форма с четырьмя компонентами DBEdit для отображения информации о студентах

 

Кроме указанных компонентов визуализации на форме помещены компонент запроса Query1, источник данных (для визуальных компонентов DataSource1), обычное поле ввода Edit1 и пять меток (компоненты Label).

Предполагается, что приложение будет работать следующим образом: при вводе букв в компонент Edit1 последовательно (после ввода каждой буквы) производится поиск, и указатель перемещается на первую запись, со значением поля Fio наиболее близкую к значению, введенному в компонент Edit1. Следует отметить, что метод Locate может осуществлять поиск в режиме как полного, так и частичного совпадения. Режим определяется третьим параметром, имеющим тип TLocateOptions. Данный тип представляет класс, для которого переопределен оператор «< <», который обычно используется для вывода данных на экран. Если в этот аргумент ввести значение loPartialKey, то поиск будет производиться по частичному совпадению (что используется далее).

Обработчик события имеет следующий вид:

 

void __fastcall TForm1:: Edit1Change(TObject *Sender)

{

TLocateOptions LO;

Query1-> Locate(" Fio", Edit1-> Text, LO< < loPartialKey< < loCaseInsensitive);

}

 

Обработчик события onChange компонента Edit1 предельно прост:

1. в первой строке объявляется локальная переменная LO типа TLocateOptions, которая будет определять условия поиска (частичное совпадение и отсутствие чувствительности к регистру букв);

2. во второй строке метод Locate компонента Query1 вызывается для поиска записи (первый аргумент задает поле, по которому осуществляется поиск; второй аргумент задает значение поиска; а в третьем определяются условия поиска).

На рисунке 12 показана форма сразу после открытия:

 

 

Рисунок 12. Форма поиска информации о студентах сразу после открытия

 

Сразу после открытия в визуальных компонентах DBEdit отображаются поля первой записи запроса, упорядоченного по полю Fio (в директиве ORDER BY указано именно это поле таблицы Students). Фокус ввода находится в компоненте Edit1, таким образом, форма готова к получению данных для поиска записи.

На рисунке 13 показана форма после ввода первого символа «П» (именно эта буква введена в компонент Edit1). Обработчик onChange компонента Edit1 уже один раз сработал, произведя частичный поиск, и указатель записи находится в позиции, поля которой отображаются в компонентах DBEdit. Компонент Edit1 готов к вводу следующей буквы.

 

 

Рисунок 13. Форма после первой операции поиска

 

Ввод второй буквы «е» заканчивает поиск (это следует из того, что ввод следующих букв не перемещает указатель записи). Пользователь сам при этом должен решить: нашел он нужную ему запись или нет. В последнем случае поиск можно начать заново, вводя другие буквы в компонент Edit1.

 

 

Рисунок 14. Форма после окончания поиска

 

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

 

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал