Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 표현식 쓰기 (FireDAC)


Recommended Posts

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" 등이 포함된다. 등록된 함수의 목록은 다음과 같다.

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)

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)

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.