Практическое занятие № 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;