2012-08-03 83 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,但它不包含在C++ Builder的Starter版本中。您可以探索其他方式,例如預先加載std :: list中的所有記錄,然後使用訂單功能來訂購記錄。最後,您可以使用簡單的TGrid或TStringGrid來顯示它們。

無論如何,我建議升級C++ Builder,因爲TClientDataSet是大多數數據項目中的主要部分之一,特別是當您需要創建大中型項目時。

將數據庫特定組件(如TIBDataSet)與用戶界面混合使用會影響項目的可伸縮性和維護。

+0

謝謝你的回答。我仍然必須解決這個問題,並閱讀了很多,現在你的文章...是的,我認爲我們要升級到正常版本的C++ Builder! – 2012-11-14 18:40:25