Конференция "Базы" » DBgridEh ошибка фильтре Error in expression [D6, Firebird]
 
  • Ulugbek (11.03.09 14:57) [0]
    Привет всем.
    Помогите с фильтрем в DbgridEh .
    Когда фильтр делаю по одной поле выдает ошибку
    Error in expression.. а остальними нет..
    В поля содержит такого значения
    (095) 949-959-59
    если фильтре так напишу то ругаеться..
    Помогите в чем проблема..
  • Немо © (11.03.09 15:09) [1]
    как то встречалось, что он скобки не понимает
    попытайтесь без скобок как-то сделать, изменить фильтр
  • Ulugbek (11.03.09 15:49) [2]
    Просто у меня пользователь хотел что фильтр был как у Excel и автоматом фильтровал..
    Сделал так
    соединил Tibclientdataset>DataDriverEh>MemTable>Datasource..
    В DbGrideH>stfilter=true ,visible=true server и local sortin=true;

    Добавил Uses EhlibIBX.pas и в модуле
    initialization
     DBGridEhDefaultStyle.FilterEditCloseUpApplyFilter := True;
    что бы автоматом фильтр делал и все.
    В поля содержит такого значения
    (095) 949-959-59 если я вот так напишу то он не ругает '(095) 949-959-59'
    Может Dbgrideh.pas поправить?
  • Ulugbek (18.03.09 12:55) [3]
    Помогите а !
    Никто  не сталкивался с таким Errorom :(
  • немо2 (18.03.09 13:07) [4]
    >> если я вот так напишу то он не ругает '(095) 949-959-59'
    проблема решена? ->>  ну так и пиши!
    не устраивает? ->> поправь Dbgrideh.pas
  • Ulugbek (18.03.09 14:47) [5]

    > >> если я вот так напишу то он не ругает '(095) 949-959-
    > 59'
    > проблема решена? ->>  ну так и пиши!
    > не устраивает? ->> поправь Dbgrideh.pas
    >


    Это пользователю не нравится писать с апострами...
    Вот я незнаю именно что изменить в DbgridEh.pas..
    Если знаешь помоги очень надо..
  • немо2 (18.03.09 14:52) [6]
    трогать исходники не надо по возможности бы

    >> пользователю не нравится писать с апострами
    так пусть не пишет
    он напишет как нравится, а ты будешь подставлять QuotedStr(от того что он напишет)
  • Ulugbek (18.03.09 15:15) [7]
    но как буду вставить QuotedStr если он из списка выберить..
    Или где я буду поставить это . Я в фильре ничего не писал это оно автоматом должно правильно..
    Пример плиз.
  • Ulugbek (18.03.09 15:23) [8]
    Где, куда
    OnApplyfiltr Писать? Пример.. Плииз
  • немо2 (18.03.09 15:56) [9]
    >>  OnApplyfiltr
    тебе виднее

    а вообще, скобки он рассматривает похоже как сложный фильтр, для доп. условий
    если в DbUtilsEh.pas вот это место
     begin
       for i := Pos to Length(S) do
       begin
         if ((S[i] in [' ']) and CheckForOperand(S, SkipBlanks(S, i))) or
           ((S[i] in [')', '('])) or
           (PreferCommaForList and (S[i] = ',')) then

         begin
           Result := Copy(S, Pos, i - Pos);
           Pos := i;
           Exit;
         end;
       end;
       Result := Copy(S, Pos, MAXINT);
       Pos := Length(S) + 1;
     end;
    переправить, может и получится..
  • Ulugbek (18.03.09 16:13) [10]
    :( Как?
  • немо2 (18.03.09 16:22) [11]

    >    for i := Pos to Length(S) do
    >    begin
    >      if ((S[i] in [' ']) and CheckForOperand(S, SkipBlanks(S,
    >  i))) or
    >        ((S[i] in [')', '('])) or
    >        (PreferCommaForList and (S[i] = ',')) then
    >      begin
    >        Result := Copy(S, Pos, i - Pos);
    >        Pos := i;
    >        Exit;
    >      end;
    >    end;

    выкинуть
  • Ulugbek (18.03.09 16:39) [12]
    :)) Да не помогло
    var
     i: Integer;
    begin
     Result := Null;
     if Pos > Length(S) then
       Exit;
     if S[Pos] = '''' then
     begin
       for i := Pos + 1 to Length(S) do
         if S[i] = '''' then
         begin
           Result := Copy(S, Pos + 1, i - Pos - 1);
           Pos := i + 1;
           Exit;
         end;
       raise Exception.Create(SQuoteIsAbsentEh + S);
     end;
     {else                    Коментировал
     begin
       for i := Pos to Length(S) do
       begin
         if (CharInSet(S[i], [' ']) and CheckForOperand(S, SkipBlanks(S, i))) or
           (CharInSet(S[i], [')', '('])) or
           (PreferCommaForList and (S[i] = ',')) then
         begin
           Result := Copy(S, Pos, i - Pos);
           Pos := i;
           Exit;
         end;
       end;
       Result := Copy(S, Pos, MAXINT);
       Pos := Length(S) + 1;
     end;}
    end;
  • Ulugbek (18.03.09 17:23) [13]
    НЕМО2
    Вот для примера тест http://ifolder.ru/11116769
    я DBUtilsEh коментировал
    {else                    Коментировал
    begin
      for i := Pos to Length(S) do
      begin
        if (CharInSet(S[i], [' ']) and CheckForOperand(S, SkipBlanks(S, i))) or
          (CharInSet(S[i], [')', '('])) or
          (PreferCommaForList and (S[i] = ',')) then
        begin
          Result := Copy(S, Pos, i - Pos);
          Pos := i;
          Exit;
        end;
      end;
      Result := Copy(S, Pos, MAXINT);
      Pos := Length(S) + 1;
    end;}

    Но все равно ругает..
  • немо2 (18.03.09 17:37) [14]
    1 нет у меня rar, ибо платный
    2 EhLib 3.6 у меня, у тебя какая?
    3
    begin
     
    {
    for i := Pos to Length(S) do
      begin
        if ((S[i] in [' ']) and CheckForOperand(S, SkipBlanks(S, i))) or
          ((S[i] in [')', '('])) or
          (PreferCommaForList and (S[i] = ',')) then
        begin
          Result := Copy(S, Pos, i - Pos);
          Pos := i;
          Exit;
        end;
      end;
    }

      Result := Copy(S, Pos, MAXINT);
      Pos := Length(S) + 1;
    end;
    вот что если закоментить?
  • Ulugbek (18.03.09 17:41) [15]
    у меня Ehlib 4.2.16//
    Завтра отпишусь резултат
    Ok пасибо
  • немо2 (18.03.09 17:45) [16]
    а Ehlib 4.2.16 - тоже платная. Или уже нет?
  • Ulugbek (19.03.09 08:12) [17]
    Привет всем!
    НЕМО2
    нет не получился.. Все равно ругает..
    EHLIB Ehlib 4.2.16 платная
  • Ulugbek (19.03.09 14:08) [18]
    НЕМО2
    помоги если не устал Ж(
  • turbouser © (19.03.09 16:51) [19]

    > Ulugbek   (19.03.09 08:12) [17]
    >
    > EHLIB Ehlib 4.2.16 платная

    Если куплена - есть саппорт.
  • немо2 (19.03.09 17:34) [20]
    а если в процедуре добавить в
    --
    --

    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 Pos('(', FilterEdit.Text) > 0)
    and Pos(')', FilterEdit.Text) > 0)

    --
    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;
  • Ulugbek (20.03.09 09:58) [21]
    Нет не помогло... Капитан НЕМО2
    в инете нашел такой способ но это тоже не работает..

    DbgridEh.pas добавил функцию function CheckFilter(AFilterEdit: string): boolean;
    наверх процедуры procedure TCustomDBGridEh.SetFilterValue(DCol: Integer);
    Этот вариант тоже не сработало почемуто или мне функцию обявить наверху?

    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 <> '') 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;



    Или мне переходить на Ehlib 3.6
  • немо2 (20.03.09 12:30) [22]
    все-таки надо с кавычками, имхо, разобраться. С ними же работает

    или фильтрвать сам датасет
    procedure TForm1.DBGridEh1ApplyFilter(Sender: TObject);
    begin
     dataset.Filtered:=false;
     dataset.Filter:=DBGridEh1.Columns[нужный].STFilter.ExpressionStr;
     dataset.Filtered:=true;
    end;
  • Гостья-1245 © (10.07.09 15:40) [23]
    все проще, хотя может вы уже и нашли ответ,
    спасибо ВАМ - я знала что искать, так вот:

    в DbUtilsEh
    надо заремить всего одну строку
    egin
     Result := Null;
     if Pos > Length(S) then
       Exit;
     if S[Pos] = '''' then
     begin
       for i := Pos + 1 to Length(S) do
         if S[i] = '''' then
         begin
           Result := Copy(S, Pos + 1, i - Pos - 1);
           Pos := i + 1;
           Exit;
         end;
       raise Exception.Create(SQuoteIsAbsentEh + S);
     end
     else
     begin
       for i := Pos to Length(S) do
       begin
         if ((S[i] in [' ']) and CheckForOperand(S, SkipBlanks(S, i))) or
    //ВОТ ЭТУ        ((S[i] in [')', '('])) or
           (PreferCommaForList and (S[i] = ',')) then
         begin
           Result := Copy(S, Pos, i - Pos);
           Pos := i;
           Exit;
         end;
       end;
       Result := Copy(S, Pos, MAXINT);
       Pos := Length(S) + 1;
     end;
  • turbouser © (10.07.09 20:42) [24]

    > Гостья-1245 ©

    См. [19]
  • sdsk © (14.07.09 12:29) [25]
    Там еще проблема. Если фильтр выставлен лукапом, то не работает на половине полей. Все руки никак не дойдут разобраться со всеми этими глюками фильтрации ehlib. Автор компонентов эту простейшую задачу кажется не собирается исправлять.

    Кстати чего версия такая старая? 4.6 уже есть
 
Конференция "Базы" » DBgridEh ошибка фильтре Error in expression [D6, Firebird]
Есть новые Нет новых   [134473   +31][b:0][p:0.001]