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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
Строка 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 -- список полей для вычисления агрегатных значений и агрегатных функций.

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

  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, то высвобождаем его тоже.

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

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