При работе с TClientDataset в Delphi XE7 вы можете столкнуться с проблемой, когда сводные поля (aggregate fields) не рассчитываются правильно после изменения имени индекса (IndexName) в целях сортировки грида. После изменения индекса сводные поля могут получить значение Null.
Эта проблема связана с методом TCustomClientDataSet.SetIndex в единице DBClient. К счастью, найдено решение, которое позволяет решить эту проблему.
Подтвержденное решение
После поиска в интернете было найдено решение, которое помогло решить проблему. Оно заключается в замене следующего кода в методе TCustomClientDataSet.SetIndex:
if FAggregatesActive then
begin
FAggFieldsInit := False;
ResetAllAggs(FAggregatesActive);
end;
На следующий:
if FAggregatesActive then
begin
CloseAggs;
ResetAllAggs(FAggregatesActive);
end;
Изменение кода заключается в замене FAggFieldsInit := False на CloseAggs. Это заставляет сводные поля освобождаться и пересчитываться с новым индексом. Решение было найдено на форуме Devart и его автором является AndreyZ.
Пример кода
Вот пример, демонстрирующий, как применить это решение в вашем коде:
procedure TForm1.FormCreate(Sender: TObject);
begin
// Создайте TClientDataset и подключите его к гриду
ClientDataSet1 := TClientDataset.Create(Self);
DBGrid1.DataSource := ClientDataSet1;
// Добавьте сводные поля в TClientDataset
ClientDataSet1.FieldDefs.Add('Field1').DataType := ftFloat;
ClientDataSet1.FieldDefs.Add('Field2').DataType := ftFloat;
ClientDataSet1.FieldDefs.Add('SumField', ftFloat, 0).Aggregation := agSum;
ClientDataSet1.CreateDataSet;
// Заполните данные в TClientDataset
ClientDataSet1.Append;
ClientDataSet1['Field1'] := 10;
ClientDataSet1['Field2'] := 20;
ClientDataSet1.Post;
ClientDataSet1.Append;
ClientDataSet1['Field1'] := 30;
ClientDataSet1['Field2'] := 40;
ClientDataSet1.Post;
// Измените индекс для сортировки грида
ClientDataSet1.IndexName := 'Index1';
ClientDataSet1.IndexDefs.Add;
ClientDataSet1.IndexDefs['Index1'].Fields.Add('Field1');
ClientDataSet1.ApplyIndexDef('Index1');
// Примените решение для сводных полей
TCustomClientDataSet(ClientDataSet1).CloseAggs;
TCustomClientDataSet(ClientDataSet1).ResetAllAggs(True);
end;
После применения этого решения сводные поля должны правильно рассчитываться даже после изменения индекса в целях сортировки грида.
Решение проблемы со сводными полями в TClientDataset в Delphi XE7.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.