Проверьте строку TDataSet на соответствие строке фильтра.
-
23-08-2019 - |
Вопрос
я использую Девэкспресс Тдксмемдата в памяти потомок TDataSet.Пока он отфильтрован:Логическое значение и фильтр:Строковые свойства, похоже, что он ничего не делает с ними автоматически, вместо этого полагаясь на результат параметра Accept события OnFilterRecord.
Итак, я ищу способ (возможно, он есть в TdxMemData или где-то еще в наборе кода DevExpress) проанализировать текст фильтра и применить его к набору данных.
В идеале мне нужен способ проверить отдельную строку на соответствие фильтру, чтобы увидеть, соответствует ли она, не фильтруя ее из набора данных (я хочу выделить строки, соответствующие фильтру).
Пример строки фильтра:
((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)
Итак, есть вложенные операторы and и or.На самом деле он создан DevExpress TcxDBFilterControl.
Я очень надеюсь, что мне не хватает чего-то простого.
Обновлять: Я открыл билет с DevExpress чтобы узнать, поддерживают ли они какое-либо решение.Я нашел их стандартный ответ, что они не поддерживают фильтрацию на TdxMemData.
Решение
Я знаю, что это не тот ответ, который вы ищете, но набор данных TdxMemData не поддерживает строки фильтра.Чтобы использовать фильтры, либо напишите собственное событие OnFilterRecord, либо установите для ProgrammedFilter значение true и заполните FilterList списком отфильтрованных записей (во время выполнения).
Одной из возможностей может быть создание собственного синтаксического анализатора для сравнения строки фильтра с текущей записью в событии OnFilterRecord.
Другие советы
Возможно, вы захотите заменить TdxMemData на Ткбммемтабле.Он бесплатен, работает аналогично компоненту DX и поддерживает строки фильтров.Перенос, скорее всего, займет гораздо меньше времени, чем реализация анализатора строк фильтра в OnFilterRecord!Он без проблем будет работать с другими компонентами DX.
Вам нужна не фильтрация данных, а их отображение по-другому, если они соответствуют условию.Если вы используете TDBGrid для отображения данных, посмотрите на событие DrawColumnCell() в TDBGrid:
procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
DBG: TDBGrid;
begin
DBG := TDBGrid(Sender);
// Add any other conditions from your 'filter' here in the next line.
if (YourData.FieldByName('WHATEVER').AsString = 'Jim') and
(YourData.FieldByName('REP').AsInteger > 1000) then
Column.Font.Color := clRed;
DBG.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Поскольку вы используете TdxMemData, вы, вероятно, также используете сетку DevEx.Он должен иметь аналогичный способ сделать что-то отличное от рисования по умолчанию;вы можете использовать аналогичную технику там.(Я не использовал DevEx уже несколько лет;нынешнему работодателю они не нравятся, и поэтому он не будет тратить деньги.:-( )