2016-05-12 6 views
0

私はdbgridに列の小計と列のパーセンテージを表示し、この式から列のパーセンテージを表示する方法を示します(小計/総額)* 100%?詳細情報については、enter image description here計算レコードのパーセンテージを要約DBGRIDで分割する方法Delphi

絵下記

を参照してください。それをdoesntの、私のSQLは非常に複雑であるので、私は、私のSQLを変更couldntのため、私は解決策は、多分、計算フィールドを使用と思いますか?誰かが私にこの問題を解決するのを手伝ってもらえますか? ありがとうございました。

+0

は、グリッドにデータを供給しているTDataSetのコンポーネントのどのような分野エディタ – Marusyk

+1

にDBGridのに計算フィールドを追加してみ? – MartynA

+0

Zeosコンポーネントを使用しています –

答えて

4

次の例では、データセットに実際に最後に表示された行、つまり「111077,100」が含まれていないと仮定しています。もしそうなら、GrandTotalを計算するために、計算されたフィールドPercentを入力するだけで済みます。これは簡単なことです。

あなたのDataSetがTClientDataSetある場合は、GrandTotalに向けた各データ行の貢献を表現するためにGrandTotalと計算フィールドを表現するためにTAggregateFieldの 組み合わせを使用して非常に簡単にパーセント値を実装することができます。以下のコードを参照してください。

すでにTClientDataSetのを使用していない場合は、あなたのDataSetがaggregate fields、あなたは以下のコードと同等のものを行うことができますをサポートタイプであるならば、あなたは

  • を含むいくつかのオプション、 を持っています。

  • TDataSetProviderのデータセットのソースとして、既存のDataSetを使用し、TClientDataSetProviderとしてTDataSetProviderを使用して、グリッドにデータを供給するTClientDataSetを使用しています。

  • がない場合は1をTClientDataSetおよび/またはTAggregateFieldを使用し、代わりに既存のDataSetを以下に示したものと同様の操作を行いますが、あなたのデータセットの種類がサポートしている場合パーセントフィールドにfkInternalCalcフィールドを作る、またはfkCalculatedないでください。 GrantTotal TAggregateFieldフィールドを省略し、コードでGrandTotalを計算します。これを行う1つの方法は、データセットを開いた後に1回だけのデータセット(while not DataSet.Eof ...)をトラバーサルすることで計算する方法です。以下のコードで

あなたは簡単にTAggregateFieldが仕事を得るために必要な最低限の設定であり、まさに見ることができるように、私は、むしろ、オブジェクトインスペクタの項目エディタを使用するよりも、コード内のすべてのフィールドを作成しました。

注:間違っている可能性がありますが、TDBGridの標準を取得して、スクリーンショットの100%行を最後まで表示することはできません。 Developer Express TcxGridを使用して同様のことを行うことができますが、これを行うにはTDBGridが必要な場合は、新しい質問の方法を尋ねる必要があります。

コード

TForm1 = class(TForm) 
    CDS: TClientDataSet; 
    DataSource1: TDataSource; 
    DBGrid1: TDBGrid; 
    procedure CDSCalcFields(DataSet: TDataSet); 
    procedure FormCreate(Sender: TObject); 
    private 
    CDSID : TIntegerField; 
    CDSTotal : TCurrencyField; 
    CDSPercent : TFloatField; 
    CDSGrandTotal : TAggregateField; 
    public 
    procedure SetUp; 
    end; 

[...] 

procedure TForm1.SetUp; 
var 
    i : Integer; 
begin 
    CDSID := TIntegerField.Create(Self); 
    CDSID.FieldName := 'ID'; 
    CDSID.FieldKind := fkData; 
    CDSID.DataSet := CDS; 

    CDSTotal := TCurrencyField.Create(Self); 
    CDSTotal.FieldName := 'Total'; 
    CDSTotal.FieldKind := fkData; 
    CDSTotal.DataSet := CDS; 

    CDSPercent := TFloatField.Create(Self); 
    CDSPercent.FieldName := 'Percent'; 
    CDSPercent.FieldKind := fkInternalCalc; 
    CDSPercent.DataSet := CDS; 

    CDSGrandTotal := TAggregateField.Create(Self); 
    CDSGrandTotal.FieldName := 'GrandTotal'; 
    CDSGrandTotal.FieldKind := fkAggregate; 
    CDSGrandTotal.Expression := 'Sum(Total)'; 
    CDSGrandTotal.DataSet := CDS; 
    CDSGrandTotal.Active := True; 

    CDS.OnCalcFields := CDSCalcFields; 
    CDS.IndexFieldNames := 'ID'; 

    CDS.CreateDataSet; 
    for i := 1 to 2 do begin 
    CDS.InsertRecord([i, i]); 
    end; 

    CDS.First; 
end; 

procedure TForm1.CDSCalcFields(DataSet: TDataSet); 
var 
    Value : Double; 
    V : Variant; 
begin 
    V := CDSGrandTotal.Value; 
    if not VarIsNull(V) then begin 
    Value := CDSTotal.AsFloat; 
    Value := Value * 100/V; 
    CDSPercent.Value := Value; 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    SetUp; 
end; 
+0

大丈夫ですか –

関連する問題