파라독스로 만들어진 DB 화일이 있습니다.
그런데 인덱스 화일을 처음에 만들지 안고.
실행시 동적으로 만들어서
검색에 적용하고 싶은데 어떻게 해야 하는지요?
DB 는 처음 접해보아서..정말 답답하군요..
이제 겨우...
db 화일 선택해서.. db그리드에 뿌리는데까지만 성공을 했내요..
검색을 하려면 인덱스를 생성해야 한다던데..
처음 DB 만들때 db데스크탑에서 만드는 방법말고 동적으루도
만들수 잇어 보이는데...어떻게 만들고.또 만든 인덱스를 어떻게 적용하는지
간단한 셈플 어디 없을까요??..
> 파라독스로 만들어진 DB 화일이 있습니다.
> 그런데 인덱스 화일을 처음에 만들지 안고.
> 실행시 동적으로 만들어서
> 검색에 적용하고 싶은데 어떻게 해야 하는지요?
> DB 는 처음 접해보아서..정말 답답하군요..
>
> 이제 겨우...
> db 화일 선택해서.. db그리드에 뿌리는데까지만 성공을 했내요..
> 검색을 하려면 인덱스를 생성해야 한다던데..
> 처음 DB 만들때 db데스크탑에서 만드는 방법말고 동적으루도
> 만들수 잇어 보이는데...어떻게 만들고.또 만든 인덱스를 어떻게 적용하는지
> 간단한 셈플 어디 없을까요??..
>
인덱스를 동적으로 생성하는 것은 자료실이나 팁모아에 가보시면 있을겁니다.
해답을 알려드리지 못해 죄송한데요. 아래분이 말씀하신 내용을 보고 동감이 가는 내용이라 몇자적습니다. 보통 인덱스는 자료가 많을때 보다빨리 데이타에 접근하기 위해 사용합니다.
그러니까... DB설계를 할땜 이미 프라이머리키나 세컨더리인덱스는 설정을 하고 작업을 하거든요. 꼭 나중에 세컨더리 인덱스를 설정해야되는 중요한 이유라도 있는건지요?
그것이 아니라면... 굳이 그렇게 구성하실 필요성이 없을것 같네요. 물론 공부하기 위해서라면 얘기가 다르지만요.
그리구 아시겠지만 인덱스가 너무 많으면 도리어 DB를 제어하는 속도가 느려진답니다.
입력,수정, 삭제시 다시 인덱스를 구성하는 시간때문이죠.
그리고 델파이에서 인덱스를 적용하는부분은요. table 컴포넌트에서 findkey, findnearest, goto, gotonearest 로 검색할때는 해당 필드가 반드시 인덱스로 잡혀있어야 됩니다. 그리고 앞서서 말씀드렸지만 자료가 많을때에는 SQL문을 사용하여 검색할때에 인덱스가 잡혀있나 안잡혀있는가에 따라 속도차가 나는걸로 압니다.
아래구문은 전에 Q&A에 있는 내용입니다. 그대로 복사해다 옮겨놓았습니다.
김영대님께서 답변하신 내용이더군요. 찾으시는 자료인것 같아서요.
그리고 궁금한것을 Q&A에서 검색해보시는것도 하나의 좋은 습관인것 같습니다.
내 고통이 다른 사람의 고통인경우가 많더라구요. 그럼 즐코하세요. 이만.
김석수 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.