1

私の質問は次のとおりです。計算フィールドで DBGrid を注文するにはどうすればよいですか。C++Builder スターター エディションを使用していますが、このバージョンでは、フィールドにインデックスを作成し、列のインデックスで並べ替えるための 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);
}
4

1 に答える 1

0

あなたはそれをすることはできません。TIBDataSet は、基礎となるデータベースの表現です。基本的に、SQL で定義された順序でレコードを取得します。

最も簡単な方法は TDBClientDataset を使用することですが、c++ Builder の Starter バージョンには含まれていません。std::list 内のすべてのレコードをプリロードしてから、 order 関数を使用してレコードを並べ替えるなど、他の方法を検討することもできます。最後に、単純な TGrid または TStringGrid を使用してそれらを表示できます。

いずれにせよ、C++Builder をアップグレードすることをお勧めします。これは、TClientDataSet がほとんどのデータ プロジェクトの主要部分の 1 つであるためです。特に、中規模から大規模なプロジェクトを作成する必要がある場合はそうです。

TIBDataSet のようなデータベース固有のコンポーネントをユーザー インターフェイスと混在させると、プロジェクトのスケーラビリティとメンテナンスに不利になります。

于 2012-11-14T18:16:55.387 に答える