Вычисляемые поля – это виртуальные поля, которые формируются динамически в процессе выполнения программы. В базе данных вычисляемые поля не сохраняются. Вычисляемое поле формирует для каждой записи базы данных значение, получаемое по какой-либо формуле из значений других полей для той же самой записи. Например, имеется БД с полем «Количество товара» и полем «Цена товара». Необходимо определить стоимость каждого товара. Для определения стоимости нужно для каждой записи находить произведение значений из поля «Количество товара» и поля «Цена товара». Введение вычисляемого поля в компонент «Table» позволяет автоматизировать эту задачу: у каждой записи появится новое поле, содержащее готовое произведение цены товара на его количества. Рассмотрим на примере как это сделать.
Нанесем на форму компонент «Table». Настроим у него путь к БД и имя таблицы. Откроем базу данных, установив свойству «Active» значение «True». После этого щелкнем на компоненте «Table» правой кнопкой мыши. В появившемся меню выберем опцию «Fields Editor». Откроется окно редактора полей. В редакторе полей нажмите правую кнопку мыши и выберите пункт «Add all fields». После этой команды в редакторе полей появится список из имеющихся полей в базе данных, скажем, поля «Cena» и «Kolichestvo». Эти два поля являются физическими полями, хранящимися в файле базы данных.
Создадим дополнительное вычисляемое поле «Summ» у компонента «Table». Для этого в редакторе полей нужно щелкнуть правой кнопкой мыши и выбрать пункт «New Field». Откроется окно создания нового поля. Зададим параметру «Name» имя создаваемого вычисляемого поля, – «Summ». Тип поля зададим в параметре «Type». Выберем денежный тип «Currency». После этого укажем в разделе «Field type» значение «Calculated». Это означает, что создаваемое поле будет вычисляемого вида. Нажмем теперь на кнопку «Ok». Вычисляемое поле создано. Данное поле имеет имя «Summ», а полное имя будет «Table1Summ». Полное имя поля можно посмотреть, выбрав в редакторе полей нужное поле и посмотреть его свойство «Name» в инспекторе объектов.
После создания вычисляемого поля необходимо описать алгоритм его формирования. Для этого нужно в Инспекторе Объектов найти событие «OnCalcFields» для компонента «Table» (в котором создано вычисляемое поле) и создать для данного события обработчик (обработчик создается двойным щелчком по белому пространству, напротив от названия события).
В созданной пустой процедуре-обработчике вычисляемых полей компонента «Table» напишем следующую строку:
Table1Summ . Ascurrency := Table1Cena . Ascurrency * Table1Kolichestvo . Ascurrency;
В обработчике вычисляемых полей можно обращаться к полям только текущей записи, причем поля должны быть записаны в полной форме, т.е. нужно писать не «Summ», а «Table1Summ». После имени поля через точку указывается его тип. Команды перемещения по записям в БД, удаления записей, вставки и др. команды не допустимы в обработчике вычисляемых полей.
В основное программе вычисляемые поля можно использовать только для чтения. Присваивать значение или изменять его в основной программе нельзя. Все операции по корректировки вычисляемых полей должны производится в обработчике «OnCalcFields» компонента «Table».
Если в компоненте «Table» создано несколько вычисляемых полей, то все их алгоритмы формирования описываются в одном и том же обработчике события «OnCalcFields», например:
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
Table1Summ . Ascurrency := Table1Cena . Ascurrency * Table1Kolichestvo . Ascurrency;
Table1Summ2 . Ascurrency := (Table1Cena . Ascurrency * Table1Kolichestvo . Ascurrency) – Table1Nalog . Ascurrency;
end;
Схема создания вычисляемого поля:
Table1 -> Active -> Fields Editor -> Add All Fields -> New Field:
Name: Summ, Field Type: Calculated, Type: Currency
Фильтрация записей в базе данных позволяет временно делать невидимыми записи, которые не удовлетворяют заданному условию. При включении режима фильтрации база данных будет состоять только из записей, соответствующих заданному условию, это отразится на всех командах поиска, просмотра и перемещения, хотя физически база данных не изменяется на диске.
Для включения режима фильтрации необходимо установить в «True» значение свойства «Filtered» у компонента «Table». Значение «False» свойства «Filtered» выключает режим фильтрации базы данных. Перед включением режима фильтрации необходимо указать условие («фильтр») для отбора записей. Для установки фильтра служит свойства «Filter».
Фильтр может содержать символ «*», означающий любое количество любых символов. Кроме этого в фильтре допускаются операторы «AND» и «OR».
Свойство «FilterOptions» служит для установки параметров фильтрации. Значение «foCaseInsensitive » служит для выключения (true=буквы без различия регистра, false=буквы с различием регистра) различия регистра букв, а значение «foNoPartialCompare» служит для включения режима, при котором символ «*» в фильтре является просто символом «*», а не любым количеством любых символов (false=* знак замены, true=* просто символ). По умолчанию данные параметры не установлены: регистр букв различается и * – знак подстановки.
Рассмотрим примеры фильтрации данных:
// Различение режима букв, * – шаблон
Table1.Open;
Table1.Filtered:=false;
Table1.Filter:=’name=’’Сер*’’’;
Table1.FilterOptions:=[];
Table1.Filtered:=true;
for i:=1 to Table1.recordcount do begin
…
end;
* * * * * * *
// Регистр не различается, * – шаблон
Table1.Filtered:=false;
Table1.Filter:=’((name=’’Сер*’’) and (Fam=’’T_л*’’)) or (Fam=’’К*)’;
Table1.FilterOptions:=[foCaseInsensitive];
Table1.Filtered:=true;
* * * * * * *
// Регистр различается, * – символ
Table1.Filtered:=false;
Table1.Filter:=’corporation=’’*TSN*’’’;
Table1.FilterOptions:=[foNoPartialCompare];
Table1.Filtered:=true;