DBGrid按计算字段排序

时间:2012-08-03 23:57:39

标签: c++ sorting filter c++builder dbgrid

我的问题是:如何通过计算字段订购DBGrid。我正在使用C ++ Builder Starter Editon,并且在此版本中没有ClientDataSet可用于在字段上创建索引并按列索引排序。因此,这不是一个选项。 (在许多线程中读取此内容)我正在使用TIBDataSet(下面的ibds)并且我正在过滤数据。工作正常....对于DB列,而不是计算的那些...有关如何解决这个问题的任何想法?

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);
}

1 个答案:

答案 0 :(得分:0)

你不能这样做。 TIBDataSet是底层数据库的表示。基本上它按照SQL中定义的顺序获取记录。

最简单的方法是使用TDBClientDataset,但它不包含在c ++ Builder的Starter版本中。您可以探索其他方法,例如,在std :: list中预加载所有记录,然后使用order函数对记录进行排序。最后,您可以使用简单的TGrid o TStringGrid显示它们。

无论如何,我建议升级C ++ Builder,因为TClientDataSet是大多数数据项目的主要部分之一,特别是当您需要创建中型项目时。

将数据库特定组件(如TIBDataSet)与用户界面混合会影响项目的可伸缩性和维护。