Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 29 мар 2024, 09:36

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: 12 июл 2019, 11:16 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 241
Откуда: Украина, г. Днепропетровск
Hi All,

Delphi 10.2.3
EhLib 9.1.0.43

Есть два MemTableEh - Master и Detail, при хождении по Master, фильтруем Detail.

Проблема в том, что если в Detail установить свойство SortOrder, то при перемещении по Master начинаются сильные тормоза.
Если очистить SortOrder, то фильтрация работает быстро.

В атаче демка с этой ошибкой.

1. Запускаем, жмем Start, двигаемся по Master и наблюдаем тормоза.
2. Очищаем свойство Detail1MemTableEh.SortOrder, запускаем, жмем Start, двигаемся по Master и тормозов нет.

В общем надо исправление этой ошибки.


Вложения:
eh91043_mte_sort_filter.rar [49.61 KiB]
Скачиваний: 73
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 июл 2019, 15:29 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

Попробуйтие вместо кода

Код:
with Detail1MemTableEh do begin
  DisableControls;
  try
    Filtered := False;
    Filtered := True;
  finally
    EnableControls;
  end; { try }
end; { with }

использовать классический код обновления фильтра
Код:
  Detail1MemTableEh.Refresh;
  // Detail1MemTableEh.Filtered должен быть = True

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 июл 2019, 07:33 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 241
Откуда: Украина, г. Днепропетровск
EhLibSupport писал(а):

использовать классический код обновления фильтра
Код:
  Detail1MemTableEh.Refresh;
  // Detail1MemTableEh.Filtered должен быть = True

Честно говоря впервые слышу, что бы Refresh был классическим кодом обновления фильтра, хотя работаю с Delphi начиная еще с Delphi1.
Ну да ладно. В атаче новая демка с замерами скорости.

Перед каждым замером демку запускаем заново и при необходимости комментирую перефильтрацию или Refresh или очищаю/устанавливаю SortOrder.

1)
- с перефильтрацией и сортировкой: время работы: 00:09:25
- с Refresh и сортировкой: время работы: 00:03:01

- с перефильтрацией и без сортировки: время работы: 00:00:13
- с Refresh и без сортировки: время работы: 00:00:11

Из приведенных выше замеров видно, что хотя и Refresh у MTE работает быстрее перефильтрации, но все равно гораздо медленнее, чем без сортировки.
То есть MemTableEh все равно нуждается в исправлении этих тормозов.

2)
Меняем MemTableEh на FDMemTable (FireDAC из поставки Delphi 10.2.3). Все параметры FDMemTable оставляем по умолчанию.
Весь код остается прежний, только вместо SortOrder используем свойство IndexFieldNames.

- с перефильтрацией и сортировкой: время работы: 00:00:08
- с Refresh и сортировкой: время работы: 00:01:12

Из приведенных выше замеров видно:
а) FDMemTable с сортировкой существенно быстрее, чем MemTabeEh. Это еще раз говорит, что MemTabeEh весьма нуждается в ускорении и исправлении этих тормозов.
б) Метод Refresh в случае с FDMemTable оказался заметно медленнее обычной перефильтрации (что на мой взгляд ставит под сомнение, что он является
"классическим кодом обновления фильтра"), но даже в этом случае он почти в три раза быстрее чем MemTableEh.


Вложения:
eh91043_mte_sort_filter2.rar [49.8 KiB]
Скачиваний: 69
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 июл 2019, 03:00 
Не в сети

Зарегистрирован: 17 окт 2016, 13:19
Сообщений: 50
Откуда: Россия, Москва
Stalker4 Утро доброе.

То же использую часто в проектах соединения Masters с Detail у TMemTableEh.

Посмотрел Ваш вариант, изменил соединение таблиц на обычное имеющееся в MemTableEh:
Выставил в Detail1MemTableEh.MasterSource - MasterDataSource, MasterFields - ID, DetailFields - M_ID.
В обработчике кнопки TForm4.StartButtonClick в конце поставил: Detail1MemTableEh.SortByFields('DNAME'); т.е. сортировка по полю DNAME.
Эта сортировка на всю таблицу, даже после перемещения по мастер записям.

Отключил // MasterDataSource.OnDataChange := MasterDataSourceDataChange;

Работает быстро. Смысл тот же. Конечно не знаю дальнейшую логику Вашей программы...
Подскажите, зачем нужна постоянная пересортировка в Detail, после перемещения по Masters? Хватает и одноразовой.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 июл 2019, 07:55 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 241
Откуда: Украина, г. Днепропетровск
as2714 писал(а):
Stalker4 Утро доброе.
Подскажите, зачем нужна постоянная пересортировка в Detail, после перемещения по Masters? Хватает и одноразовой.

А где Вы в моем тестовом проекте нашли постоянную пересортировку ? Ее там нет.
Я просто задействовал штатное средство сортировки - свойство SortOrder. Но в документации нигде не сказано, что оно делает (или не делает) постоянную пересортировку. По идее сортировка должна делаться только при изменении данных Append или Edit (для поля которое участвует в сортировке).

Попробуйте в Вашем варианте теста вместо SortByFields('DNAME'), использовать SortOrder. Скорость по прежнему будет быстрой или начнутся тормоза ?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 июл 2019, 08:30 
Не в сети

Зарегистрирован: 17 окт 2016, 13:19
Сообщений: 50
Откуда: Россия, Москва
Stalker4 писал(а):
Попробуйте в Вашем варианте теста вместо SortByFields('DNAME'), использовать SortOrder. Скорость по прежнему будет быстрой или начнутся тормоза ?

Попробовал, мне показалось немного медленнее стало, с Detail1MemTableEh.SortByFields('DNAME') шустрее.

В справке написано (в вордовском документе установленного EhLib нашел):

Сортировка данных
TMemTableEh имеет два метода сортировки данных:
1. Сортировка с динамической поддержкой изменений, когда добавляемая запись автоматически вставляется в нужную позицию, чтобы сохранить порядок сортировки. Для данной сортировки используйте свойство SortOrder. Несколько полей разделяйте запятой. Для сортировки по убыванию, после названия поля добавляйте слово «DESC». Сортировка происходит на уровне TRecordsViewEh, т.е. физически записи в массиве данных TRecordsListEh не перемещаются.
2. Сортировка без динамической поддержки изменений. Для данной сортировки используйте процедуру SortByFields. Правила формирования строки определяющей сортировку такое же, как и для SortOrder. Сортировка происходит на уровне TRecordsListEh, т. е. записи физически сортируются во внутреннем массиве данных и после этого компонент никак не следит за изменениями.


Вот из первого пункта и сделал такой вывод.
Как записи после вставки или редактирования попасть на нужное место? только повторным вызовом функции сортировки ))

Пусть администратор прокомментирует правильный ответ )))


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 июл 2019, 13:21 
Не в сети

Зарегистрирован: 17 окт 2016, 13:19
Сообщений: 50
Откуда: Россия, Москва
Товарищ EhLibSupport )), что можете сказать по данной теме?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 июл 2019, 06:28 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 241
Откуда: Украина, г. Днепропетровск
as2714 писал(а):
В справке написано (в вордовском документе установленного EhLib нашел):

Сортировка данных
1. Сортировка с динамической поддержкой изменений, когда добавляемая запись автоматически вставляется в нужную позицию


Вот из первого пункта и сделал такой вывод.
Как записи после вставки или редактирования попасть на нужное место? только повторным вызовом функции сортировки ))

Но там ведь четко сказано "добавляемая запись", т.е. сортировать когда произошли изменения в данных, а фильтрация никаких изменений в данные не вносит. А следовательно и пересортировки не должно быть.

Ну и как бы там не было, у FDMemTable установка аналогичной динамической сортировки (свойство IndexFieldNames) ни как на фильтрацию не влияет.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 июл 2019, 07:16 
Не в сети

Зарегистрирован: 17 окт 2016, 13:19
Сообщений: 50
Откуда: Россия, Москва
Stalker4 писал(а):
Но там ведь четко сказано "добавляемая запись", т.е. сортировать когда произошли изменения в данных, а фильтрация никаких изменений в данные не вносит. А следовательно и пересортировки не должно быть.

Ну и как бы там не было, у FDMemTable установка аналогичной динамической сортировки (свойство IndexFieldNames) ни как на фильтрацию не влияет.


Возможно и так. Товарищ EhLibSupport еще не отписался ))
Для решения Вашей задачи SortByFields('DNAME') подошло или принципиально надо использовать SortOrder?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июл 2019, 10:30 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 241
Откуда: Украина, г. Днепропетровск
as2714 писал(а):
Для решения Вашей задачи SortByFields('DNAME') подошло или принципиально надо использовать SortOrder?
Есть еще один минус ручной сортировки.

Если при авто-сортировки (SortOrder) при добавлении записи или при ее редактировании (поле которое входит в сортировку) позиционирование курсора на новые (измененные) данные происходит автоматически, то в случае SortByFields это позиционирования после сортировки надо делать самому после сортировки.

P.S.
В общем очень бы хотелось услышать ответ Дмитрия по поводу тормозов MTE при фильтрации с SortOrder. Эта авто сортировка почему то заметно замедляет фильтрацию MTE. Будет ли делать улучшение этого функционала ?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июл 2019, 19:24 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

Похоже, действительно, присутствует аномальное замедление фильтрации при установленном свойстве SortOrder.
По логике, скорость фильтрации не должна влиять на наличие или отсутствие сортировки.
Будем изучать.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB