![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Подскажите пожалуйста, как проссумировать колонку в ClientDataSet? тип данных - float.
В принципе, вот такой цикл работает: Код:
While i<>''; Begin i:=i+ClientDataSet1.FieldValues['Field1']; ClientDataSet1.Next; end; Admin: Пользуемся тегами! Но может существует более удобный и быстрый способ? Слышал про вычисляемые поля, но совершенно не понимаю что это такое и с чем его едят. Подскажите пожалуйста, желательно с примером на этом компоненте Заранее спасибо за внимание! |
|
#2
|
|||
|
|||
|
Вычисляемое поле не подойдёт, т.к. берутся данные из текущей записи (т.е. из строки, а не из столбца). Я обычно использую запросы (TQuery). Так, вывести значения можно:
Код:
select * from Table1 order by Field1 Код:
select SUM(Field1) from Table1 |
|
#3
|
|||
|
|||
|
Собственно, вариантов решения 2.
1. искать компонент, который это уже умеет делать (напимер, DevExpress'овский грид дает такую возможность). 2. Фактически делать так, как приведено в вопросе, но с некоторыми исправлениями. Код:
function TQuickViewForm.GetSum(AFieldIdx: Integer): Double;
var
BM : Pointer;
begin
Result := 0;
// сохраняем текущую позицию курсора
BM := cdsData.GetBookmark;
// Блокируем отрисовку визуальных компонентов
cdsData.DisableControls;
// Считаем
cdsData.First;
Try
While Not cdsData.Eof Do
Begin
Result := Result + cdsData.Fields[AFieldIdx].AsFloat;
cdsData.Next;
End;
Finally
// Восстанавливаем текущую позицию курсора
cdsData.GotoBookmark(BM);
cdsData.FreeBookmark(BM);
// Разрешаем отрисовку
cdsData.EnableControls;
End;
end;В принципе, еще можно добавить проверку значения поля на null и прочую ерунду (например, если потом надо считать среднее значение, то заодно можно посчитать кол-во записей реально участвоваших в суммировании). |