Erstellen von Ausdrücken (FireDAC)

Aus Appmethod Topics
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:

  • 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;

Beispiel

Weitere Einzelheiten finden Sie in den FireDAC-Demos:

  • FireDAC\Samples\Comp Layer\TFDQuery\Filter
  • FireDAC\Samples\DatS Layer\CalcColumnWithFuncs