Группировка записей в наборе данных (постановка)
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
| Строка 6: | Строка 6: | ||
* AGroupFields -- список имен полей для группировки. Разделитель запятая. | * AGroupFields -- список имен полей для группировки. Разделитель запятая. | ||
| − | * AnAggFields -- список полей для вычисления агрегатных значений. | + | * AnAggFields -- список полей для вычисления агрегатных значений и агрегатных функций. |
=== Внутренняя реализация === | === Внутренняя реализация === | ||
| + | |||
| + | # Сортируем записи во внутреннем кэше FBufferCache; | ||
| + | # Выделяем память под буфер со сгруппированными записями FGroupBufferCache; | ||
| + | # Группируем записи из FBufferCache и помещаем результат в FGroupBufferCache; | ||
| + | # Сохраняем ссылку на FBufferCache в переменной FSavedBufferCache; | ||
| + | # Присваиваем указателю FBufferCache значение FGroupBufferCache; | ||
| + | # Вызываем Resync. | ||
| + | |||
| + | Операции редактирования, вставки, удаления, считывания с сервера блокируем, если находимся в режиме группировки, т.е. FGroupBufferCache <> nil. | ||
| + | |||
| + | ==== Отмена группировки ==== | ||
| + | |||
| + | # Присваиваем указателю FBufferCache значение FSavedBufferCache; | ||
| + | # Высвобождаем память FGroupBufferCache; | ||
| + | # Вызываем Resync. | ||
| + | |||
| + | ==== Высвобождение памяти ==== | ||
| + | |||
| + | Там, где удаляется (освобождается) память под FBufferCache, проверяем FGroupBufferCache и, если не nil, то высвобождаем его тоже. | ||
[[Category: Постановка]] | [[Category: Постановка]] | ||
Версия 23:46, 9 июня 2007
TIBDataSet содержит полученные с сервера записи во внутреннем кэше. Предлагается добавить метод Group в секцию public для группировки записей по указанным полям с подсчетом агрегатных значений.
procedure Group(const AGroupFields: String; const AnAggFields: String);
где:
- AGroupFields -- список имен полей для группировки. Разделитель запятая.
- AnAggFields -- список полей для вычисления агрегатных значений и агрегатных функций.
Внутренняя реализация
- Сортируем записи во внутреннем кэше FBufferCache;
- Выделяем память под буфер со сгруппированными записями FGroupBufferCache;
- Группируем записи из FBufferCache и помещаем результат в FGroupBufferCache;
- Сохраняем ссылку на FBufferCache в переменной FSavedBufferCache;
- Присваиваем указателю FBufferCache значение FGroupBufferCache;
- Вызываем Resync.
Операции редактирования, вставки, удаления, считывания с сервера блокируем, если находимся в режиме группировки, т.е. FGroupBufferCache <> nil.
Отмена группировки
- Присваиваем указателю FBufferCache значение FSavedBufferCache;
- Высвобождаем память FGroupBufferCache;
- Вызываем Resync.
Высвобождение памяти
Там, где удаляется (освобождается) память под FBufferCache, проверяем FGroupBufferCache и, если не nil, то высвобождаем его тоже.