Kori 4월 10일, 2022에 포스트됨 공유하기 4월 10일, 2022에 포스트됨 Docwiki에 있는 "Writing Expressions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 9일) 위로 가기: [DocWiki 번역] 데이터셋을 가지고 작업하기 (FireDAC) FireDAC에는 강력한 클라이언트 표현식 엔진이 있다. 이것은 필터링, 인덱싱, 계산된 필드 등에서 사용된다. 일반 (General) FireDAC에서 지원하는 표현식이 호환되는 곳 BDE 데이터 액세스 컴포넌트들 TClientDataset Oracle 8 (100%는 아님) ODBC 이스케이프 함수 (escape functions) 오라클-방식, ODBC-방식, 정규 표현식 함수(regular expression functions)를 추가하려면, FireDAC.Stan.ExprFuncs 유닛을 애플리케이션의 uses 절에 포함해야 한다. 그렇지 않으면 에러를 얻게 된다. 에러에는 "Column with name [NVL] is not found" 등이 포함된다. 등록된 함수의 목록은 다음과 같다. 문자 매크로 함수(Character Macro Functions) 숫자 매크로 함수(Numeric Macro Functions) 날짜와 시간 매크로 함수(Date and Time Macro Functions) 시스템 매크로 함수(System Macro Functions) 변환 매크로 함수(Convert Macro Function) FireDAC 표현식 엔진은 FireDAC 이스케이프 시퀀스 (escape sequences)를 지원한다. 또한, FireDAC 데이터셋 필드들은 표현에서 식별자로 참조할 수 있다. 예를 들면, FDQuery1.Filter := 'upper(name) like ''bill%'''; FDQuery1.Filtered := True; 또는, FDQuery1.Filter := '(upper(rtrim(name)) like ''bill%'') or (upper(rtrim(name)) like ''john%'')'; FDQuery1.Filtered := True; 당신이 직접 함수를 만들어서 FireDAC에 등록할 필요가 있다면, FireDAC.Stan.ExprFuncs.pas 유닛을 자세히 참조하라. 목적에 맞게 표현식 사용하기 (Using Expression for Custom Purposes) TFDDataSet.CreateExpression 메소드를 사용하면 데이터셋 상의 필드 계산을 수행할 수 있다. 예를 들면, 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; FireDAC API를 사용하면, 맞춤형 데이터 소스를 사용하여 평가자(evaluator)를 확장할 수 있다. 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; 예제 (Samples) FireDAC TFDQuery Filter 예제 FireDAC TFDQuery Aggregates 예제 FireDAC\Samples\DatS Layer\CalcColumnWithFuncs 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.