Группировка записей в наборе данных (постановка)

Материал из GedeminWiki
Перейти к: навигация, поиск

TIBDataSet содержит полученные с сервера записи во внутреннем кэше. Предлагается добавить метод Group в секцию public для группировки записей по указанным полям с подсчетом агрегатных значений.

 procedure Group(const AGroupFields: String; const AnAggFields: String);

где:

  • AGroupFields -- список имен полей для группировки. Разделитель запятая.
  • AnAggFields -- список полей для вычисления агрегатных значений и агрегатных функций.

Внутренняя реализация

  1. Сортируем записи во внутреннем кэше FBufferCache;
  2. Выделяем память под буфер со сгруппированными записями FGroupBufferCache;
  3. Группируем записи из FBufferCache и помещаем результат в FGroupBufferCache;
  4. Сохраняем ссылку на FBufferCache в переменной FSavedBufferCache;
  5. Присваиваем указателю FBufferCache значение FGroupBufferCache;
  6. Вызываем Resync.

Операции редактирования, вставки, удаления, считывания с сервера блокируем, если находимся в режиме группировки, т.е. FGroupBufferCache <> nil.

Отмена группировки

  1. Присваиваем указателю FBufferCache значение FSavedBufferCache;
  2. Высвобождаем память FGroupBufferCache;
  3. Вызываем Resync.

Высвобождение памяти

Там, где удаляется (освобождается) память под FBufferCache, проверяем FGroupBufferCache и, если не nil, то высвобождаем его тоже.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты