Группировка записей в наборе данных (постановка)
Материал из GedeminWiki
Версия от 23:46, 9 июня 2007; SYSDBA (обсуждение | вклад)
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, то высвобождаем его тоже.