Ошибка при фильтрации в DBGridEh+FIB

sv161
Дата: 16.10.2006 19:18:14
Всем привет.
Есть DBGridEh. У него настроены фильтры: фильтрация не локальная, каждый фильтр связан с отдельным дейтасетом. Всё нормально, но если в фильтре попадается символ '(', то происходит ошибка:
... 'Error in expression: ('...
А если в фильтр ввести только один символ ')', то происходит другая ошибка:
...'Unexpected AND or OR: )'...
Есть подозрение, что эти символы зарезервированы для чего-то.
Помогите плиз разобраться почему эти символы не воспринимаются должным образом.
Петров Алексей
Дата: 16.10.2006 19:23:14

> Есть подозрение, что эти символы зарезервированы для чего-то.
Они зарезервированы для управления приоритетом логических операций,
естественно.
Текст запроса покажите.


Posted via ActualForum NNTP Server 1.3

sv161
Дата: 17.10.2006 11:06:28
Петров Алексей

Текст запроса покажите.

Текст запроса может быть например такой:
select 
  SToCString(SHIFR,'          ') SHIFR,
  SToCString(NGRUP,'          ') NGRUP,
  SToCString(NPOKAZ,'          ') NPOKAZ,
  SToCString2(CHISLIT,'          ') CHISLIT,
  SToCString2(ZNAMET,'          ') ZNAMET,
  SToCString(MNOJIT,'          ') MNOJIT 
from SPPOK
where CHISLIT='F071000[1(1),2]'
SToCString - это UDF функция, которая преобразует любое значение в строку.

Но дело в том, что выполнение программы не доходит до выполнения запроса.
У меня к проекту подключен модуль, который регистрирует объект, отвечающий за фильтрацию и сортировку:
initialization
 RegisterDatasetFeaturesEh( TpFIBDatasetFeaturesEh, TpFIBDataSet );
У этого объекта есть метод:
procedure TpFIBDatasetFeaturesEh.ApplyFilter(Sender: TObject; 
  DataSet: TDataSet; IsReopen: Boolean);
Внутри этого метода происходит формирование SQL-запроса.
Ставлю точку останова внутри этого метода, но до неё выполнение кода не доходит. Т. е. после того как я выбираю элемент из списка фильтрации происходит анализ этой строки (я так предполагаю) внутри самой библиотеки EH. Вот в этот момент и возникает ошибка.
Можно ли отключить как-то этот анализ.
lazy cat1
Дата: 17.10.2006 11:45:28
Да, парсинг фильтра в EhLib работает через два раза на третий. Даже в их штатной демке можно нарваться.
Отключить - никак. Только влезать в исходник. Самое простое, наверное - вводить значение в кавычках.
sv161
Дата: 17.10.2006 13:28:48
lazy cat1
...Только влезать в исходник..

Как нужно редактировать исходник?

Кому-то приходилось редактировать подобные исходники. Поделитесь плиз опытом.
sv161
Дата: 17.10.2006 14:36:25
sv161
lazy cat1
...Только влезать в исходник..

Как нужно редактировать исходник?

Кому-то приходилось редактировать подобные исходники. Поделитесь плиз опытом.


Всем спасибо, уже разобрался. Отредактировал исходник.
Гёрлфренд
Дата: 04.06.2008 13:58:13
2Автор
Можно же ведь было запостить решение, чтоб другим не ковыряться!!!
Было:
unit DBGridEh
...
procedure TCustomDBGridEh.SetFilterValue(DCol: Integer);
var
  Column: TColumnEh;
begin
  if (DCol < 0) or (DCol >= Columns.Count) then
    Exit;
  Column := Columns[DCol];
  if Column.FieldName <> '' then
    Column.STFilter.InternalSetExpressionStr(FilterEdit.Text);
//    if Column.STFilter.KeyField <> ''
//      then Column.STFilter.SetKeyListValues(FilterEdit.Text, FilterEdit.Value)
//      else Column.STFilter.InternalSetExpressionStr(FilterEdit.Text);
end;
Исправленный вариант:
function CheckFilter(AFilterEdit: string): boolean;
begin
  result := true;
  if (Length(AFilterEdit) > 0)
      and (AFilterEdit <> '(Order by ascending)') and (AFilterEdit <> '(Order by descending)')
      and (ANSIPos('(', AFilterEdit) > 0) and (ANSIPos(')', AFilterEdit) > 0) then begin
    result := false;
  end;
end;

procedure TCustomDBGridEh.SetFilterValue(DCol: Integer);
var
  Column: TColumnEh;
begin
  if (DCol < 0) or (DCol >= Columns.Count) then
    Exit;
  Column := Columns[DCol];
  if (Column.FieldName <> '') and CheckFilter(FilterEdit.Text) then
    Column.STFilter.InternalSetExpressionStr(FilterEdit.Text);
//    if Column.STFilter.KeyField <> ''
//      then Column.STFilter.SetKeyListValues(FilterEdit.Text, FilterEdit.Value)
//      else Column.STFilter.InternalSetExpressionStr(FilterEdit.Text);
end;
З.Ы. Проверялось на связке ADOStoredProc - DataSetDriverEh - MemTableEh
---
Много мозгов утекло с тех пор...