Фильтр некорректно работает с обратным слэшем

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов
Закрыто
ANeronov
Сообщения: 2
Зарегистрирован: Ср 05 фев 2014 07:40

Фильтр некорректно работает с обратным слэшем

Сообщение ANeronov » Ср 05 фев 2014 08:31

Если в тексте поля есть обратный слэш "\" и попробовать отфильтровать датасет по этому полю, запись не находится.

Пример:
В датасете есть единственная запись с полем FIELD_1 с текстом 'родитель\ребенок'.

OraQuery1.SQL.Text := 'select ''родитель\ребенок'' as FIELD_1 from dual';
OraQuery1.Open; //Запись есть: OraQuery1.RecordCount = 1.

sValue := OraQuery1.FieldByName('FIELD_1').AsString;
OraQuery1.FilterOptions := [foCaseInsensitive];
OraQuery1.Filter := 'FIELD_1 = ' + sValue;
OraQuery1.Filtered := True;

Запись не находит: OraQuery1.RecordCount = 0.

Подскажите, как исправить ошибку.

ODAC 9.1.3 (проверяли на ODAC 9.2.5 - ошибка присутствует).
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
NLS_CHARACTERSET = AL32UTF8

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Фильтр некорректно работает с обратным слэшем

Сообщение Alexp » Ср 05 фев 2014 14:27

Добрый день,

В текущей версии для решения этой проблемы Вам необходимо либо установить опцию foNoPartialCompare

Код: Выделить всё

OraQuery1.FilterOptions := [foCaseInsensitive, foNoPartialCompare];
либо использовать двойной слеш "\\"? так как одинарный символ слеша используется для экранирования специальных символов (%,*,_).
В следующем билде это поведение будет исправлено, слеш будет экранировать только спец-символы

ANeronov
Сообщения: 2
Зарегистрирован: Ср 05 фев 2014 07:40

Re: Фильтр некорректно работает с обратным слэшем

Сообщение ANeronov » Ср 05 фев 2014 15:05

Спасибо, ваш совет помог.

Для тех, у кого возникнет подобная ситуация, разъясню, что пришлось сделать.
Пример, который я привел, просто иллюстрирует эту ошибку. На самом деле ошибка была в использовании гридов DevExpress. Они имеют встроенную фильтрацию колонок.
У их TcxGridDBTableView есть свойство DataController.Filter.AutoDataSetFilter. Если оно стоит False, то фильтрация происходит средствами самого грида, если стоит True, то фильтруется датасетом.
Если установить свойство DataController.Filter.AutoDataSetFilter в True, то у датасета сбрасываются FilterOptions. Пришлось немного поправить исходный код компонентов DevExpress (procedure TcxDBDataFilterCriteria.Update). Имейте это ввиду.

Закрыто