010 — Delphi. Пример сортировки в базе данных с использованием компонента TADOQuery

Пример сортировки в базе данных с использованием компонента TADOQuery

Часто в приложениях, работающих с базами данных, необходимо осуществить сортировку данных по некоторому полю, которое выбирается кликом «мыши» на его заголовке. Эта проблема решается в этой задаче.

 

Условие задачи

Дана база данных «01_02_00_010_mydb.mdb«, сформированная средствами СУБД Microsoft Access.

База данных содержит следующие таблицы.

Таблица Group.

01_02_00_010_table01r

Таблица Student.

01_02_00_010_table02r

 

Таблица Marks.

01_02_00_010_table03r

Необходимо разработать приложение, выводящее таблицу 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

  1. Настройка связи между компонентами 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

 

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