Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с сводными полями в TClientDataset в Delphi XE7

Delphi , Базы данных , Индексы

При работе с 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Индексы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:19:50/0.003018856048584/0