Иллюстрированный самоучитель по Delphi 7 для профессионалов

Внутренние вычисляемые поля. Агрегатные поля.

Помимо простых вычисляемых полей существуют внутренние вычисляемые поля (FieldKind = fkinternaicaic). Они используются в клиентских наборах данных (компоненты TClientDataSet) и отличаются тем, что их значения сохраняются в наборе данных.

Внутренние вычисляемые поля могут быть использованы для фильтрации методом – обработчиком OnFilterRecord.

Агрегатные поля

Агрегатные поля предназначены для выполнения вычислительных операций со значениями полей набора данных с использованием агрегатных функций SQL. К таким функциям относятся:

  • AVG – вычисляет среднее значение;
  • COUNT – возвращает число записей;
  • MIN – вычисляет минимальное значение;
  • МАХ – вычисляет максимальное значение;
  • SUM – вычисляет сумму.

Агрегатные поля не входят в структуру полей набора данных, т. к. агрегатные функции подразумевают объединение записей таблицы для получения результата. Следовательно, значение агрегатного поля нельзя связать с какой-то одной записью, оно относится ко всем или группе записей.

Использование агрегатных полей возможно только в компоненте TClientDataSet и его аналогах, т. к. он обеспечивает кэширование данных, необходимое для проведения вычислений (см. гл. 22).

Агрегатные поля не отображаются вместе со всеми полями в компонентах TDBGrid, в Редакторе полей они расположены в отдельном списке, а их свойство index (см. выше) всегда имеет значение -1. Для представления значения агрегатного поля можно воспользоваться одним из компонентов отображения данных, который визуализирует значение одного поля (например, TDBText или TDBEdit), или свойствами самого поля:

Labell.Caption: = MyDataSetAGGRFIELDl.AsString;

Для создания агрегатного поля необходимо использовать команду New field из всплывающего меню Редактора полей.

Для представления агрегатных полей имеется специальный класс TAggregateField.

Его свойство:

property Expression: string;

…задает вычисляемое выражение.

В его состав могут входить агрегатные функции, имена полей набора данных и простейшие арифметические операции:

SUM(Pirce*ItemCount) – SUM(Balance)

Вычисление значения проводится только для тех агрегатных полей, свойство:

property Active: Boolean;

…которых имеет значение True.

Вычисление включенных свойством Active агрегатных полей выполняется только в том случае, если булевское свойство AggregatesActive клиентского компонента набора данных имеет значение True.

По умолчанию экземпляр класса TAggregateFieid создается со свойством Visible = False.

Свойство:

property GroupingLevel: Integer;

…задает уровень группировки полей набора данных при вычислении. При значении 0 расчет проводится для всех записей набора данных. При значении 1 записи группируются по первому полю набора данных и расчет осуществляется для каждой группы. При значении 2 записи разбиваются на группы по первому и второму полям и т. д.

Однако группировка по уровням выше нулевого возможна, только если в наборе данных используется индекс по группирующим полям. Например, если свойство GroupingLevel = 2 и набор данных начинаются с полей СustNo и orderNo, в свойстве indexName компонента набора данных и свойстве:

property IndexName: String;

…объекта агрегатного поля должно быть имя индекса, включающего оба эти поля.

По причине необходимости подключения индексов, уровень группировки выше нулевого возможен только в табличных компонентах.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.