При работе с базой данных пользователя, как правило, интересует не все ее содержимое, а некоторая конкретная информация. Найти нужные сведения можно последовательным просмотром записей. Однако такой способ поиска неудобен и малоэффективен.
Большинство систем управления базами данных позволяют произвести выборку нужной информации путем выполнения запросов. Пользователь в соответствии с определенными правилами формулирует запрос, указывая, каким критериям должна удовлетворять интересующая его информация, а система выводит записи, удовлетворяющие запросу.
Для выборки из базы данных записей, удовлетворяющих некоторому критерию, предназначен компонент Query (рис. 17.17).
Компонент Query похож на компонент Table, но, в отличие от последнего, он представляет не всю базу данных (все записи), а только ее часть — записи, удовлетворяющие критерию запроса.
В табл. 17.18 перечислены некоторые свойства компонента Query.
Таблица 17.18.Свойства компонента Query
Свойство
Определяет
Name
SQL
Active
Имя компонента. Используется компонентом Datasource для связи результата выполнения запроса (набора записей) с компонентом, обеспечивающим просмотр записей, например DBGrid
Записанный на языке SQL запрос к базе данных (к таблице)
При присвоении свойству значения True активизирует выполнение запроса
Для того чтобы во время разработки программы задать, какая информация будет выделена из базы данных в результате выполнения запроса, свойство SQL должно содержать представленный на языке SQL запрос на выборку данных.
В общем виде запрос на выборку из таблицы данных выглядит так:
SELECTСписок-Полей FROMТаблица WHERE(Критерий) ORDER BYСписокПолей
где:
SELECT — команда выбора записей из таблицы и вывода содержимого полей, имена которых указаны в списке;
FROM — параметр команды, который определяет имя таблицы, из которой нужно сделать выборку;
WHERE — параметр, который задает критерий выбора. В простейшем случае критерий — это инструкция проверки содержимого поля;
ORDER BY - параметр, в соответствии с которым будут упорядочены записи, удовлетворяющие критерию запроса.
Например, запрос
SELECT Fam, Name FROM ':Школа:school.db' WHERE
(Class = '10a') ORDER BY Name, Fam
обеспечивает выборку из базы данных "Школа" (из таблицы School.db) записей, у которых в поле class находится текст 10а, т. е. формирует упорядоченный по алфавиту список учеников 10-а класса.
Другой пример.
Запрос SELECT Fam, Name FROM ":Школа:school.db"
WHERE(Fam > 'K') and(Fam < 'Л') ORDER BY Name, Fam
обеспечивает выбор информации об учениках, фамилии которых начинаются на буквы от К до Л.
Запрос может быть сформирован и записан в свойство SQL во время разработки формы или во время работы программы.
Для записи запроса в свойство SQL во время разработки формы используется редактор списка строк , окно которого открывается в результате щелчка на кнопке с тремя точками в строке свойства SQL окна Object Inspector.
Свойство SQL представляет собой список строк. Поэтому чтобы сформировать запрос во время работы программы, нужно, используя метод Add, добавить строки (SQL-инструкции) в список SQL.
Ниже приведен фрагмент кода, который формирует запрос на поиск информации о конкретном человеке (критерий выбора — содержимое поля Fam должно совпадать со значением переменной fam).
withforml.Queryl do begin
Close; // закрыть файл — результат выполнения
// предыдущего запроса
SQL.Clear; // удалить текст предыдущего запроса
// записываем новый запрос в свойство SQL
SQL.Add('SELECT Fam, Name, Class1);
SQL.Add('FROM ":Школа:school.db"');
SQL.Add('WHERE');
SQL.Add('(Fam = '" + fam + '")');
SQL.Add('ORDER BY Name, Fam');
Open; // активизируем выполнение запроса
end;
Следующая программа, ее текст приведен ниже, а диалоговое окно —демонстрирует возможность изменения запроса, точнее, критерия запроса, во время работы программы. Программа обеспечивает вывод как всего списка учеников, так и его части. Например, посредством выполнения запроса выводится информация только о конкретном ученике.
Для просмотра базы данных и результата выполнения запроса используется компонент DBGrid1, который через компонент DataSourcel взаимодействует с компонентом Table1 (при просмотре всей базы данных) или с компонентом Query (при просмотре результата выполнения запроса).
type TForm1 = class(TForm) Table1: TTable; // таблица (вся база данных) Query1: TQuery; // запрос (записи БД, удовлетворяющие
критерию выбора) DataSource1: TDataSource; // источник данных - таблица или запрос DBGrid1: TDBGrid; // таблица для отображения БД или результата
выполнения запроса DBNavigator1: TDBNavigator; DBText1: TDBText; Button1: TButton; // кнопка запрос Button2: TButton; // кнопка Все записи procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject); // щелчок на кнопке Запрос var fam: string[30]; begin fam:=InputBox('Выборка информации из БД', 'Укажите фамилию и щелкните на OK.', ''); if fam <> '' // пользователь ввел фамилию then begin with form1.Query1 do begin Close; // закрыть -результат выполнения предыдущего запроса SQL.Clear; // удалить текст предыдущего запроса // записываем новый запрос в свойство SQL SQL.Add('SELECT Fam, Name, Class'); SQL.Add('FROM ":Школа:school.db"'); SQL.Add('WHERE'); SQL.Add('(Fam = "'+ fam + '")'); SQL.Add('ORDER BY Name, Fam'); Open; // активизируем выполнение запроса end;
*** другой вариант изменения критерия запроса begin Query1.Close; Query1.SQL[3]:='(Fam="'+ fam + '")'; Query1.Open; DataSource1.DataSet:=Query1; end;
if Query1.RecordCount <> 0 then DataSource1.DataSet:=Query1 //отобразить рез-т выполнениязапроса elsebegin ShowMessage('В БД нет записей, удовлетворяющих критерию запроса.'); DataSource1.DataSet:=Table1; end; end; end;
procedure TForm1.Button2Click(Sender: TObject);// щелчок на кнопке Все записи
begin DataSource1.DataSet:=Table1; // источник данных - таблица end;
procedure TForm1.FormActivate(Sender: TObject);//активизация формы
begin DataSource1.DataSet := Table1; Table1.Active := True; end; end.
Процедура TForm1.Button1Click запускается щелчком кнопки Запрос.Она принимает от пользователя строку (фамилии) и записью (добавлением) строк в свойство SQL формирует текст запроса. Затем эта процедура вызовом метода Open активизирует выполнение запроса.
Следует обратить внимание на то, что перед изменением свойства SQL-запрос должен быть закрыт при помощи метода close (здесь надо вспомнить, что результат выполнения запроса — это файл данных (таблица), который создается в результате выполнения запроса).
Процедура TForm1.Button2Click, которая запускается щелчком кнопки Все записи,устанавливает в качестве источника данных для компонента DataSourcel компонент Table1, тем самым обеспечивая переход в режим просмотра всей базы данных.
Если запрос записан в свойство SQL во время разработки формы приложения, то во время работы программы критерий запроса можно изменить простой заменой соответствующей строки текста запроса.
Например, для запроса
SELECTDISTINCT Fam, Name, Class FROM ":Школа:school.db"
WHERE (Class= '10а') ORDER BY Name, Fam
инструкция замены критерия запроса может быть такой:
forml.Query1.SQL[3]:='(Fam="' + fam+ '")'
Следует обратить внимание на то, что свойство SQL является структурой типа TStrings, в которой строки нумеруются с нуля.