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

[DocWiki 번역] 계산된 필드와 집계된 필드


Recommended Posts

Docwiki에 있는 "Calculated and Aggregated Fields (FireDAC)"을 번역한 글: 번역일: 2022년 4월 9일)

위로 가기: [DocWiki 번역] 데이터셋을 가지고 작업하기 (FireDAC)

FireDAC에는 계산된 필드 유형이 몇가지 있다.

목차


1 일반 (General)

계산된 필드(Calculated fields)는 데이터베이스 안에 값이 저장되어 있지 않고 담아올 수도 없는 값을 위한 가상의 필드있다. 대신 이 필드는 클라이언트 쪽에서 계산되어서 채워진다. FireDAC에서는 모든  TField.FieldKind 유형에서 계산된 필드(Calculated fields)를 지원한다.

  • fkCalculated--단순하게 계산된 필드. 값은 TDataSet.OnCalcFields 이벤트 핸들러 안에서 계산된다.
  • fkInternalCalc--수준높게 계산된 필드. 값은 일반(regular) 필드에 할당될 수 있으며 데이터셋 레코드 캐시(cache)안에 저장된다. TDataSet.OnCalcFields 이벤트 핸들러 안에서 계산되거나 또는 TField.DefaultExpression에 명시된 표현식을 사용하여 계산된다.
  • fkLookup--조회(lookup) 필드. 값이 자동으로 계산된다. 데이터셋의 키 값을 조회(lookup) 데이터셋으로 부터 제공한다.
  • fkAggregate--집계를 계산한 필드. 값은 TAggregateField.Expression에 명시된 표현식을 사용하여 계산된다. 여기에는 COUNT, SUM, MIN, MAX, AVG 등의 집계 함수가 포함된다.

오직  fkInternalCalc 필드와 fkAggregate 필드만이 필터링, 정렬, 찾기 작업에 사용될 수 있다. 또한 이 필드들은 데이터셋의 다른 필드들과 함께 영속(persistent) 스트림(stream) 또는 파일에 저장될 수 있다. 자동(automatic) 모드에서는 계산된 필드 값이 데이터베이스에 전송(post)되지 않는다.

TFDTable은 라이브 데이터 창 모드 (Live Data Window Mode)에서 집계된(aggregated) 필드를 지원하지 않는다.

 

2 표준 계산된 필드 (Standard Calculated Fields)

fkCalculated와 fkInternalCalc 계산된 필드는 TDataSet.OnCalcFields 이벤트 핸들러에서 그 값을 할당할 수 있다. 계산된 필드(calculated)가 정의되는 상황은 다음과 같다.

  • 디자인 타임 (계발 화면에서), 데이터셋 필드 에디터 (Fields Editor) ... 메뉴 항목에서 정의
  • 런 타임 (실행 중에), 코드를 사용하여. 예를 들면, 대문자 이름을 담는 계산된 필드를 생성하는 코드는 다음과 같다.
procedure TForm1.Form1CalcFields(ADataSet: TDataSet);
begin
  ADataSet.FieldByName('UName').AsString := UpperCase(ADataSet.FieldByName('Name').AsString);
end;

var
  oField: TField;
  i: Integer;
...
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to ADQuery1.FieldDefs.Count - 1 do
  FDQuery1.FieldDefs[i].CreateField(Self);

oField := TStringField.Create(FDQuery1);
oField.Size := 50;
oField.FieldName := 'UName';
oField.FieldKind := fkInternalCalc; // 또는 fkCalculated
oField.DataSet := FDQuery1;

FDQuery1.OnCalcFields := Form1CalcFields;
FDQuery1.Open;

 

3 계산된 필드 표현식 (Expression Calculated Fields)

fkInternalCalc 필드는 TField.DefaultExpression에 명시된 표현식에 의해 자동으로 계산될 수 있다. 이 경우 TDataSet.OnCalcFields 이벤트 핸들러와 명시적인 값 할당이 필요없다. 표현식은 데이터셋이 활성화(active) 상태일 때는 변경할 수 없다. 예를 들면,

var
  oField: TField;
  i: Integer;
...
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to FDQuery1.FieldDefs.Count - 1 do
  FDQuery1.FieldDefs[i].CreateField(Self);

oField := TStringField.Create(FDQuery1);
oField.Size := 50;
oField.FieldName := 'UName';
oField.FieldKind := fkInternalCalc;
oField.DefaultExpression := 'UPPER(Name)';
oField.DataSet := FDQuery1;

FDQuery1.Open;

 

4 집계된 필드 (Aggregated Fields)

fkAggregate 집계된(aggregated) 필드 관리는 계산된(calculated) 필드 표현식과 유사하다. FireDAC은 TFDDataSet.AggregatesActiveTrue (기본 설정된 값은 False이다)로 지정되어 있을 때 집계된(aggregated) 필드를 계산한다. 집계 표현식은 데이터셋이 활성화(active) 상태일 때는 변경할 수 없다. 예를 들면, 집계된(aggregated) 필드 하나를 생성하려면 다음과 같이 한다.

var
  oField: TAggregateField;
  i: Integer;
...
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to FDQuery1.FieldDefs.Count - 1 do
  FDQuery1.FieldDefs[i].CreateField(Self);

oField := TAggregateField.Create(FDQuery1);
oField.FieldName := 'Total';
oField.Expression := 'SUM((ItemPrice + ItemTaxes) * ItemCount)';
oField.DataSet := FDQuery1;

FDQuery1.AggregatesActive := True;
FDQuery1.Open;

집계된(aggregated) 필드는 그룹 짓기를 정의할 수 있다. 그러면 같은 전체 레코드가 아니라 인덱스 필드 값을 가진 레코드를 가지고 값을 계산한다. 그룹 짓기를 지정하는 단계는 다음과 같다.

  • TAggregateField.IndexName에 그룹을 지을 때 사용할 인덱스를 지정한다. 기본값으로, 현재 인덱스가 사용된다.
  • TAggregateField.GroupingLevel에 그룹을 지을 때 사용할 인덱스된 필드의 갯수를 지정한다. 기본 설정된 값은 0 이다 (필드 없음, 그룹 짓기 없음).

주의! 데이터셋이 dsInsert 상태일 때, 집계된 필드 값은 항상 Null을 반환한다.

 

5 집계된 값 (Aggregated Values)

FireDAC은 TFDDataSet.Aggregates 컬렉션을 사용하여 집계된(aggregated) 값을 정의할 수 있다. 이것은 필드보다 더 가볍고 언제든 정의할 수 있다. 여기에는 데이터셋이 활성화(active) 상태일 때도 포함된다. 예를 들면,

with FDQuery1.Aggregates.Add do begin
  Name := 'Total';
  Expression := 'SUM((ItemPrice + ItemTaxes) * ItemCount)';
  Active := True;
end;
FDQuery1.AggregatesActive := True;
...
Label1.Caption := VarToStr(FDQuery1.Aggregates[0].Value);

 

6 기타 자료 (See Also)

 

6.1 예제 (Samples)

 

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

  • Kori changed the title to [DocWiki 번역] 계산된 필드와 집계된 필드

이 토의에 참여하세요

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

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...

중요한 정보

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