2. Задаем новые параметры фильтрации
3. Вновь включаем фильтрацию
Параметры фильтрации для любого набора данных в Delphi (TTable, TSimpleDataset, Tdataset и др.) задаются с помощью их свойств
Filtered: boolean
Filter: string
Первое из них определяет состояние фильтра (включен или выключен), второе определяет параметры фильтрации. В данном свойстве должно быть указано ограничивающее условие для набора данных. Такое же условие какое мы бы писали в SQL-запросе, но без ключевого слова where. Строки кода, меняющие значение фильтра можно поместить в обработчик события AfterScroll (событие перемещения по набору данных) компонента Stud_Table.
Одна из возможных реализаций кода выглядит так:
procedure TDataModule1.Stud_tableAfterScroll(DataSet: TDataSet);
var
Shifr_studenta: string;
begin
Usp_Table.Filtered:=False; // отключениефильтра
Shifr_Studenta:=Stud_Table.FieldByName('ST_BILET').Value; // определение
// шифра студента, активного в настоящее время.
Usp_Table.Filter:= 'ST_BILET='+Shifr_Studenta; // формированиеновогофильтра
Usp_Table.Filtered:=True; // включениефильтра
end;
Функция FieldByName(s:string) возвращает поле данных с именем s.
Замечание. В приведенном примере при попытке добавления записи при включеном фильтре во второй строке процедуры возникнет исключительная ситуация: будет сделана попытка строковой переменной Shifr_Studenta присвоить значение NULL. Чтобы избежать подобной ошибки следует использовать функцию VarIsNull(X:variant):boolean, находящууся в модуле Variants. Данный модуль не добавляется автоматически в раздел uses, его необходимо добавлять вручную. Код при этом может поменяться например на следующий:
begin
Usp_Table.Filtered:=False; // отключение фильтра
if VarIsNull(Stud_Table.FieldByName('ST_BILET').Value) then
Exit
else
Begin
Shifr_Studenta:=Stud_Table.FieldByName('ST_BILET').Value;
Usp_Table.Filter:= 'ST_BILET='+Shifr_Studenta;
Usp_Table.Filtered:=True;
End;
end;
В этом случае при пустом значении студенческого шифра произойдет досрочное завершение процедуры, а фильтр окажется выключенным, что приведет к отображению всех записей в таблице «Успеваемость». Каким образом обойти особенность предлагается подумать самостоятельно.
Возможно, после первых опытов работы с фильтрами у вас возник соблазн фильтровать не только успеваемость студентов, но и сами списки студентов по группам. Имейте ввиду что для подобных действий потребуется добавление в проект (а точнее на форму DataModule1) еще одного объекта SimpleDataSet. В противном случае у Вас ничего не получится.
Достаточно близка функции фильтрации функция поиска по заданному полю данных. Поиск осуществляется с помощью метода Locate, имеющего следующий прототип:
function Locate(const KeyFields: string; var KeyValues: Variant; Options: TLocateOptions): Boolean;
Первый параметр –список полей, для поиска (перечисляются через точку с запятой в одной на всех паре апострофов), второй параметр значения этих полей, третий параметр- флаги, указывающие на тонкие настройки поиска. функция возращает true при успешно завершенном поиске и false если ничего не найдено. Флагов может быть всего два:
loCaseInsensitive - признак нечувствительность к регистру
loPartialKey – признак поиска по фрагменту начала строки, в частности при поиске ‘Тол’ удовлетворять условию будут ‘Толстой’, ‘Толяновский’, ‘Толкиен’ и т.п.
Поиск останавливается, как только будет найдена первая запись, удовлетворяющая условию поиска.
Для организации функции поиска добавим на форму (точнее на закладку «Студенты и оценки») следующие компоненты: Кнопку(Button), группу переключателей (RadioGroup) и поле ввода Edit. Зададим им имена SearchButton, SearchRadio и SearchEdit соответственно. В компоненте SearchRadio в свойстве «Items» добавим две строчки («Фамилия» и «Шифр»). Расположение компонентов на форме проведите по своему вкусу. Для компонента SearchButton напишите следующий обработкик события нажатия:
Var s: string;
Begin
Case SearchRadio.ItemIndex of
0: s:= 'surname';
1: s:= 'st_bilet';
End; // of case
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.