델파이 파이어댁 tDataSet.Distinct 중복 데이터 제외하기
예를 들어 0, 0, 1, 1, 1, 2, 2의 데이터를 0, 1, 2로 출력하려면 데이터베이스의 distinct 명령을 이용한다. 파이어댁 메모리 테이블의 경우에도 같다. 쿼리를 이용해도 되지만 tFDMemTable의 인덱스 프라퍼티를 이용할 수도 있다.
tFDIndex는 tDataSet.Indexes를 컬렉션으로 하는 컬렉션 아이템이다. 리스트 아이템을 다루듯 하면 된다.
type
TForm1 = class(TForm)
FDMemTable1: TFDMemTable;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
FDMemTable1TestField: TIntegerField;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if FDMemTable1.Indexes.FindIndex('TestIndex') <> nil then
begin
FDMemTable1.Indexes.FindIndex('TestIndex').Distinct := False;
FDMemTable1.Indexes.FindIndex('TestIndex').Selected := False;
end;
FDMemTable1.Append;
FDMemTable1.FieldValues['TestField'] := StrToInt(Edit1.Text);
FDMemTable1.Post;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
fDIndex: TFDIndex;
begin
fDIndex := FDMemTable1.Indexes.FindIndex('TestIndex');
fDIndex.Distinct := True; // update
fDIndex.Selected := True; // show
end;
procedure TForm1.FormCreate(Sender: TObject);
var
fDIndex: TFDIndex;
begin
fDIndex := TFDIndex.Create(FDMemTable1.Indexes);
fDIndex.Name := 'TestIndex';
fDIndex.Fields := 'TestField';
end;