2012-08-03 53 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