Приклад сортування в базі даних з використанням компонента TADOQuery
Часто в додатках, які працюють з базами даних, необхідно здійснити сортування даних за деяким полем, яке вибирається з допомогою “кліку” мишкою на його заголовку. Ця проблема вирішується у цій задачі.
Умова задачі
Задано базу даних “01_02_00_010_mydb.mdb“, сформовану засобами Microsoft Access.
База даних містить такі таблиці.
Таблиця Group.
Таблиця Student.
Таблиця Marks.
Необхідно розробити додаток, який виводить таблицю Marks. У таблиці Marks потрібно реалізувати сортування даних по усіх полях. Сортування реалізувати як у спадному, так і в зростаючому порядку. Початок сортування викликається при кліку на заголовку відповідного поля таблиці Marks.
Схема зв’язків між таблицями зображена на рисунку 1.
Рис. 1. Схема зв’язків між таблицями
Виконання
Зберегти проект в деякій папці. Наприклад
C:\Programs\Delphi\Program_01_02_00_010u
Ім’я модуля головної форми залишаємо за замовчуванням “Unit1.pas“.
Ім’я проекту залишаємо за замовчуванням “Project1.dproj“.
- Побудова форми.
Виносимо на форму компоненти таких типів:
– з вкладки dbGo компонент типу TADOConnection для зв’язку з базою даних (рис. 2);
– з вкладки dbGo компонент типу TADOQuery для організації запиту на мові SQL (рис. 2);
– з вкладки Data Access компонент типу TDataSource для зв’язку набору даних з компонентом візуалізації даних TDBGrid (рис. 3);
– з вкладки Data Controls компонент типу TDBGrid для відображення результатів SQL-запиту, сформованому в компоненті TADOQuery (рис. 4).
Рис. 2. Компоненти TADOConnection та TADOQuery
Рис. 3. Компонент типу TDataSource
Рис. 4. Компонент типу TDBGrid
Після розміщення компонент форма додатку буде мати вигляд як зображено на рисунку 5.
Рис. 5. Форма додатку після розміщення компонент
У результаті побудови форми отримаємо наступні назви відповідних об’єктів (змінних):
– ADOConnection1;
– ADOQuery1;
– DataSource1;
– DBGrid1.
3. Підключення бази даних до додатку.
Щоб підключити базу даних до додатку потрібно налаштувати властивість ConnectionString компонента ADOConnection1.
Процес налаштування ConnectionString детально описаний тут.
При формуванні властивості ConnectionString у вікнах майстра підключення задаємо постачальника OLE DB – “Microsoft Jet 4.0 OLE DB Provider“.
Вказуємо шлях до бази даних як:
C:\Programs\Delphi\Program_01_02_00_010u\01_02_00_010_mydb.mdb
4. Налаштування зв’язку між компонентами ADOConnection1, ADOQuery1, DataSource1, DBGrid1.
Тепер треба зв’язати компоненти форми між собою. Для цього потрібно виконати такі дії:
– у компоненті ADOQuery1 властивість Connection = “ADOConnection1”;
– у компоненті DataSource властивість DataSet=”ADOQuery1″;
– у компоненті DBGrid1 властивість DataSource = “DataSource1”.
Для того, щоб при зверненні до бази даних забрати вивід вікна запрошення вводу паролю та імені користувача, у компоненті ADOConnection1 властивість
LoginPrompt = false
5. Налаштування компонента TADOQuery.
Наступним кроком треба здійснити налаштування компонента TADOQuery.
Для цього в Object Inspector вибираємо властивість SQL кліком на “…” (рис. 6). У результаті відкриється вікно редактора “String List Editor“.
Рис. 6. Властивість SQL компонента ADOQuery1
У редакторі “String List Editor” потрібно набрати такий текст SQL-запиту:
SELECT *
FROM [Marks]
Рис. 7. Текст SQL-запиту в ADOQuery1
6. Властивість Active компонента ADOQuery1.
Наступний крок – відображення таблиці Marks в компоненті DBGrid1.
Для цього необхідно:
– виділити компонент ADOQuery1;
– встановити властивість Active у значення true.
У результаті, таблиця Marks відобразиться у компоненті DBGrid1. Дані таблиці відображаються на основі SQL-запиту, сформованого у властивості “SQL” компонента ADOQuery1 (рис. 8).
Рис. 8. Відображення даних в DBGrid1 після встановлення Active в значення true в компоненті ADOQuery1
- Створення програмного коду реалізації сортування даних в полях таблиці Marks.
Тепер необхідно написати програмний код сортування при кліку користувачем на заголовку того чи іншого поля. Якщо користувач робить перший клік на відповідному полі, то сортування відбувається у зростаючому порядку. Якщо після цього зробити другий клік на тому ж полі, то сортування відбувається у спадному порядку і так далі.
У той момент, коли користувач робить клік на заголовку таблиці в компоненті DBGrid1 генерується подія OnTitleClick. Якщо перехопити цю подію, то можна здійснити сортування за відповідним полем.
7.1. Ввід змінних Order та Field.
У розділ private класу TForm1 вводимо змінну Order. Фрагмент відповідного коду має вигляд:
...
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure DBGrid1TitleClick(Column:TColumn);
private
{ Private declarations }
Order:boolean; // змінна, що вказує попереднє сортування (дію)
Field:integer; // номер поля, для якого відбулось сортування
public
{ Public declarations }
end;
...
Змінна Order вказує напрямок попереднього сортування:
– true – сортування за зростанням;
– false – сортування за спаданням.
Змінна field вказує номер поля, для якого перед цим відбулось сортування.
7.2. Програмування події активізації форми OnActivate.
Подія OnActivate генерується в момент відкриття форми після її запуску. В цю подію необхідно внести програмний код, який робить ініціалізацію змінних Order та Field.
При відкритті форми дані сортуються на основі поля ID_Marks у зростаючому порядку. Тому в змінну Order заносимо значення true, а в змінну Field заносимо значення 0.
Для програмування події OnActivate потрібно виконати такі дії:
– виділити форму Form1;
– в Object Inspector перейти на вкладку Events (події);
– зробити подвійний клік мишкою в полі події OnActivate.
Загальний вигляд обробника події OnActivate форми Form1:
procedure TForm1.FormActivate(Sender: TObject); begin order := true; field := 0; end;
7.3. Програмування події кліку на заголовку таблиці, що відображається у DBGrid1.
Як було сказано раніше, у момент кліку на заголовку таблиці Marks, що відображається в DBGrid1, генерується подія OnTitleClick.
Лістинг обробника події OnTitleClick наступний:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
new_field:integer;
begin
// формування початкових значень внутрішніх змінних
new_field := Column.Index;
// закриття з'єднання з базою даних
ADOQuery1.Close;
// очищення тексту попереднього SQL-запиту
ADOQuery1.SQL.Clear;
// додавання шаблонного рядка нового SQL-запиту
ADOQuery1.SQL.Add('SELECT * FROM [Marks] ORDER BY ');
if new_field = field then // клік на тому самому полі
order := not order // змінити порядок сортування на протилежний
else
begin
// клік на іншому полі
field := new_field;
order := true;
end;
case field of
0: ADOQuery1.SQL.Add(' [ID_Marks] ');
1: ADOQuery1.SQL.Add(' [Physics] ');
2: ADOQuery1.SQL.Add(' [Mathematics] ');
3: ADOQuery1.SQL.Add(' [Jurisprudence] ');
4: ADOQuery1.SQL.Add(' [PhysicalTraining] ');
5: ADOQuery1.SQL.Add(' [ID_Student] ');
end;
if not order then
ADOQuery1.SQL.Add(' DESC');
ADOQuery1.Open;
end;
Обробник події приймає вхідним параметром номер колонки таблиці Column, на якій було зроблено клік мишкою. На основі значення Column таблиці визначається, чи зроблено клік на іншій колонці (полі). Таким чином формуються змінні field та order.
При формуванні тексту SQL-запиту у компоненті ADOQuery1 необхідно закрити з’єднання з базою даних. Це здійснюється викликом методу Close:
ADOQuery1.Close
У властивості “SQL” компонента ADOQuery1 є два методи, які роблять наступні дії:
– метод Clear() очищує текст SQL-запиту;
– метод Add() додає новий текст до тексту SQL-запиту.