Components for Delphi and C++ Builder.

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

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




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

Зарегистрирован: 16 май 2022, 14:16
Сообщений: 5
Добрый день!

Delphi 10.3, EhLib 9.4.019
TOraQuery - TDataSetDriverEh - TMemTableEh - TDBGridEh
uses EhLibODAC, EhLibMTE, MemTableEh, DataDriverEh
STFilter.Local:=True;
STFilter.Visible:=True;

Запрос возвращает ~9000 строк, 3 поля: 2 числовых, 1 текстовое

При установке большого строкового фильтра на числовое поле в функции GetNodeResult в модуле MemTableDataEh возникает ошибка "STACK OVERFLOW".

Есть ли какие нибудь ограничения на размер текста фильтра или на количество значений в нем?


Вложения:
Комментарий к файлу: Ошибка
Error.png
Error.png [ 4.67 KiB | Просмотров: 1740 ]
Комментарий к файлу: Текст фильтра
TestSTFilter.zip [20.84 KiB]
Скачиваний: 85
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 май 2022, 23:06 
Не в сети

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

Простым исправлением данную ошибку, к сожалению, не исправить.

Вариантов несколько:

1. Увеличить размер стека программы в настройках проекта - Linking - Maximum Stack Size.

2. Перейти на версию библиотеки EhLib.VCL 10.2.
В этой версии выводиться сообщение если выбрано больше 1000 значений в выпадающем списке.

3. Доработать класс FilterDropDownFormsEh.TFilterDropDownForm самому добавив проверку при закрытии окна фильтра.
procedure TFilterDropDownForm.bOkClick(Sender: TObject);

4. Переписать стандартный VCL класс Data.DBCommon.TFilterExpr, чтобы в нем не использовался стек вызовов при формировании фильтра на основе списка.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 май 2022, 05:32 
Не в сети

Зарегистрирован: 23 мар 2017, 13:41
Сообщений: 70
Тут проблема еще в том, что пользователи любят поступать так:
Выбирають дохрелион записей
Применяют фильтр выбирая все значения, но снимая галочку с "Пустые значения"
И вуаля


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 май 2022, 00:03 
Не в сети

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

Скорее всего вам придется убедить пользователей разлюбить <Применять фильтр выбирая все значения, снимая галочку с "Пустые значения">
И использовать меню, (Условие…) “не пусты” .

Даже если увеличивать размер стека, то фильтрация данных на больших списках будет работать слишком медленно.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 май 2022, 04:32 
Не в сети

Зарегистрирован: 16 май 2022, 14:16
Сообщений: 5
Добрый день!

1. Размер стека я увеличил еще до обращения на форум.
2. В нашем приложении есть возможность гибкой фильтрации и на уровне базы данных. Но, к сожалению, не удается убедить некоторых пользователей пользоваться этими возможностями, им удобнее фильтровать без переоткрытия отчета.

Всем спасибо за ответы!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 май 2022, 13:27 
Не в сети

Зарегистрирован: 16 май 2022, 14:16
Сообщений: 5
Добрый день!

Цитата:
4. Переписать стандартный VCL класс Data.DBCommon.TFilterExpr, чтобы в нем не использовался стек вызовов при формировании фильтра на основе списка.


Переполнение стека возникает не при формировании фильтра, а в функции MemTableDataEh.GetNodeResult (см. скрины конца и начала стека). Строка фильтра к этому моменту уже сформирована и присвоена.


Вложения:
Комментарий к файлу: Начало стека
Стэк ошибки 3_2.png
Стэк ошибки 3_2.png [ 246.62 KiB | Просмотров: 1587 ]
Комментарий к файлу: Конец стека
Стэк ошибки 3_1.png
Стэк ошибки 3_1.png [ 175.27 KiB | Просмотров: 1587 ]
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 май 2022, 13:36 
Не в сети

Зарегистрирован: 16 май 2022, 14:16
Сообщений: 5
Предыдущие скрины были для Delphi XE.

Вот соответствующие Delphi 10.3 и EhLib 9.4.019:


Вложения:
Стэк ошибки 4_2.png
Стэк ошибки 4_2.png [ 178.21 KiB | Просмотров: 1587 ]
Стэк ошибки 4_1.png
Стэк ошибки 4_1.png [ 174.32 KiB | Просмотров: 1587 ]
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 июн 2022, 13:34 
Не в сети

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

Результат ошибки при фильтрации данных действительно виден в методе MemTableDataEh.GetNodeResult с типом ошибки - Переполнение стека.
Но формирование ошибки происходит в VCL классе TFilterExpr, в методе TFilterExpr.SetNodeOp при парсинге выражения фильтрации.

Код:
procedure TFilterExpr.SetNodeOp(Node, Index: Integer; Data: NativeInt);
begin
  PWordArray(PByte(FExprBuffer) + (CANEXPRSIZE + Node +
    CANHDRSIZE))^[Index] := Data;
end;


Когда в операторе работы со списком 'IN (...)' присутствует более примерно 2500 элементов, значение параметра Data становится больше 65535, в переменную массива размерности Word записывается урезанное значение и объект FilterData: TExprData становится не консистентным.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 сен 2022, 09:34 
Не в сети

Зарегистрирован: 16 май 2022, 14:16
Сообщений: 5
Добрый день!

Проблема решена следующим образом:
1. Сделана копия (uDBCommon) системного модуля DBCommon в папку EhLib.
2. В модуле uDBCommon изменена размерность полей для хранения ссылок на DWORD, изменены константы размеров структур для хранения, изменены индексы смещений при обращении к буферу в виде байтового массива.
3. В модулях MemTableEh и MemTableDataEh заменены ссылки с DBCommon на uDBCommon.
4. В модуле MemTableDataEh исправлены индексы смещений при обращении к буферу в виде байтового массива.
5. Перекомпилирована библиотека EhLib150.bpl.

Примечание:
Переполнение стека или ошибки конвертации значений (если урезанная ссылка указывает на область памяти с некорректным форматом) могут появляться и при количестве значений в фильтре меньше 1000. Были случаи, когда это наблюдалось при количестве значений = 928. Все завит от смещения данных, которое передается в процедуру SetNodeOp. Поймать момент переполнения можно если сделать п.1, п.3, а в начале процедуры SetNodeOp написать if Data>=$FFFF then ShowMessage('Переполнение');


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 сен 2022, 18:01 
Не в сети

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

В EhLib 10.2 аналогичная проблема решена без изменения исходников.
В выпадающее окно фильтра грида введено настраиваемое ограничение на максимальное количество выбранных строк для фильтрации.

_________________
Best regards
EhLib support Team


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

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


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

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


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

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