Объекты-агрегаты

Для вычисления агрегатных выражений для всех записей набора данных используются объекты класса TAggregate. Индексированный список этих объектов содержится в свойстве

property Aggregates: TAggregates;

компонента TClientDataSet. Прямым предком класса TAggregates является класс TCollection, поэтому для него можно использовать все основные приемы работы с коллекциями (см. гл. 7).

Для создания нового агрегата необходимо щелкнуть на кнопке свойства в Инспекторе объектов и, в появившемся Редакторе агрегатов, выбрать пункт Add во всплывающем меню или щелкнуть на кнопке Add New (рис. 22.3).

Новый агрегат может быть добавлен и динамически:

var NewAgg: TAggregate;

NewAgg := ClientDataSet.Aggregates.Add;

Рис. 22.3. Редактор агрегатов компонента TClientDataSet

Рассмотрим свойства класса TAggregate.

Имя агрегата содержится в свойстве

property AggregateName: string;

которое может быть использовано при отображении агрегата в визуальных компонентах.

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

property Expression: String;

Например, для таблицы COUNTRY.DB из демонстрационной базы данных Delphi можно вычислять общую площадь государств Северной и Южной Америки (площадь государства содержится в поле Area):

ClientDataSet.Aggregates[Somelndex].Expression := 'SUM(Area)';

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

property Active: Boolean;

а вычисленное значение возвращает функция

function Value: Variant;

Если пользователь редактирует набор данных, то для всех включенных агрегатов (Active = True) возвращаемое значение автоматически пересчитывается.

Например, после сохранения изменений в наборе данных можно визуализировать новое значение агрегата:

SomeLabel.Caption := ClientDataSet.Aggregates[0].AggregateName; 

SomeEdit.Text := ClientDataSet.Aggregates[0].Value;

Для проверки активности агрегата, помимо проверки значения свойства Active, можно также использовать свойство

property InUse: Boolean;

Если оно возвращает значение True — вычисляемое выражение агрегата рассчитывается.

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

property Visible: Boolean;

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

property AggregatesActive: Boolean; 

необходимо присвоить значение False.

Если же AggregatesActive = True, вычисляются только активные агрегаты, для которых свойство Active имеет значение True.

Если вам необходимо использовать все активные агрегаты, то вместо их последовательного перебора с проверкой свойства Active можно использовать свойство

property ActiveAggs[Index: Integer] : TList;

компонента TClientDataSet, которое представляет собой список активных агрегатов.