Студопедия

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

Разделы сайта

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






Фильтрация записей запроса к базе данных






 

В современных информационных системах часто приходится делать к базе данных запросы сложной структуры, когда сортировка сочетается с вертикальной и горизонтальной фильтрацией, а данные хранятся сразу в нескольких реляционных таблицах. В таких случаях приходится использовать всю мощь языка SQL и создавать набор данных в приложении на основе компонентов Query.

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

 

SELECT список выбираемых полей (вертикальная фильтрация)

FROM список таблиц, из которых выбираются данные, и условия их соединения

WHERE условия отбора данных (горизонтальная фильтрация)

ORDER BY список полей, определяющих порядок отобранных записей

 

Например, к базе данных STUDLIST_ODBC можно сделать следующий запрос:

 

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

WHERE (Fio> 'Б') And (Fio< 'К')

ORDER BY Groups.GroupName, Students.Fio

 

В результате этого запроса будут выведены по группам в алфавитном порядке записи обо всех студентах, фамилии которых начинаются на букву в интервале от «Б» до «И» включительно. Результат запроса показан на рисунке 6:

 

 

Рисунок 6. Визуализация запроса к базе данных с фильтрацией и сортировкой записей

 

Данный запрос решает поставленную задачу, но он является статическим и всегда выбирает одни и те же данные. На практике статические запросы используются не часто. Гораздо чаще создаются динамические запросы. Динамические запросы называются так потому, что их главное свойство SQL изменяется во время выполнения программы реализующей информационную систему.

Изменять свойство SQL можно полностью или частично, придавая некоторым параметрам новые значения, но сохраняя структуру запроса. Полное изменение запроса реализовать довольно сложно, поскольку нужно не только сгенерировать в программном коде новое значение свойства SQL, но и внести коррективы в компоненты визуализации, которые, возможно, должны будут отображать новые данные в другом формате. Значительно проще, сохраняя структуру запроса, менять в нем только значения параметров (менять что-то в компонентах визуализации при этом тоже, скорее всего, не потребуется).

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

1. компонент Query (имя по умолчанию Query1), в свойство DatabaseName введем значение STUDLIST_ODBC, а в свойство SQL следующий текст:

 

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

WHERE (Fio>: B) And (Fio<: E)

ORDER BY Groups.GroupName, Students.Fio

 

Этот текст содержит определение двух параметров (перед именем параметра ставится «:») B и E, задающих начало диапазона букв и окончание.

 

Рисунок 7. Форма с параметрическим запросом

 

2. компонент DataSource (имя по умолчанию DataSource1), в свойство DataSet поместим Query1;

3. компонент DBGrid (имя по умолчанию DBGrid1), в свойство DataSource поместим DataSource1;

4. два компонента MaskEdit и к ним два компонента Label (для группировки поместим их на компонент GroupBox).

 

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

 

 

Рисунок 8. Отображение запроса с новыми значениями параметров

 

Для выполнения запроса необходимо значения, введенные в компоненты MaskEdit, передать в параметры запроса и инициировать сам запрос. Обработчик щелчка кнопки «Выполнить запрос» имеет следующий код:

void __fastcall TForm1:: Button1Click(TObject *Sender)

{

Query1-> Active=false;

Query1-> Params-> Items[0]-> AsString=MaskEdit1-> Text;

Query1-> Params-> Items[1]-> AsString=MaskEdit2-> Text;

Query1-> Active=true;

}

В первой строке запрос делается не активным (разрывается связь с данными); в двух следующих строках в параметры запроса B (Query1-> Params-> Items[0]) и E (Query1-> Params-> Items[1]) передаются введенные в компоненты MaskEdit значения. В последней строке соединение с базой данных снова делается активным.

Часто бывает так, что значение параметра не произвольно, а является значением некоторого поля в одной из таблиц базы данных. Например, пусть требуется в предыдущем запросе дополнительно задавать группу, из которой выбираются записи. Компонент Query имеет механизм автоматической передачи в параметр значений из некоторого поля набора данных; для этого достаточно, чтобы имя параметра совпадало с именем поля. Добавим на форму:

1. компонент Table (имя по умолчанию Table1) для создания набора данных, из которого параметр будет получать нудное значение, и свяжем его с таблицей Groups;

2. компонент DataSource (имя по умолчанию DataSource2) и свяжем его с компонентом Table1;

3. компонент DBGrid (имя по умолчанию DBGrid2) и свяжем его с компонентом DataSource2 (этот компонент нужен для навигации по таблице Groups).

 

В компоненте Query1 изменим свойство SQL следующим образом (вводим новый параметр и убираем поле GroupName):

 

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

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

WHERE (Fio>: B) And (Fio< =: E) And (GroupName=: GroupName)

ORDER BY Students.Fio

 

Важным свойством компонента Query является свойство DataSource (его значение выберем DataSource2); оно позволяет автоматизировать ввод параметров. После всех необходимых действий по настройке свойств визуальных компонентов, форма примет вид как на рисунке 9:

 

 

Рисунок 9. Форма с автоматическим вводом параметра GroupName

 

Рисунок 3.2.3.4 показывает, что форма практически не содержит лишних интерфейсных компонентов, но позволяет осуществлять просмотр списка студентов с максимальной степенью детализации. При этом, часть программного кода, автоматически передающая в параметр GroupName нужные значения, уже существует внутри компонента Query и программисту не требуется создавать его заново. Этот механизм является весьма эффективным в тех случаях, когда в качестве возможных значений параметров служат значения полей таблиц базы данных. На рисунке 10 (сравните с рисунком 9) показана программа на этапе выполнения после выбора нового диапазона фамилий (оба механизма передачи параметров работают согласованно):

 

 

Рисунок 10. Механизмы передачи параметров (из поля таблицы и из интерфейсных полей ввода) работают согласованно

 

Решающую роль сыграло то, что в наборе данных компонента Table1, а именно с этим набором связан источник данных DataSource2, есть поле с тем же именем GroupName, что и имя параметра запроса. Таким образом, можно обеспечить передачу не одного, а нескольких параметров.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.