Создание простейшего клиента БД в Delphi. Краткое описание интерфейса Turbo Delphi 2006. Примитивная программа работы с БД, страница 6

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