О том, что такое агрегатные функции SQL, я писал в другом посте. Там более менее подробно разобрал работу этих функций на примере клиента MySQL.exe.
В данном посте посмотрим как можно пользоваться агрегатными функциями СУБД MySQL из клиента Delphi. Итак, начало клиента в Delphi у меня получилось таким…
На этот раз соединение с MySQL сделал по технологии DBExpress, но не через SimpleDataSet, а через ClientDataSet (для разнообразия). Получилась более длинная цепочка, но и ClientDataSet обладает большими возможностями. В частности, нам нужно будет создавать агрегатные поля, а это умеет ClientDataSet, в то время как SimpleDataSet – не умеет.
Единственное, что долго искал при подключении – как соединить ClientDataSet с предыдущим компонентом, оказалось, через свойство ProviderName.
Итак, по шагам, что нам нужно, чтобы создать агрегатное поле в Delphi. Жмем правой кнопкой мыши на ClientDataSet и заходим в FieldEditor…
Жмем на белом поле правой кнопкой и далее New Field…
В следующем окне выбираем Aggregate, а также заполняем другие поля – Name, поле Component заполнится автоматически. Жмём Ок. То есть Delphi будет воспринимать агрегатное поле как компонент, к которому мы, в дальнейшем сможем обратиться.
В объектном инспекторе находим наше поле как компонент
Свойства Active и Visible ставим в True. Далее, описываем нашу агрегатную функцию в свойстве Expression. Я выбрал SUM (SalesAmount), где SalesAmount имя поля таблицы моей базы данных с типом данных INT.
Вывод значения агрегатного поля
Итак, попробуем вывести значение агрегатного поля в Label1, в обработчик нажатия кнопки, я поставил такой код…
Label1.Caption:=label1.Caption+’ – ‘+ClientDataSet1MyAggField.AsString;
В результате, получилось так…
Итак, если проделать ряд действий, то можно отобразить агрегатное поле прямо в DBGrid… таблице – отдельной колонкой
Для этого нужно правой кнопкой мыши нажать на DBGrid1, зайти в Coloumns Editor, добавить колонку и в свойстве FieldName этой колонки прописать имя созданного агрегатного поля…
На данном моменте пост про агрегатные поля в Delphi заканчиваю. Стоит отметить свойство Grouping Level. Вот что я нашёл, по данным сайта.
Свойство
property GroupingLevel: Integer;
Задает уровень группировки полей набора данных при вычислении. При значении 0 расчет проводится для всех записей набора данных. При значении 1 записи группируются по первому полю набора данных и расчет осуществляется для каждой группы. При значении 2 записи разбиваются на группы по первому и второму полям и т. д.
Однако группировка по уровням выше нулевого возможна, только если в наборе данных используется индекс по группирующим полям. Например, если свойство GroupingLevel = 2 и набор данных начинаются с полей СustNo и orderNo, в свойстве indexName компонента набора данных и свойстве