010 – Delphi. Приклад сортування в базі даних з використанням компонента TADOQuery

 

Приклад сортування в базі даних з використанням компонента TADOQuery

Часто в додатках, які працюють з базами даних, необхідно здійснити сортування даних за деяким полем, яке вибирається з допомогою “кліку” мишкою на його заголовку. Ця проблема вирішується у цій задачі.

 

Умова задачі

Задано базу даних “01_02_00_010_mydb.mdb“, сформовану засобами Microsoft Access.

База даних містить такі таблиці.

Таблиця Group.

01_02_00_010_table01u

Таблиця Student.

01_02_00_010_table02u

Таблиця Marks.

01_02_00_010_table03u

Необхідно розробити додаток, який виводить таблицю Marks. У таблиці Marks потрібно реалізувати сортування даних по усіх полях. Сортування реалізувати як у спадному, так і в зростаючому порядку. Початок сортування викликається при кліку на заголовку відповідного поля таблиці Marks.

Схема зв’язків між таблицями зображена на рисунку 1.

01_02_00_010_01_Рис. 1. Схема зв’язків між таблицями

 

Виконання

  1. Завантажити Embarcadero RAD Studio.

Зберегти проект в деякій папці. Наприклад

C:\Programs\Delphi\Program_01_02_00_010u

Ім’я модуля головної форми залишаємо за замовчуванням “Unit1.pas“.

Ім’я проекту залишаємо за замовчуванням “Project1.dproj“.

 

  1. Побудова форми.

Виносимо на форму компоненти таких типів:

– з вкладки dbGo компонент типу TADOConnection для зв’язку з базою даних (рис. 2);

– з вкладки dbGo компонент типу TADOQuery для організації запиту на мові SQL (рис. 2);

– з вкладки Data Access компонент типу TDataSource для зв’язку набору даних з компонентом візуалізації даних TDBGrid (рис. 3);

– з вкладки Data Controls компонент типу TDBGrid для відображення результатів SQL-запиту, сформованому в компоненті TADOQuery (рис. 4).

01_02_00_010_02_Рис. 2. Компоненти TADOConnection та TADOQuery

01_02_00_010_03_Рис. 3. Компонент типу TDataSource

01_02_00_010_04_Рис. 4. Компонент типу TDBGrid

Після розміщення компонент форма додатку буде мати вигляд як зображено на рисунку 5.

01_02_00_010_05_Рис. 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“.

01_02_00_010_06_Рис. 6. Властивість SQL компонента ADOQuery1

У редакторі “String List Editor” потрібно набрати такий текст SQL-запиту:

SELECT *
FROM  [Marks]

01_02_00_010_07_Рис. 7. Текст SQL-запиту в ADOQuery1

 

6. Властивість Active компонента ADOQuery1.

Наступний крок – відображення таблиці Marks в компоненті DBGrid1.

Для цього необхідно:

– виділити компонент ADOQuery1;

– встановити властивість Active у значення true.

У результаті, таблиця Marks відобразиться у компоненті DBGrid1. Дані таблиці відображаються на основі SQL-запиту, сформованого у властивості “SQL” компонента ADOQuery1 (рис. 8).

01_02_00_010_08_Рис. 8. Відображення даних в DBGrid1 після встановлення Active в значення true в компоненті ADOQuery1

 

  1. Створення програмного коду реалізації сортування даних в полях таблиці 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-запиту.