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.

È stato utile?

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.:-( )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top