2011-07-06 3 views
5

TClientdataset을 사용하여 일부 집계를 만들어야합니다. SQL에서 이러한 집계는 다음과 같은 스크립트를 사용하여 수행 할 수 있습니다Delphi : TClientDataset에서 원거리 레코드 만 집계하는 방법은 무엇입니까?

Select Sum(column1) from table1 where Date_Column < Date_Value 

나는 매우 긴 과정과 매우 느린 네트워크 중 더 빠른 속도를 필요로하기 때문에, 나는 메모리에-대신 SQL을 사용하는 집계 사용하고 싶습니다. 내가의 집계 결과를 볼 것으로 예상했다

myClientdataset.SetRang([value1],[value2]); 

: 다음과 같이 ClientDataSet에 필터,

Sum(column1) 

을 그리고 Date_Column 인덱스를 만들 : 내 생각은 다음과 같이 표현으로 ClientDataSet의에 집계를 추가하는 것입니다 불행히도 집계는 범위를 무시하고 모든 레코드의 결과를 계속 제공합니다.

내 질문은 : 어떻게 내가 TClientdataset에서 이것을 얻을 수 있습니까? 또는 메모리에서 원거리 집계를 수행하는 방법에 대해 다른 생각이 있습니까?

답변

7

어쩌면이 링크가 도움이 될 것입니다 : Grouping and Aggregates

편집 :)

I를 내가 나는 그것을 생각

, 그것은 나에게 꽤 시간이 걸렸습니다 그리고 그것은 좌절 경험이었다 샘플 프로젝트를 만들었습니다.

첫째, 필터링없이 총 :

Aggregate without filtering

둘째, 버튼을 presing 후 집계 :

Aggregate with filtering

이인가는 당신이 원하는 효과를입니까?

SetRange()를 사용하여이 문제를 해결할 수 없었으므로 필터 속성을 대신 사용했습니다.

달성하는 방법 :
  1. 은 일부 필드에 인덱스를 작성 GroupingLevel은 0
  2. 설치해야한다는 TClientDataset.IndexName의 속성으로 인덱스입니다.
  3. GroupingLevel = 0 및 SUM (YourFieldName)과 같은 식으로 집계를 만듭니다. 제 경우에는 SUM (인구)입니다.
  4. IndexName 속성에서 만든 색인을 작성하십시오.
  5. 집계를 디자인 타임에 활성화하도록 설정합니다 (런타임에 설정하면 작동하지 않는 것처럼 보임). 버튼을 누른 후

내 코드 :

cdsMain.Filter := 'Population <= 100'; 
    cdsMain.Filtered := True; 
    if not VarIsNull(cdsMain.Aggregates[0].Value) then 
    lblAggregatedPopulation.Caption := 'Aggregated population: ' + IntToStr(cdsMain.Aggregates[0].Value); 

당신이 easly SetRange를위한 것과 같은 결과를 달성하기 위해 조건을 변경할 수 있습니다 필터에 유의하시기 바랍니다.그러나 SetRange가 데이터 필터링에서 더 빠르다고 읽었습니다.

은 도움이 :)

+0

감사합니다 희망하지만, 무기력의 :(이 방법을 "범위"물론 일부에 의해 첫 번째 필터 행에 그 범위 –

+0

를 내가 제대로 이해한다면, 당신이 원하는 집계하지 않습니다 조건 및 그룹 filteretd 행 – Wodzu

+0

나는 filteretd 행 –

관련 문제