Практическая работа №23.
При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими выражению фильтра, задающему условия отбора записей.
Cвойство Filter задается строковым выражением следующим образом:
Table1. Filter:= ‘Salary<=2000’;
Если в записи выражения фильтрации встречаются апострофы, то каждый такой апостроф заменятся на 2 одиночных символа, которые будут заменяться на один при чтении строки. Например:
Table1. Filter:= ‘Salary<=2000 and (Post=’’лаборант’’ or Post=’’инженер’’)’;
Если выражение фильтра не задано, то в набор данных попадают все записи. В записи выражения фильтрации могут использоваться символы шаблона, например ‘*’ означает любую последовательность символов.
Для активизации и деактивизации фильтра применяется свойство Filtered типа Boolean. False – фильтрация выключена, True – включена.
Рассмотрим пример фильтрации по выражению.
1. На форму поместите компонент TAble1 и свяжите его с файлом данных о сотруднике sort.db, с DBGrid1 и DBNavigator1.
2. На форму поместите поле редактора edtFilter для задания выражения фильтра и две кнопки: btnFilter с заголовком Фильтровать и btnAllRecords с заголовком Все записи для отмены фильтрации.
3. Включите следующие обработчики событий:
procedure Tform1.FormCreate (Sender:TObject);
begin
Table1.Filter:=’’;
Table1.FilterOptions:= [foCaseInsensitive];
Table1.Filtered:=true;
End;
procedure btnAllRecordsClick (…)
begin
Tablel.Filtered:=false;
end;
procedure btnFilterClick (…)
begin
Tablel.Filtered:=true; Tablel.Filter:= edtFilter.Text; end;
Рис. 1 Фильтрация по выражению.
В приведенном примере пользователь должен самостоятельно набирать выражение фильтра. Это предоставляет пользователю широкие возможности управления фильтрацией, но требует от него знания построения выражений.
|
4. Отфильтруйте данные о сотрудниках, имеющих оклад не больше 2000 руб (текст “Salary<=2000” должен быть записан в поле edtFilter)
5. Отобразите данные о лаборантах и инженерах.
6. Отобразите данные о сотрудниках технологического отдела.
Часто удобно предоставить пользователю список готовых выражений (шаблонов) для выбора. При этом пользователь получает также возможность редактировать выбранное выражение и корректировать весь список. Такой режим реализуется, например, с помощью компонентов ComboВох и Memo
Если набор условий фильтрации ограничен и не изменяется, то пользователь может управлять отбором записей с помощью таких компонентов, как независимые (checkBox) и зависимые (RadioButton) переключатели.
Рассмотрим в качестве примера обработчики событий формы приложения, которой пользователю предоставлена возможность управлять фильтрацией по двум полям или по выражению либо совсем отключать фильтрацию (рис.2).
Рис. 2. Управление фильтрацией по выражению
Разместите на форме радио кнопки rbSalary, rbBirthDay, rbExpression, rbNoFilter, два текстовых поля для задания границ оклада edtMin и edtMax, два компонента DateTimePicker1 и DateTimePicker2 с вкладки Win32 для определения границ даты рождения.
Условие задано в виде двойного ограничения.
Пользователь может задавать минимальное и максимальное значения. В обработчике события нажатия на кнопку Фильтровать на основании введенных пользователем значений происходит автоматическое формирование выражения фильтра.
procedure TForm1.btnFilterClick(Sender: TObject);
begin
Table1.Filtered:=true;
//Table1.Filter:=edtFilter.Text;
if rbSalary.Checked then //Фильтровать по окладу
|
Table1.Filter:='Salary>' +edtMin.Text+ 'AND Salary<='+edtMax.Text;
if rbBirthDay. Checked then // Фильтровать по дате рождения
Table1.Filter:='BirthDay>'''+DateToStr(DateTimePicker1.Date) +''' AND BirthDay<'''+DateToStr(DateTimePicker2.Date)+'''';
// Фильтровать по выражению
If rbExpression.Checked then
Table1.Filter:=edtFilter.Text;
if rbNoFilter.Checked then //Отключить фильтрацию
Table1.Filter:='';
end;
Поскольку в выражении фильтра нельзя использовать имена переменных и свойства компонентов, то при его формировании набранные пользователем значения должны преобразовываться в строковый тип.
В приведенном примере это относится к значению даты, которые еще заключаются в одиночные апострофы.
Аналогично задаются и более сложные условия формирования фильтра, в том числе с помощью логических операций or и not. Кроме того, пользователь может, как и в предыдущем примере, управлять процессом отбора засей с помощью выражения фильтра, которое вводится в редакторе.
Задание: задайте фильтрацию по названию отдела. Для выбора названия отдела из списка допустимых значений используйте компонент ComboВох, содержащий названия всех имеющихся отделов.
Для этого необходимо создать запрос Query1 к таблице sort.db и выбрать все неповторяющиеся названия отделов в алфавитном порядке.
Затем используя навигационный способ доступа к данным сформировать список – источник для компонента ComboВох, просматривая все строки набора данных запроса. Добавлять элемент в список можно с помощью метода Add.
Все эти действия можно поместить в процедуру обработки события активизации формы.