При роботі з базою даних користувача, як правило, цікавить не весь її вміст, а деяка конкретна інформація. Знайти потрібні відомості можна послідовним переглядом записів. Однак такий спосіб пошуку незручний і малоефективний.
Більшість систем управління базами даних дозволяють зробити вибірку потрібної інформації шляхом виконання запитів. Користувач відповідно до певних правил формулює запит, вказуючи, якими критеріями повинна задовольняти його цікавить інформація, а система виводить записи, що задовольняють запиту.
Для вибірки з бази даних записів, що задовольняють деякому критерію, призначений компонент Query (рис. 17.17).
Рис. 17.17. Значок компонента Query
Компонент Query схожий на компонент Table, але, на відміну від останнього, він представляє не всю базу даних (всі записи), а тільки її частину – записи, що задовольняють критерію запиту.
У табл. 17.18 перераховані деякі властивості компонента Query.
Таблиця 17.18. Властивості компонента Query
Властивість |
Визначає |
Name | Ім’я компонента. використовується компонентом Datasource для зв’язку результату виконання запиту (набору записів) з компонентом, що забезпечує перегляд записів, наприклад DBGrid |
SQL | Записаний на мові SQL запит до бази даних (до таблиці) |
Active | При присвоєнні властивості значення 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 під час розробки форми використовується редактор списку рядків (Рис. 17.18), вікно якого відкривається в результаті клацання на кнопці з трьома точками в рядку властивості SQL вікна Object Inspector
Рис. 17.18. Приклад запиту до бази даних ” Школа “
Властивість SQL представляє собою список рядків. Тому щоб сформувати запит під час роботи програми, потрібно, використовуючи метод Add, додати рядки (SQL-інструкції) в список SQL.
Нижче наведено фрагмент коду, який формує запит на пошук інформації про конкретну людину (критерій вибору – вміст поля Fam має збігатися зі значенням змінної fam).
with forml.Queryl do begin Close; // закрити файл - результат виконання // попереднього запиту SQL.Clear; // видалити текст попереднього запиту // записуємо новий запит в властивість SQL SQL.Add ( 'SELECT Fam, Name, Class 1 ); SQL.Add ( 'FROM =: Школа: school.db = '); SQL.Add ( 'WHERE'); SQL.Add ( '(Fam = '= + Fam + '=)'); SQL.Add ( 'ORDER BY Name, Fam '); Open; // активізуємо виконання запиту end;
Наступна програма, її текст приведений в лістингу 17.2, а діалогове вікно – на рис. 17.19, демонструє можливість зміни запиту, точніше, критерію запиту, під час роботи програми. Програма забезпечує виведення як всього списку учнів, так і його частини. наприклад, за допомогою виконання запиту виводиться інформація тільки про конкретний учня.
Для перегляду бази даних і результату виконання запиту використовується компонент DBGrid1, який через компонент DataSourcel взаємодіє з компонентом Table1 (при перегляді всій бази даних) або з компонентом Query (при перегляді результату виконання запиту).
Рис. 17.19. Форма додатки База даних Школа
Лістинг 17.2. База даних “Школа “
unit school2 _; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls; 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); private {Private declarations} public {Public declarations} end; var Form1: TForm1; implementation {$ R * .DFM} // клацання на кнопці Запит 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 // відобразити рез-т виконання запиту else begin 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 під час розробки форми програми, то під час роботи програми критерій запиту можна змінити простою заміною відповідного рядка тексту запиту.
Наприклад, для запиту
SELECT DISTINCT Fam, Name, Class FROM : Школа: school.db WHERE (Class = '10 а ') ORDER BY Name, Fam інструкція заміни критерію запиту може бути такою: forml.Query1.SQL [3]: = '(Fam = ' + Fam + ')'
Слід звернути увагу на те, що властивість SQL є структурою типу TStrings, в якій рядки нумеруються з нуля.