Erstellen von Ausdrücken (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Datenmengen (FireDAC)


FireDAC enthält eine leistungsstarke Client-Ausdrucks-Engine, die für Filterung, Indizierung und berechnete Felder verwendet wird.

Allgemeine Informationen

FireDAC unterstützt eine Ausdruckssyntax, die mit Folgendem kompatibel ist:

  • BDE-Datenzugriffskomponenten
  • TClientDataSet
  • Oracle 8 (nicht zu 100%)
  • ODBC-Escape-Funktionen

Um reguläre und Funktionen im Oracle-Stil sowie im ODBC-Stil hinzuzufügen, müssen Sie die Unit FireDAC.Stan.ExprFuncs in eine uses-Klausel der Anwendung einbeziehen. Ansonsten können Sie einen Fehler, wie "Spalte mit Namen [NVL] nicht gefunden", erhalten. Liste der registrierten Funktionen:

Die Ausdrucks-Engine unterstützt FireDAC-Escape-Sequenzen. Die Datenmengenfelder können zudem in einem Ausdruck wie Bezeichner referenziert werden. Zum Beispiel:

 FDQuery1.Filter := 'upper(name) like ''bill%''';
 FDQuery1.Filtered := True;

Oder:

 FDQuery1.Filter := '(upper(rtrim(name)) like ''bill%'') or (upper(rtrim(name)) like ''john%'')';
 FDQuery1.Filtered := True;

Informationen darüber, wie Sie eine eigene Funktion erstellen und bei FireDAC registrieren, finden Sie in der Unit FireDAC.Stan.ExprFuncs.pas.

Verwenden von Ausdrücken für benutzerdefinierte Zwecke

Eine Anwendung kann mit der FireDAC-Ausdrucksauswertung Textformelberechnungen durchführen. Es gibt zwei grundlegende Optionen:

 var
   oEval: IFDStanExpressionEvaluator;
 ...
 oEval := FDMemTable1.CreateExpresison('(sal + comm) * tax / 100');
 Label1.Caption := oEval.Evaluate;
 ...
 FDMemTable1.Next;
 oEval.DataSource.Position := FDMemTable1.GetRow;
 Label1.Caption := oEval.Evaluate;
 ...
 oEval := nil;
 FDMemTable1.Close;
  • Verwenden der API zum Erweitern der Auswertung mit benutzerdefinierten Datenquellen. Zum Beispiel:
uses
  FireDAC.Stan.Intf, FireDAC.Stan.Factory, FireDAC.Stan.Expr, FireDAC.Stan.ExprFuncs;

type
  TMyVariable = class (TInterfacedObject, IFDStanExpressionDataSource)
  private
    FName: String;
    FpValue: PDouble;
  protected
    function GetVarIndex(const AName: String): Integer;
    function GetVarType(AIndex: Integer): TFDDataType;
    function GetVarScope(AIndex: Integer): TFDExpressionScopeKind;
    function GetVarData(AIndex: Integer): Variant;
    ...........
  public
    constructor Create(AName: String; var AValue: Double);
  end;

{ TMyVariable }

constructor TMyVariable.Create(AName: String; var AValue: Double);
begin
  inherited Create;
  FName := AName;
  FpValue := @AValue;
end;

function TMyVariable.GetVarIndex(const AName: String): Integer;
begin
  if CompareText(AName, FName) = 0 then
    Result := 0
  else
    Result := -1;
end;

function TMyVariable.GetVarType(AIndex: Integer): TFDDataType;
begin
  if AIndex = 0 then
    Result := dtDouble
  else
    Result := dtUnknown;
end;

function TMyVariable.GetVarScope(AIndex: Integer): TFDExpressionScopeKind;
begin
  if AIndex = 0 then
    Result := ckConst
  else
    Result := ckUnknown;
end;

function TMyVariable.GetVarData(AIndex: Integer): Variant;
begin
  if AIndex = 0 then
    Result := FpValue^
  else
    Result := Null;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  d: Double;
  oDS: IFDStanExpressionDataSource;
  oParser: IFDStanExpressionParser;
  oEval: IFDStanExpressionEvaluator;
begin
  oDS := TMyVariable.Create('x', d);

  FDCreateInterface(IFDStanExpressionParser, oParser);
  oEval := oParser.Prepare(oDS, '(2*x)+cos(sin(90)+10)', [], [poDefaultExpr], '');

  d := 1.2;
  ShowMessage(oEval.Evaluate);

  d := 3.4;
  ShowMessage(oEval.Evaluate);
end;

Beispiele