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