2015-01-21 2 views
0

저는 Delphi에서 ClientDataSet에 대해 배우고 SQL 데이터베이스를 정렬하는 방법을 배웠습니다. 데이터가 내 TDBGrid에서 잘 보이고 있으며 ClientDataset의 IndexField를 변경하여 헤더를 클릭하여 정렬을 활성화했습니다. 여기에 설명 된 2 IndexNames를 사용하려고 시도했지만 때때로 종류에 따라 내림차순으로 만들려고합니다. https://stackoverflow.com/a/13130816/4075632Delphi ClientDataSet IndexName을 변경하여 정렬

그러나 IndexName을 DEFAULT_ORDER에서 CHANGEINDEX로 바꿀 때 DBGrid의 모든 데이터가 사라집니다. 나는이 모든 것에 매우 익숙하며, 그것은 내 상황에 달려 있다는 것을 알고 있지만, 어떤 일이 일어나는 지 알아보고 문제를 해결하려고 노력할 것입니다.

TSQLQuery에 연결된 TSQLConnection이 1 개 있고 TDataSetProvider에 연결된 TSQLConnection이 있고 TDataSource가 TDBGrid로 연결되는 ClientDataSet에 연결된 클라이언트가 있습니다. 이름을 바꿀 때 ClientDataSet이 문제가되는 이유는 무엇입니까? 이 구성 요소에 대해 너무 확신하지는 않기 때문에 대부분의 설정이 기본값이라는 점을 명심하십시오. 감사합니다. 도움이 될만한 도움을 주시고 제 상황을 파악하기가 어려울 수있어서 정말 죄송합니다. 여러분은 여러분의 필요에 그들을 조정할 수 없기 때문에, DEFAULT_ORDER 및 CHANGEINDEX, 당신의 작업에 대한 진짜 쓸모가 있습니다

토비

답변

3

가 나는 ClientDataSet에 대한 인덱스를 구축하기 위해 다음 코드를 사용 결과

Procedure BuildIndices (cds: TClientDataSet); 
var 
i, j: integer; 
alist: tstrings; 

begin 
with cds do 
    begin 
    open; 
    logchanges:= false; 
    for i:= 0 to FieldCount - 1 do 
    if fields[i].fieldkind <> fkCalculated then 
    begin 
     j:= i * 2; 
     addindex ('idx' + inttostr (j), fieldlist.strings[i], [], '', '', 0); 
     addindex ('idx' + inttostr (j+1), fieldlist.strings[i], [ixDescending], '', '', 0); 
    end; 
    alist:= tstringlist.create; 
    getindexnames (alist); 
    alist.free; 
    close; 
    end; 
end; 

, 열 0 내림차순으로 정렬에 열 0 오름차순 'IDX1'를 정렬 인덱스 'idx0'가있다; , I는 각 형태에서

procedure Txxx.DBGrid1TitleClick(Column: TColumn); 
var 
n, ex: word; 

begin 
n:= column.Index; 
try 
    dbgrid1.columns[prevcol].title.font.color:= clNavy 
except 
end; 

dbgrid1.columns[n].title.font.color:= clRed; 
prevcol:= n; 
directions[n]:= not directions[n]; 
ex:= n * 2; 
if directions[n] then inc (ex); 
with clientdataset do 
    try 
    disablecontrols; 
    indexname:= 'idx' + inttostr (ex); 
    finally 
    first; 
    enablecontrols 
    end; 
end; 

다음 한 그리드의 OnTitleClick 이벤트

이어서 등 "idx2 '를 1 열의'IDX3 '은, I'는 방향 '(논리 값의 배열을 정의), 그리드 열당 하나의 요소. 이 요소는 열을 오름차순 또는 내림차순으로 정렬해야하는지 여부를 추적합니다.

+0

감사합니다. 거의 다 왔어.하지만 선배는 뭐니? 임은 선언되지 않은 다양한 오류를 받고 있습니다. 감사합니다 –

+0

@ TobyFox : prevcol은 양식에 속한 정수 변수입니다 (잊어 버렸습니다). 이전에 선택한 열의 값을 저장합니다. –

+0

안녕하세요. 나는 그것이 올바르게 보이기 때문에 이것이 효과가있을 것이라고 확신하지만 데이터베이스 테이블은 여전히 ​​보이지 않고 제목을 클릭 할 때마다 "닫힌 데이터 세트에서 작업을 수행 할 수 없습니다"라는 오류가 발생합니다. 그래서 나는 원래의 문제가 여전히 남아 있다고 가정합니다. CDS의 이름이 기본값이 아닐 때 데이터가 DBGrid에 표시되지 않습니다. 내가 무엇을 확인해야한다고 생각하니? 고마워 Toby –

1

ClientDataSet의 두 개의 미리 정의 된 인덱스와 함께 제공됩니다. 따라서 자신 만의 인덱스를 만들어야합니다. Cary Jensen의 포괄적 인 설명은 this article과 그 중에서도 가장 많이 권장되는 book about ClientDataSets에서 찾을 수 있습니다.

관련 문제