2012-08-03 3 views
1

내 질문은 : 어떻게 계산 된 필드에 의해 DBGrid를 주문할 수 있습니다. C++ Builder Starter Editon을 사용하고 있으며이 버전에서는 필드의 인덱스를 만들고 열의 인덱스로 순서를 만들 수있는 ClientDataSet을 사용할 수 없습니다.이 옵션이 아닙니다. (많은 스레드에서 이것을 읽으십시오) TIBDataSet (아래 ibds)을 사용하고 있으며 데이터를 필터링하고 있습니다. 잘 작동 .... 계산 된 것들에 대한 아닌 DB 열에 대한 ...이 문제를 해결할 수있는 방법에 대한 아이디어?계산 된 필드로 DBGrid 정렬

void __fastcall TForm1::DBGrid3TitleClick(TColumn *Column) 
{ 
    static cIdx = 0; 
    static String oby = "ASC"; 

    TBookmark CurrentPosition; 
    TIBDataSet *ibds = IBDS_accountsDist; 
    CurrentPosition = ibds->GetBookmark(); 
    if (cIdx != Column->Index) { 
     oby = "ASC"; // ANOTHER column choosen 
    } else if (oby == "ASC") { 
     oby = "DESC"; 
    } else oby = "ASC"; 
    cIdx = Column->Index; 

    ibds->Filtered = false; 
    switch (Column->Index){ 
     case 0: ibds->Filter = "ORDER BY SumAj "+oby; break; // SumAj is a calculated field => Does not work 
     case 1: ibds->Filter = "ORDER BY CSAL_ACCOUNTNAME "+ oby; break; // DB-field WORKS FINE 
    } 
    ibds->Filtered = true; 
    ibds->GotoBookmark(CurrentPosition); 
} 

답변

0

당신은 할 수 없습니다. TIBDataSet은 기본 데이터베이스를 나타냅니다. 기본적으로 SQL에 정의 된 순서대로 레코드를 가져옵니다.

TDBClientDataset을 사용하는 것이 가장 쉬운 방법이지만 Starter 버전의 C++ Builder에는 포함되어 있지 않습니다. 예를 들어 std :: list의 모든 레코드를 미리로드 한 다음 order 함수를 사용하여 레코드를 정렬하는 등의 다른 방법을 탐색 할 수 있습니다. 마지막으로 간단한 TGrid 또는 TStringGrid를 사용하여 표시 할 수 있습니다.

TClientDataSet은 대용량 프로젝트를 생성해야 할 때 특히 데이터 프로젝트의 주요 부분 중 하나이므로 C++ Builder를 업그레이드하는 것이 좋습니다.

사용자 인터페이스가있는 TIBDataSet과 같은 데이터베이스 특정 구성 요소를 혼합하면 프로젝트의 확장 성과 유지 관리가 불리합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 여전히 문제를 해결하고 많은 것을 읽어야하고 이제는 여러분의 게시물을 ... 그래, 우리는 C++ Builder의 일반 버전으로 업그레이드 할 것이라고 생각한다! –