Kori 4월 9일, 2022에 포스트됨 공유하기 4월 9일, 2022에 포스트됨 Docwiki에 있는 "Filtering Records (FireDAC)"을 번역한 글: 번역일: 2022년 4월 9일) 위로 가기: [DocWiki 번역] 데이터셋을 가지고 작업하기 (FireDAC) 모든 FireDAC 데이터셋은 로컬에서 레코드를 필터링할 수 있다. FireDAC은 로컬에 있는 데이터셋 캐시(cache) 안에서 레코드를 필터링하기 때문에 데이터베이스에 다시 갈 필요가 없다. 내부적으로 FireDAC은 필터링된 레코드의 목록을 구축하고 유지한다. 따라서, 레코드 용량이 많을 경우, 필터를 활성화하는 데 시간이 오래 걸릴 수 있지만, 그 이후 레코드 탐색(navigation)은 필터링을 하지 않는 것과 동일하게 빠르다. 목차 1 표준 필터링 (Standard Filtering) 2 값 범위에 따라 필터링 (Filtering by Range of Values) 3 레코드 상태에 따라 필터링 (Filtering by Record Status) 4 기타 옵션 (Other Options) 5 TFDTable과 필터링 (TFDTable and Filtering) 6 기타 자료 (See Also) 6.1 예제 (Samples) 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 -- SetRangeStart, SetRangeEnd, 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) 보여지는 레코드를 제한하는 다른 옵션들도 있다. 마스터-디테일 관계 (M/D)를 사용한다. 로컬 데이터셋 인덱스(local dataset indexes)를 사용하여 필터링과 정렬을 혼합한다. 또한 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) 표현식 쓰기 레코드 정렬하기 레코드 찾기 계산된 필드와 집계된 필드 마스터-디테일 관계 (M/D) 테이블 조회하기 (FireDAC) 6.1 예제 (Samples) FireDAC TFDMemTable Main 예제 FireDAC TFDMemTable Master-Detail Relationship 예제 FireDAC TFDQuery Filter 예제 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.