Kori 4월 9일, 2022에 포스트됨 공유하기 4월 9일, 2022에 포스트됨 Docwiki에 있는 "Calculated and Aggregated Fields (FireDAC)"을 번역한 글: 번역일: 2022년 4월 9일) 위로 가기: [DocWiki 번역] 데이터셋을 가지고 작업하기 (FireDAC) FireDAC에는 계산된 필드 유형이 몇가지 있다. 목차 1 일반 (General) 2 표준 계산된 필드 (Standard Calculated Fields) 3 계산된 필드 표현식 (Expression Calculated Fields) 4 합산된 필드 (Aggregated Fields) 5 합산된 값 (Aggregated Values) 6 기타 자료 (See Also) 6.1 예제 (Samples) 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.AggregatesActive이 True (기본 설정된 값은 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) FireDAC TFDMemTable Main 예제 FireDAC TFDQuery Aggregates 예제 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.