Q&A

  • TTable, TDataSource 정렬
먼저 지난번에 답장 주신 임형호님, 안재현님 대단히 고맙습니다.

데이타베이스 연결된 DBGrid 의 컬럼헤드 기준으로 정렬이 필요합니다.



TTable 정렬을 위해서는 먼저 인덱스 가 필요하다는 결론이 얻어지는군요.

IndexFieldNames 를 사용할때 사전에 무슨 조치를 취하지 않아도 되는지요?

전에 한번 하니까 에러가 나던데요.

인덱스 파일이 필요하면 만드는 방법 부터 필요합니다.

완전초보 이므로 상세하게 설명 부탁 드립니다.



procedure TForm1.DBGrid1TitleClick(Column: TColumn);

begin

Table1.IndexFieldNames := DBGrid1.ColumeHeader;

{? 좀 이상하군요. 여기서 어떻게 하나요?

그러니까 정렬 기준이 컬럼헤드의 필드명이 되게 하는 것이지요}

end;



또하나 [질문]

Table 정렬 은 되는데,

DataSource 를 이용하여 정렬도 될 수 있을까요 ?

되면 같은 결과가 나오겠지요. 어떤것이 더 효율적인가요 ?



1  COMMENTS
  • Profile
    김영대 1999.12.01 23:56
    김석수 wrote:

    > 먼저 지난번에 답장 주신 임형호님, 안재현님 대단히 고맙습니다.

    > 데이타베이스 연결된 DBGrid 의 컬럼헤드 기준으로 정렬이 필요합니다.

    >

    > TTable 정렬을 위해서는 먼저 인덱스 가 필요하다는 결론이 얻어지는군요.

    > IndexFieldNames 를 사용할때 사전에 무슨 조치를 취하지 않아도 되는지요?

    > 전에 한번 하니까 에러가 나던데요.

    > 인덱스 파일이 필요하면 만드는 방법 부터 필요합니다.

    > 완전초보 이므로 상세하게 설명 부탁 드립니다.

    >

    > procedure TForm1.DBGrid1TitleClick(Column: TColumn);

    > begin

    > Table1.IndexFieldNames := DBGrid1.ColumeHeader;

    > {? 좀 이상하군요. 여기서 어떻게 하나요?

    > 그러니까 정렬 기준이 컬럼헤드의 필드명이 되게 하는 것이지요}

    > end;

    >

    > 또하나 [질문]

    > Table 정렬 은 되는데,

    > DataSource 를 이용하여 정렬도 될 수 있을까요 ?

    > 되면 같은 결과가 나오겠지요. 어떤것이 더 효율적인가요 ?



    아래 예제는 테스트한 예제입니다

    테스트는 DBDEMOS 로 했습니다



    동작은 DBGrid의 Title를 클릭하면 그 Title 의 필드로

    내림차순 sort를 합니다



    동작원리는 폼 생성시 그 테이블에 동적으로 index를 만드는 것입니다

    주의할것은 지정한 Table에 있는 모든 필드에 대해 각각 하나씩

    index가 생성되므로 table space를 낭비할 수 있으므로

    아래 소르를 보시고 특정 필드만 AddIndex하도록 고처서 사용하세요

    SQL-based 서버는 테스트 안해봐서 잘 될 지 모르겠습니다...



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    Grids, DBGrids, Db, DBTables;



    type

    TForm1 = class(TForm)

    Table1: TTable;

    DataSource1: TDataSource;

    DBGrid1: TDBGrid;

    procedure FormCreate(Sender: TObject);

    procedure DBGrid1TitleClick(Column: TColumn);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    procedure TForm1.FormCreate(Sender: TObject);

    var

    i: Integer;

    begin

    Table1.Exclusive := True; // Paradox or dBASE table 인 경우만 해당

    Table1.Active := True;

    for i := 1 to DBGrid1.Columns.Count do

    begin

    try

    // table의 인덱스를 동적으로 만든다

    Table1.AddIndex(DBGrid1.Columns[i].FieldName, // index name

    DBGrid1.Columns[i].FieldName, // index field names

    [ixDescending]); // 내림차순 순서를 준다

    except // Blob 필드는 except 발생되어 인덱스생성 안됨

    ;

    end;

    end;



    Table1.Active := False;

    Table1.Exclusive := False;

    Table1.Active := True;

    end;



    procedure TForm1.DBGrid1TitleClick(Column: TColumn);

    begin

    Table1.IndexName := Column.FieldName;

    end;



    end.