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

[DocWiki 번역] 레코드 필터링하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Filtering Records (FireDAC)"을 번역한 글: 번역일: 2022년 4월 9일)

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

 

모든 FireDAC 데이터셋은 로컬에서 레코드를 필터링할 수 있다. FireDAC은 로컬에 있는 데이터셋 캐시(cache) 안에서 레코드를 필터링하기 때문에 데이터베이스에 다시 갈 필요가 없다. 내부적으로 FireDAC은 필터링된 레코드의 목록을 구축하고 유지한다. 따라서, 레코드 용량이 많을 경우, 필터를 활성화하는 데 시간이 오래 걸릴 수 있지만, 그 이후 레코드 탐색(navigation)은 필터링을 하지 않는 것과 동일하게 빠르다.

목차


1 표준 필터링 (Standard Filtering)

FireDAC 데이터셋에는 레코드를 필터링할 때 표준 방식을 사용하도록 하는 옵션이 있다.

  •  Filter 프로퍼티에 조건 표현식을 명시할 수 있다. Filter 값을 명시한 후에  Filtered 프로퍼티를 True로 지정하여 필터를 활성화한다. 예를 들면,
FDQuery1.Filter := 'OrderID in (10150, 10151, 10152)';
FDQuery1.Filtered := True;
  • OnFilterRecord 이벤트 핸들러에서 델파이 코드로 필터링을 구현할 수 있다. OnFilterRecord 핸들러를 명시한 후에,  Filtered 프로퍼티를 True로 지정하여 필터를 활성화한다. 예를 들면,

FDQuery1.OnFilterRecord := Form1FilterRecord;
FDQuery1.Filtered := True;

procedure TForm1.Form1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
  iOrderID: Integer;
begin
  iOrderID := DataSet.FieldByName('OrderID').AsInteger;
  Accept := (iOrderID = 10150) or (iOrderID = 10151) or (iOrderID = 10152);
end;

 

2 값 범위에 따라 필터링 (Filtering by Range of Values)

FireDAC 데이터셋이 필드 목록을 사용하여 정렬된 경우, 애플리케이션은 필드 값의 범위를 가지고 필터링을 한다. 이 방식은 레코드를 제한할 때 가장 효과적인 방식이다. 그 이유는 데이터셋의 내부 인덱스 구조를 사용하기 때문이다.

필터링을 제어하는 메소드들은 다음과 같다.

  • SetRangeStart -- 데이터셋에 범위의 최소값을 지정할 수 있는 상태로 만든다. 이전 값들은 지워진다.
  • EditRangeStart --데이터셋에 범위의 최소값을 지정할 수 있는 상태로 만든다. 이전 값들은 보존된다.
  • SetRangeEnd -- 데이터셋에 범위의 최대값을 지정할 수 있는 상태로 만든다. 이전 값들은 지워진다.
  • EditRangeEnd -- 데이터셋에 범위의 최대값을 지정할 수 있는 상태로 만든다. 이전 값들은 보존된다.
  • ApplyRange -- 최소값과 최대값을 명시한 후에 범위 필터링을 활성화한다.
  • SetRange -- SetRangeStartSetRangeEnd, ApplyRange 를 메소드 하나로 모아놓는 것.
  • CancelRange -- 범위 필터링을 취소한다.

필터링을 제어하는 프로퍼티들은 다음과 같다.

  • IsRanged -- 현재 범위 필터링 모드인지를 받아온다.
  • KeyExclusive -- 필터링 범위의 최소값과 최대값에 지정된 값을 제외한 범위인가 아니면 포함한 범위인가를 지정하거나 받아온다.
  • KeyFieldCount -- 범위 필터링에 사용할 인덱스 필드의 갯수를 지정하거나 받아온다.

예를 들면,

FDQuery1.IndexFieldNames := 'ORDERID;ORDERDATE';
FDQuery1.SetRangeStart;
FDQuery1.KeyExclusive := False;
FDQuery1.KeyFieldCount := 1;
FDQuery1.FieldByName('OrderID').AsInteger := 10150;
FDQuery1.SetRangeEnd;
FDQuery1.KeyExclusive := False;
FDQuery1.KeyFieldCount := 1;
FDQuery1.FieldByName('OrderID').AsInteger := 10152;
FDQuery1.ApplyRange;

 

3 레코드 상태에 따라 필터링 (Filtering by Record Status)

FilterChanges 프로퍼티를 사용하면 레코드를 변경 상태(change status)에 따라 필터링할 수 있다. 이 필터링 유형은 캐시된 업데이트(Cached Updates) 모드에서만 사용할 수 있다. 예를 들어, 변경되거나 삭제된 레코드만 보여주려면 다음과 같이 한다.

FDQuery1.FilterChanges := [rtModified, rtDeleted];

ApplyUpdates 호출이 처리하지 못한 레코드를 필터링하려면 FilterChanges 프로퍼티에 값을 rtHasErrors로 설정하여 사용한다.

 

4 기타 옵션 (Other Options)

보여지는 레코드를 제한하는 다른 옵션들도 있다.

또한 FireDAC은 fkCalculated 또는 fkLookup 유형인 필드를 사용하여 필터링할 수 없다는 점을 유의하자. 대신 애플리케이션에서 fkInternalCalc와 fkAggregate 필드를 사용하여 필터링할 수 있다.

 

5 TFDTable과 필터링 (TFDTable and Filtering)

TFDTable이 라이브 데이터 창 모드 (Live Data Window Mode)이면, 다음 상황에서 서버-쪽 필터링(WHERE)을 사용한다.

  •  Filter 프로퍼티를 위해서: Filter 프로퍼티의 내용은 그대로 DB에 전송된다. FireDAC 이스케이프 시퀀스 (escape sequences) ###를 사용하면, DBMS 그리고 로컬 표현식 엔지에 호환되는 표현식을 작성할 수 있다.
  • 마스터-디테일 관계에서 디테일 TFDTable을 위해서
  • TFDTable에 범위가 적용되어 있을 때

TFDTable이 라이브 데이터 창 모드 (Live Data Window Mode)이면, 다음 상황에서 클라이언트-쪽 필터링을 사용한다.

  • OnFilterRecord 이벤트
  • FilterChanges 프로퍼티

 

6 기타 자료 (See Also)

 

6.1 예제 (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...

중요한 정보

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