Controllare la riga TDataSet rispetto a una stringa di filtro
-
23-08-2019 - |
Domanda
Sto usando a DevExpress TdxMemData in memoria il discendente di TDataSet.Mentre è filtrato:Booleano e filtro:String, non sembra effettivamente fare nulla con esse automaticamente, basandosi invece sul risultato del parametro Accept dell'evento OnFilterRecord.
Quindi quello che sto cercando è un modo (forse è in TdxMemData o da qualche altra parte nella suite di codice di DevExpress) per analizzare il testo del filtro e applicarlo al set di dati.
Idealmente vorrei un modo per testare una singola riga rispetto al filtro per vedere se corrisponde senza filtrarla dal set di dati (voglio evidenziare le righe che corrispondono al filtro).
Stringa di filtro di esempio:
((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)
Quindi ci sono and e or nidificati.In realtà è creato da DevExpress TcxDBFilterControl.
Spero davvero che ci sia qualcosa di semplice che mi manca.
Aggiornamento: Ho aperto un biglietto con DevExpress per vedere se supportano qualche tipo di soluzione.Ho trovato la loro risposta in stock non supportano il filtraggio su TdxMemData.
Soluzione
So che questa non è la risposta che stai cercando, ma il set di dati TdxMemData non supporta le stringhe di filtro.Per utilizzare i filtri, codifica il tuo evento OnFilterRecord o imposta ProgrammedFilter su true e compila FilterList con un elenco dei record filtrati (in fase di esecuzione).
Una possibilità potrebbe essere quella di codificare il proprio parser per confrontare la stringa di filtro con il record corrente nell'evento OnFilterRecord.
Altri suggerimenti
Potresti voler sostituire TdxMemData con TkbmMemTable.È gratuito, funziona in modo simile al componente DX e supporta le stringhe di filtro.Probabilmente ci vorrebbe molto meno tempo per il porting rispetto all'implementazione di un parser di stringhe di filtro in OnFilterRecord!Funzionerà con gli altri componenti DX senza problemi.
Ciò che stai cercando non è filtrare i dati, ma visualizzarli in modo diverso se soddisfano una condizione.Se stai utilizzando un TDBGrid per visualizzare i dati, esamina l'evento DrawColumnCell() su 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;
Dato che stai utilizzando TdxMemData, probabilmente stai utilizzando anche la griglia DevEx.Deve avere un modo simile per fare qualcosa di diverso dal disegno predefinito;puoi usare una tecnica simile lì.(Non uso il materiale DevEx da alcuni anni;all'attuale datore di lavoro non piacciono e quindi non accetterà le spese.:-( )