"EhLib.Com"
https://forum.ehlib.com/ru/

Ошибка при множественном локальном фильтре в EhLibADO
https://forum.ehlib.com/ru/viewtopic.php?f=4&t=2966
Страница 1 из 1

Автор:  ADSoft [ 30 июн 2020, 08:53 ]
Заголовок сообщения:  Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

На всех версиях EhLib 9.5 (вплоть до 9.5.20) в EhLibADO при указании более одного значения в фильтре (фильтр локальный) происходит ошибка "Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом".

Как воспроизвести:
1. Запускаем пример Demos\DBGridEh.SortNFilter.ADOQuery\Project1.dpr
2. Нажимаем на кнопку "Filter is on Server", после чего надпись на ней изменяется на "Filter is on Client"
3. В сетке в стоке фильтра в поле "OrderNo" вводим "in (12,27)" (без двойных кавычек) и нажимаем Enter
4. Получаем вышеописанную ошибку
5. Тоже самое происходит в любом другом поле при указании или выборе более одного значения для фильтрации

На версии EhLib 9.4.022 всё работало.
Исправьте, пожалуйста.

Автор:  EhLibSupport [ 30 июн 2020, 15:44 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

Ошибку исправим в следующей сборке.
Спасибо за информацию.

Автор:  ADSoft [ 14 июл 2020, 08:05 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

Спасибо, работает.

Автор:  ADSoft [ 24 июл 2020, 11:29 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Рано обрадовался :(
Всё замечательно работает, но только для TADOQuery. Стоит только его заменить на TADODataSet, так выскакивает та же самая ошибка.
Решается добавлением в секцию initialization EhLibADO следующей строки:
RegisterDatasetFeaturesEh(TADOSQLDatasetFeaturesEh, TADODataSet);
Исправьте, пожалуйста, в следующей сборке.
Заранее, спасибо!

p.s. для TADOStoredProc и TADOTable та же картина

Автор:  ADSoft [ 28 июл 2020, 15:27 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

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

Как воспроизвести:
1. Запускаем пример Demos\DBGridEh.SortNFilter.ADOQuery\Project1.dpr
2. Нажимаем на кнопку "Filter is on Server", после чего надпись на ней изменяется на "Filter is on Client"
3. В сетке в стоке фильтра в поле "CustNo" вводим "=9" (без двойных кавычек) и нажимаем Enter
4. Всё отлично фильтруется
5. В сетке в стоке фильтра в поле "OrderNo" вводим "in(209,7)" (без двойных кавычек) и нажимаем Enter
6. Получаем вышеописанную ошибку

Это происходит из-за особенностей фильтрации набора данных в ADO, который наглядно описан здесь.
Вот выдержка из вышеуказанной статьи:
* Приоритет между AND и OR не существует. Предложения могут быть сгруппированы в круглые скобки. Однако нельзя сгруппировать предложения, соединенные OR, а затем объединить группу с другим предложением с оператором AND, как в следующем фрагменте кода:
(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
* Вместо этого этот фильтр следует создать так:
(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')

Т.к. баг давний (точнее изначальный), то исправьте, пожалуйста, сначала баг с TADODataSet, описанный постом выше, а потом, если будет время, то и этот.
Заранее, спасибо!

Автор:  ADSoft [ 06 авг 2020, 11:53 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Версия 9.5.024 - воз поныне там ...
Исправьте, хотя бы, множественную фильтрацию в TADODataSet, пожалуйста!

Автор:  ADSoft [ 10 авг 2020, 13:26 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Большое спасибо!
В версии 9.5.026 баг с множественной фильтрацией в одной колонке для TADODataSet, TADOTable и TADOStoredProc исправлен!
Остался баг со смешанной фильтрацией, но, как я и писал выше, он древний. Если(когда) руки дойдут, пожалуйста, сообщите в данной ветке.
Заранее, спасибо!

Автор:  ADSoft [ 30 дек 2020, 12:11 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Стесняюсь спросить, а проблема со смешанной фильтрацией в ADO, описанная выше, стоит на повестке (дня, недели, месяца, года ...)?
Заранее, спасибо!

Автор:  EhLibSupport [ 17 янв 2021, 02:22 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

В сборке EhLib.VCL 10.0 Build 10.0.030 добавили возможность фильтрации SFTilter через событие TDataSet.OnFilterRecord в обход свойства TDataSet.Filter.
Пока в эксперементальном режиме.
Новый вид фильтрации не должен зависет от особенностей работы свойства TDataSet.Filter в разных ДатаСетах.

Для активизации и проверки данной возможности необходимо в модуле EhLibADO раскомментировать строку
//Result := lfawEventFilterEh;
в
function TADOSQLDatasetFeaturesEh.GetLocalFilterApplyingWay: TLocalFilterApplyingWayEh;
и
function TADOCommandTextDatasetFeaturesEh.GetLocalFilterApplyingWay: TLocalFilterApplyingWayEh;

Автор:  ADSoft [ 17 янв 2021, 13:20 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

Да, в 10.0.030 при
//Result := inherited GetLocalFilterApplyingWay;
Result := lfawEventFilterEh;
выше описанный случай работает, спасибо!
Но, перестаёт работать локальный фильтр в подставляемом поле CustNameLookup.
Если в данном поле в строке фильтра ввести, например, ='Unisco' и применить фильтр (или выбрать Unisco из выпадающего списка), то выходит ошибка 'Не могу преобразовать вариант типа (String) в тип (Double)'.
Если вернуть
Result := inherited GetLocalFilterApplyingWay;
//Result := lfawEventFilterEh;
то, соответственно, всё как раньше и в CustNameLookup фильтр работает.
Поправьте, пожалуйста и, думаю, в EhLibADO Result := lfawEventFilterEh можно будет включить по умолчанию.

Заранее, спасибо!

Автор:  ADSoft [ 16 фев 2021, 08:40 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

В 10.0.031 всё работает.

Спасибо!

Автор:  ADSoft [ 19 апр 2021, 12:48 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

Ещё один вопрос, если можно.
Раньше для своих нужд, при Result := inherited GetLocalFilterApplyingWay, я перекрывал TADODataSet.SetFilterText.
Теперь, при Result := lfawEventFilterEh, отладчик туда не заходит.
Отсюда вопрос - что и где теперь можно перекрыть, чтобы настроить фильтрацию под свои нужды (например, заменить * на %)?

Заранее, спасибо за ответ!

Автор:  EhLibSupport [ 24 апр 2021, 23:50 ]
Заголовок сообщения:  Re: Ошибка при множественном локальном фильтре в EhLibADO

Добрый день.

Добавили подобную возможность в сборку EhLib.VCL 10.0 Build 10.0.035.
Для смены символа подстановки фильтра используйте виртуальные методы
Код:
    function CustomFilterSingleCharWildcard: String; virtual; //SingleChar Wildcard
    function CustomFilterMultipleCharsWildcard: String; virtual; //MultipleChar Wildcard

класса TDatasetFeaturesEh

Пример реализации изменения символов подстановки приведен ниже:

Код:
...
type
  TMyADOSQLDatasetFeaturesEh = class(TADOSQLDatasetFeaturesEh)
    function CustomFilterSingleCharWildcard: String; override;
    function CustomFilterMultipleCharsWildcard: String; override;
  end;

{ TMyADOSQLDatasetFeaturesEh }

function TMyADOSQLDatasetFeaturesEh.CustomFilterMultipleCharsWildcard: String;
begin
  Result := '*';
end;

function TMyADOSQLDatasetFeaturesEh.CustomFilterSingleCharWildcard: String;
begin
  Result := '?';
end;
...
initialization
  RegisterDatasetFeaturesEh(TMyADOSQLDatasetFeaturesEh, TADOTable);
end.

Страница 1 из 1 Часовой пояс: UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/