Может быть, эта ссылка будет полезна: Группировка и агрегаты
Редактировать:
Я думаю, что у меня есть, это заняло у менядостаточно времени, и это был неприятный опыт;)
Я сделал пример проекта.
Во-первых, агрегат без фильтрации:
![Aggregate without filtering](https://i.stack.imgur.com/HnKXV.png)
Во-вторых, совокупность после нажатия кнопки:
![Aggregate with filtering](https://i.stack.imgur.com/Gb69T.png)
Это тот эффект, который вы хотели?
Обратите внимание, что мне не удалось достичьЭтот эффект с использованием SetRange (), я использовал вместо этого свойство Filter.
Как добиться:
- Создать индекс для некоторого поля, GroupingLevel должен быть 0.
- Установите этот индекс как свойство TClientDataset.IndexName.
- Создайте агрегат с GroupingLevel = 0 и Expression наподобие SUM (YourFieldName), в моем случае это был SUM (Population).
- В свойстве IndexName напишите созданный вами индекс.
- Установите агрегат на активный во время разработки, (sнастройка во время выполнения, похоже, не работает).
Мой код после нажатия кнопки:
cdsMain.Filter := 'Population <= 100';
cdsMain.Filtered := True;
if not VarIsNull(cdsMain.Aggregates[0].Value) then
lblAggregatedPopulation.Caption := 'Aggregated population: ' + IntToStr(cdsMain.Aggregates[0].Value);
Обратите внимание, что в фильтре вы можете легко изменить условие для достижения того же самогорезультат как для SetRange.Однако я читал, что SetRange быстрее фильтрует данные.
Надеюсь, это поможет:)