Всем привет! Продолжаю рассматривать работу с файловыми базами данных в Delphi. Не знаю, сколько еще статей напишу, но пока что продолжаю. Сегодняшняя статья будет посвящена работе с агрегирующими функциями, а также агрегатными полями. Согласитесь, что агрегирующие функции являются очень полезным инструментарием для разработчиков, тем более, если Ваша база данных является файловой. Вот представьте, что TClientDataSet способен работать с агрегирующими функциями и это при этом, что не используется язык запросов, то есть SQL.
Основное свойство компонента TClientDataSet, где может храниться агрегирующие функции – это свойство Aggregates: TAggregates, в котором и будет храниться вся коллекция агрегатов, то есть агрегирующих функций. Добавлять агрегаты Вы можете как во время выполнения самого приложения, то есть при помощи кода, так и при проектировании своего проекта. Я Вам расскажу, возможно про два способа, один поверхностно (при выполнение программы, укажу только какие свойства и функции за что отвечают), а второй, при проектировании приложения рассмотрим на конкретном примере.
Для начала хочется сказать про свойство AggregatesActive: Boolean компонента TClientDataSet, которое предназначено для централизованного включения или выключения агрегатов, поэтому в первую очередь нам его необходимо установить в True, если мы хотим использовать агрегирующие функции в TClientDataSet.
Функция Add: TAggreate предназначено для добавления нового агрегата, то есть агрегирующей функции, она включает следующие свойства:
- AggregateName: String – здесь можно трактовать свойство как угодно: имя агрегата, пояснительная надпись, его описание и так далее
- Expression: String – сюда заносится само выражение, которое содержит агрегирующую функцию
- Active: Boolean – активирует или деактивирует добавленную агрегирующую функцию
Ну, давайте рассмотрим небольшой пример, как можно добавить такую функцию, например на событии OnCreate нашей формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
with ClientDataSet1.Aggregates.Add do
begin
AggregateName:='Сумма';
Expression:='SUM(ID)';
Active:=True;
end;
end;
Если мы затем выведем значение данной функции, то там естественно приложение будет суммировать столбец ID, как вывести это значение, мы рассмотрим чуть-чуть позже.
Это мы рассмотрели способ добавления агрегирующих функций в ходе выполнения программы. Теперь давайте рассмотрим способ добавления при проектировании нашего проекта. Для начала установим свойство AggregatesActive в True (это необходимо было сделать и при методе, что рассматривали выше). Затем выделяем свойство Aggregates и добавляем новый агрегат, выделяем его и устанавливаем свойства в следующий вид:
То есть тоже самое, что и при прошлом методе. В итоге мы сможем посчитать сумму нашего ID столбца. Мы также можем использовать и уровень группировки, который определяется свойством GroupingLevel. То есть, мы можем применять агрегирующую функцию только для тех записей, которые входят в состав индекса, задаваемый свойством IndexName.
Для того чтобы определить готов ли агрегат выдать результат – определяется свойством InUse, а значение результата выполнения агрегата мы можем получить при помощи функции Value: Variant, в итоге, для того, чтобы получить результаты мы напишем следующий код:
procedure TForm1.Button7Click(Sender: TObject);
begin
if ClientDataSet1.Aggregates[0].InUse=true then
ShowMessage(IntToStr(ClientDataSet1.Aggregates[0].value));
end;
Тут все понятно, Вы задаете номер агрегата, результат которого необходимо вывести. Как Вы уже поняли, их может быть масса. Для начала мы проверяем готовность выдать результат, если оно принимает значение True, то выводим его. Вы можете применять и другие агрегирующие функции:
- MIN
- MAX
- COUNT
- AVG
Кроме этого, Вы можете создавать агрегатные поля. Помните, мы рассматривали в первой части, как можно создавать файловую БД, так вот, когда Вы создаете поля, Вам необходимо нажать правой кнопкой мыши по компоненту и из контекстного меню выбрать пункт Fields Editor, после чего, в появившемся окне обратно нажать правой кнопкой мыши и из данного меню выбрать пункт New Field. Далее заполняете просто появившеюся форму:
Не стоит только забывать то, что для вывода значений агрегатных полей не применяют такие компоненты как TDBGrid. Для этих целей используются отдельные поля, например TDBText и так далее.