Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DBgridEh ошибка фильтре Error in expression [D6, Firebird]


Страницы:   1 2

Ulugbek ©   (2009-03-11 14:57:00) 

Привет всем.
Помогите с фильтрем в DbgridEh .
Когда фильтр делаю по одной поле выдает ошибку
Error in expression.. а остальними нет..
В поля содержит такого значения
(095) 949-959-59
если фильтре так напишу то ругаеться..
Помогите в чем проблема..


sdsk   (2009-07-14 12:29:00) [1]

Там еще проблема. Если фильтр выставлен лукапом, то не работает на половине полей. Все руки никак не дойдут разобраться со всеми этими глюками фильтрации ehlib. Автор компонентов эту простейшую задачу кажется не собирается исправлять.

Кстати чего версия такая старая? 4.6 уже есть


turbouser   (2009-07-10 20:42:00) [2]


> Гостья-1245 ©

См. [19]


Гостья-1245   (2009-07-10 15:40:00) [3]

все проще, хотя может вы уже и нашли ответ,
спасибо ВАМ - я знала что искать, так вот:

в 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;


немо2   (2009-03-20 12:30:00) [4]

все-таки надо с кавычками, имхо, разобраться. С ними же работает

или фильтрвать сам датасет
procedure TForm1.DBGridEh1ApplyFilter(Sender: TObject);
begin
 dataset.Filtered:=false;
 dataset.Filter:=DBGridEh1.Columns[нужный].STFilter.ExpressionStr;
 dataset.Filtered:=true;
end;


Ulugbek   (2009-03-20 09:58:00) [5]

Нет не помогло... Капитан НЕМО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   (2009-03-19 17:34:00) [6]

а если в процедуре добавить в
--
--

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;


turbouser   (2009-03-19 16:51:00) [7]


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

Если куплена - есть саппорт.


Ulugbek   (2009-03-19 14:08:00) [8]

НЕМО2
помоги если не устал Ж(


Ulugbek   (2009-03-19 08:12:00) [9]

Привет всем!
НЕМО2
нет не получился.. Все равно ругает..
EHLIB Ehlib 4.2.16 платная


немо2   (2009-03-18 17:45:00) [10]

а Ehlib 4.2.16 - тоже платная. Или уже нет?


Ulugbek   (2009-03-18 17:41:00) [11]

у меня Ehlib 4.2.16//
Завтра отпишусь резултат
Ok пасибо


немо2   (2009-03-18 17:37:00) [12]

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   (2009-03-18 17:23:00) [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;}

Но все равно ругает..


Ulugbek   (2009-03-18 16:39:00) [14]

:)) Да не помогло
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;


немо2   (2009-03-18 16:22:00) [15]


>    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   (2009-03-18 16:13:00) [16]

:( Как?


немо2   (2009-03-18 15:56:00) [17]

>>  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   (2009-03-18 15:23:00) [18]

Где, куда
OnApplyfiltr Писать? Пример.. Плииз


Ulugbek   (2009-03-18 15:15:00) [19]

но как буду вставить QuotedStr если он из списка выберить..
Или где я буду поставить это . Я в фильре ничего не писал это оно автоматом должно правильно..
Пример плиз.


немо2   (2009-03-18 14:52:00) [20]

трогать исходники не надо по возможности бы

>> пользователю не нравится писать с апострами
так пусть не пишет
он напишет как нравится, а ты будешь подставлять QuotedStr(от того что он напишет)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо