델파이 파이어댁 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;