Erstellen von Ausdrücken (FireDAC)
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:
- Makro-Funktionen für Zeichen
- Makro-Funktionen für numerische Werte
- Makro-Funktionen für Datums- und Uhrzeitwerte
- Makro-Funktionen für Systemwerte
- Makro-Funktionen für die Konvertierung
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:
- Verwenden der Methode TFDDataSet.CreateExpression zum Durchführen von Berechnungen für Datenmengenfelder. Zum Beispiel:
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
- FireDAC TFDQuery Filter (Beispiel)
- FireDAC TFDQuery Aggregates (Beispiel)
- FireDAC\Samples\DatS Layer\CalcColumnWithFuncs