Практическое занятие № 19
Тема: "Сортировка и фильтрация данных в таблицах"
Цель работы: получить практические навыки по выполнению сортировки и фильтрации данных в разных СУБД
Ход работы
Скачайте БД Access (скачать), которая содержит таблицу sotr со следующей структурой:
Имя поля | Тип | Размер |
tabnom | счетчик | ключевое |
fam | varchar | 20 |
imya | varchar | 15 |
otch | varchar | 20 |
datar | date |
|
oklad | float | 2 знака после запятой |
В среде Delphi создайте программу для работы с данными таблицы. При этом форма должна иметь вид:

Указания: для формы задайте свойства: Caption=Список сотрудников, Position=DesktopCenter, Borderstyle=bsSingle, Height=340.
На форму нанесите компонент ADOConnection (ADO). В свойстве ConnectionString укажите параметры подключения к БД Access. В свойстве LoginPrompt укажите false, чтобы программа не запрашивала логин и пароль при соединении с БД.
Нанесить на форму компонент ADOTable (ADO). В свойстве Connection укажите соединение с БД ADOConnection1, в свойстве TableName укажите таблицу Sotr.
Для того, чтобы программа корректно подключала таблицу в событии формы OnCreate введите код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.Active:=true;
end;
Для того, чтобы программа корректно отключала таблицу в свойстве формы OnDestroy введите код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
ADOConnection1.Connected:=false;
end;
Нанесите на форму компонент DataSource (DataAccess). Установите для него свойство DataSet =ADOTable1.
Нанесите на форму компонент DbGrid (DataControls). Установите для него свойство DataSource=DataSource1.
Данные в сетке можно сортировать с помощью щелчков на заголовках колонок сетки.
Указания: для организации сортировки в сетке в событии OnTitleClick сетки введите код:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
//если сетка отсортирована по убыванию
if ADOTable1.IndexFieldNames=Column.FieldName+' DESC' then
//сортируем по возрастанию
ADOTable1.IndexFieldNames:=Column.FieldName
else
//иначе сортируем по убыванию
ADOTable1.IndexFieldNames:=Column.FieldName+' DESC';
end;
На форме разместите кнопку, которая увеличивает форму по высоте и отображает поля для ввода параметров поиска. Такая форма будет иметь вид:

Указания: на форму добавьте кнопку Button (Standard) и задайте свойство Caption=Найти. Кнопка должна увеличить высоту формы и отобразить поля для ввода ключей поиска данных. Для этого в событии OnClick кнопки введите код:
procedure TForm1.Button1Click(Sender: TObject);
begin
//постепенно увеличиваем высоту формы до 480 точек
//после каждого увеличения делаем паузу для эффекта анимации
while Height < 480 do
begin
//увеличиваем высоту с шагом в 5 точек
Height:=Height+5;
//центрируем форму по вертикали
Top:=(Screen.Height-Height) div 2;
//делаем паузу
Sleep(50);
end;
//ставим курсор в первое поле для ввода критериев поиска
Edit1.SetFocus;
end;
Пользователь может произвольно заполнять нужные поля для поиска. Поля "Дата от" и "Дата до" заполняются с помощью календаря (DateTimePicker). Поиск по дате рождения и окладу выполняется по диапазону значений.
Указания: увеличьте высоту формы, задав для нее свойство Height=480. На форму нанесите 8 компонентов Edit (Standard). Разместите и подпишите их так, как показано на рисунке в задании.
Для полей задания диапазона дат нужно использовать компоненты DateTimePicker. Добавьте на форму два компонента DateTimePicker (Win32), задайте им такой же размер, который имеют соответствующие компоненты Edit, задайте им свойство Visible=false, разместите их поверх соответссующих текстовых полей.
Для комбинации календаря с полем для текстового поля "Дата от" событии OnEnter введите код:
procedure TForm1.Edit5Enter(Sender: TObject);
begin
//делаем календарь видимым
DateTimePicker1.Visible:=true;
//ставим курсор в поле с календарем
DateTimePicker1.SetFocus;
end;
Для календаря, размещенного над полем "Дата от", в событии OnExit введите код:
procedure TForm1.DateTimePicker1Exit(Sender: TObject);
begin
//делаем календарь невидимым
DateTimePicker1.Visible:=false;
//в поле записываем выбранную дату
Edit5.Text:=DateToStr(DateTimePicker1.Date);
end;
Аналогично для поля "Дата до" в событии OnEnter введите код:
procedure TForm1.Edit6Enter(Sender: TObject);
begin
//делаем календарь видимым
DateTimePicker2.Visible:=true;
//ставим курсор в поле с календарем
DateTimePicker2.SetFocus;
end;
Аналогично для календаря, размещенного над полем "Дата до", в событии OnExit введите код:
procedure TForm1.DateTimePicker2Exit(Sender: TObject);
begin
//делаем календарь невидимым
DateTimePicker2.Visible:=false;
//в поле записываем выбранную дату
Edit6.Text:=DateToStr(DateTimePicker2.Date);
end;
Кнопка "Отобрать" фильтрует данные в таблице.
Указания: нанесите на форму кнопку Button (Standard) и задайте свойство Caption=Отобрать. Кнопка отбирает в сетке записи в соответствии с заданными условиями поиска. Для кнопки введите код:
procedure TForm1.Button2Click(Sender: TObject);
//переменная для формирования условия поиска
var s:string;
begin
//сначала условие поиска не задано
s:='';
//задаем условие поиска для поля "tabnom" (числовое)
if Edit1.Text<>'' then
s:=s+'tabnom ='+Edit1.Text;
//задаем условие поиска для поля "fam" (текстовое)
if Edit2.Text<>'' then
if s<>'' then
s:=s+' and fam like '''+Edit2.Text+'%'''
else
s:=s+'fam like '''+Edit2.Text+'%''';
//задаем условие поиска для поля "imya" (текстовое)
if edIt3.Text<>'' then
if s<>'' then
s:=s+' and imya like '''+Edit3.Text+'%'''
else
s:=s+'imya like '''+Edit3.Text+'%''';
//задаем условие поиска для поля "otch" (текстовое)
if Edit4.Text<>'' then
if s<>'' then
s:=s+' and otch like '''+Edit4.Text+'%'''
else
s:=s+'otch like '''+Edit4.Text+'%''';
//задаем условие поиска для поля "datar" (дата от) (дата/время)
//обратите внимание на то, что содержимое поля Edit5 конвертируется
//в формат представления дат в Access: '#dd/mm/yyyy#'
if Edit5.Text<>'' then
if s<>'' then
s:=s+' and datar >= '+FormatDateTime('#dd"/"mm"/"yyyy#',StrToDate(Edit5.Text))
else
s:=s+'datar >= '+FormatDateTime('#dd"/"mm"/"yyyy#',StrToDate(Edit5.Text));
//задаем условие поиска для поля "datar" (дата до) (дата/время)
//обратите внимание на то, что содержимое поля Edit6 конвертируется
//в формат представления дат в Access: '#dd/mm/yyyy#'
if Edit6.Text<>'' then
if s<>'' then
s:=s+' and datar <= '+FormatDateTime('#dd"/"mm"/"yyyy#',StrToDate(Edit6.Text))
else
s:=s+'datar <= '+FormatDateTime('#dd"/"mm"/"yyyy#',StrToDate(Edit6.Text));
//задаем условие поиска для поля "oklad" (оклад от) (числовое)
if Edit7.Text<>'' then
if s<>'' then
s:=s+' and oklad >= '+Edit7.TEXT
else
s:=s+'oklad >= '+Edit7.Text;
//задаем условие поиска для поля "oklad" (оклад до) (числовое)
if Edit8.Text<>'' then
if s<>'' then
s:=s+' and oklad <= '+Edit8.Text
else
s:=s+'oklad <= '+Edit8.Text;
//если условие поиска не задано завершаем работу процедурі
if s='' then Exit;
//задаем условие фильтрации данных
ADOTable1.Filter:=s;
//включаем фильтрацию
ADOTAble1.Filtered:=true;
end;
Кнопка "Очистить" очищает все поля критериев поиска и в сетке отображает все записи.
Указания: добавьте на форму кнопку Button (Standard). Для кнопки напишем код:
procedure Tform1.Button3Click(Sender: Tobject);
begin
//очищаем все поля
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
Edit5.Clear;
Edit6.Clear;
Edit7.Clear;
Edit8.Clear;
Edit1.Setfocus;
//выключаем фильтрацию
ADOTAble1.Filtered:=false;
end;
Кнопка "Скрыть" проводит очистку всех полей, отображает все записи в сетке и возвращает форму в начальный размер по высоте.
Указания: нанесите на форму кнопку Button (Standard). Для кнопки напишіть код:
procedure Tform1.Button4Click(Sender: Tobject);
begin
//вызываем процедуру для кнопки "Очистить"
Button3Click(Sender);
//постепенно уменьшаем размер формы
//после каждого уменьшения делаем паузу для эффекта анимации
while Height>340 do
begin
//уменьшаем размер формы на 5 пикселей
Height:=Height-5;
//центрируем форму по вертикали по центру экрана
Top:=(Screen.Height-Height) div 2;
//делаем паузу
Sleep(50);
end;
//ставим курсор в сетку
DBGrid1.SetFocus;
end;