본문 바로가기

Development/Delphi

DBGrid 타이틀 클릭시 정렬하기(order by)

DBGrid 는 ordering(sorting) 기능이 없다. 

DataSet(TFDQuery) 는 쿼리한 결과를 모두 가지고 있지 않다. 
즉, 메모리에 모두 담고있지 않기 때문에 쿼리를 다시 해야 한다.

이는 DataSet(TFDQuery).RecordCount 함수를 실행했을때 실제 쿼리결과의 row count 와 틀린 원인과 동일하다.
 

// DBGrid 타이틀 클릭
procedure TfrmMain.DBGExamTitleClick(Column: TColumn);
begin
  DoSortGrid(Column);
end;

// 쿼리 order by
procedure TfrmMain.DoSortGrid(Column: TColumn);
var
  sSQL : String;
  iPos,i : Integer;
  pQry : TFDQuery;  //FireDAC 로 구성되었을 경우.
//  pQry : TQuery;  //BDE 로 구성되었을 경우
begin
  pQry:=TFDQuery(TDBGrid(Column.Grid).DataSource.DataSet);
  if (not pQry.Active) or (pQry.IsEmpty) then Exit;
  if pQry.UpdateStatus in [usInserted,usModified] then Exit;
  if Column.Field.Calculated then Exit;

  for i:=0 to TDBGrid(Column.Grid).Columns.Count-1 do
  begin
    if TDBGrid(Column.Grid).Columns[i]<>Column then
    begin
      if Pos('▲',TDBGrid(Column.Grid).Columns[i].Title.Caption)>0 then
        TDBGrid(Column.Grid).Columns[i].Title.Caption:=
          Copy(TDBGrid(Column.Grid).Columns[i].Title.Caption,
            1,Pos('▲',TDBGrid(Column.Grid).Columns[i].Title.Caption)-1);

      if Pos('▼',TDBGrid(Column.Grid).Columns[i].Title.Caption)>0 then
        TDBGrid(Column.Grid).Columns[i].Title.Caption:=
          Copy(TDBGrid(Column.Grid).Columns[i].Title.Caption,
            1,Pos('▼',TDBGrid(Column.Grid).Columns[i].Title.Caption)-1);

    end; //if
  end;//for

  sSQL := UpperCase(pQry.SQL.Text);
  iPos := Pos('ORDER BY',sSQL);

  if iPos > 0 then sSQL := Copy(sSQL,1,iPos+Length('ORDER BY'))
  else sSQL := sSQL+ ' ORDER BY';

  if Column.Field.LookUp then sSQL := sSQL +' '+Column.Field.KeyFields
  else sSQL := sSQL +' '+Column.Field.Fieldname;

  if Pos('▼',Column.Title.Caption)>0 then
  begin
    sSQL := sSQL+ ' DESC ';
    Column.Title.Caption:=Copy(Column.Title.Caption,1,Pos('▼',Column.Title.Caption)-1);
    Column.Title.Caption:=Concat(Column.Title.Caption,'▲');
  end
  else if Pos('▲',Column.Title.Caption)>0 then
  begin
    Column.Title.Caption:=Copy(Column.Title.Caption,1,Pos('▲',Column.Title.Caption)-1);
    Column.Title.Caption:=Concat(Column.Title.Caption,'▼');
  end
  else
  begin
    Column.Title.Caption:=Concat(Column.Title.Caption,'▼');
  end;

  pQry.Close;
  pQry.SQL.Text := sSQL;
  pQry.Open;
end;