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

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

Версия 13:44, 15 июля 2008

TRecordKind = (rkRecord, rkGroup, rkHeader, rkFooter, rkHiddenRecord, rkHiddenFooter);
Персональные инструменты
Пространства имён

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