Verifique na linha TDataSet contra uma seqüência de filtro
-
23-08-2019 - |
Pergunta
Eu estou usando um DevExpress TdxMemData ??strong> na memória descendente de TDataSet. Embora tenha filtrada: Boolean e Filtro: propriedades de cadeia, ele não parece realmente fazer alguma coisa com eles automaticamente, em vez de confiar no resultado do parâmetro Aceitar do evento OnFilterRecord.
Então o que eu estou procurando é uma maneira (talvez seja em TdxMemData ou em outro lugar no conjunto de código de DevExpress) para analisar o texto do filtro e aplicá-lo ao conjunto de dados.
Idealmente, eu gostaria de ter uma maneira de testar uma linha individual contra o filtro para ver se ele corresponde, sem filtrá-la para fora do conjunto de dados (eu quero linhas de destaque que correspondem ao filtro).
Exemplo cadeia de filtro:
((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)
Portanto, há aninhada e de e ou de. Na verdade, é construído pela DevExpress TcxDBFilterControl.
Eu estou realmente esperando há algo simples que eu estou ausente.
Update: eu abri uma href="http://www.devexpress.com/Support/Center/p/Q206534.aspx" rel="nofollow bilhete com DevExpress para ver se eles apoiar qualquer tipo de solução. Eu fiz encontrar a sua resposta padrão que eles não suportam filtragem em TdxMemData.
Solução
Eu sei que esta não é a resposta a sua procura, mas o conjunto de dados TdxMemData não suporta seqüências de filtro. Para usar filtros quer código de seu próprio evento OnFilterRecord ou conjunto ProgrammedFilter a verdade e preencher o filterlist com uma lista dos registros que são filtrados (em tempo de execução).
Uma possibilidade seria a de código de seu próprio analisador para comparar a seqüência de filtro contra o registro atual no evento OnFilterRecord.
Outras dicas
Você pode querer olhar para substituir o TdxMemData com TkbmMemTable . É grátis, funciona de forma semelhante ao componente DX, e seqüências de filtro suportes. Provavelmente levaria muito menos tempo para a porta mais do que seria a implementação de um analisador seqüência de filtro em OnFilterRecord! Ele vai trabalhar com os outros componentes DX sem problemas.
O que você está procurando não está filtrando os dados, mas uma questão de exibi-lo de maneira diferente se ele atende uma condição. Se você estiver usando uma TDBGrid para exibir os dados, olhar para o evento DrawColumnCell () no 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;
Uma vez que você estiver usando TdxMemData, você provavelmente está usando a grade DevEx também. Tem que ter uma forma semelhante a fazer algo que não seja o desenho padrão; você pode usar uma técnica semelhante lá. (Eu não usei o material DevEx em poucos anos;. Empregador atual não gosta deles, e, portanto, não saltará para a despesa :-()