私はdbgridに列の小計と列のパーセンテージを表示し、この式から列のパーセンテージを表示する方法を示します(小計/総額)* 100%?詳細情報については、計算レコードのパーセンテージを要約DBGRIDで分割する方法Delphi
絵下記
を参照してください。それをdoesntの、私のSQLは非常に複雑であるので、私は、私のSQLを変更couldntのため、私は解決策は、多分、計算フィールドを使用と思いますか?誰かが私にこの問題を解決するのを手伝ってもらえますか? ありがとうございました。
私はdbgridに列の小計と列のパーセンテージを表示し、この式から列のパーセンテージを表示する方法を示します(小計/総額)* 100%?詳細情報については、計算レコードのパーセンテージを要約DBGRIDで分割する方法Delphi
絵下記
を参照してください。それをdoesntの、私のSQLは非常に複雑であるので、私は、私のSQLを変更couldntのため、私は解決策は、多分、計算フィールドを使用と思いますか?誰かが私にこの問題を解決するのを手伝ってもらえますか? ありがとうございました。
次の例では、データセットに実際に最後に表示された行、つまり「111077,100」が含まれていないと仮定しています。もしそうなら、GrandTotalを計算するために、計算されたフィールドPercent
を入力するだけで済みます。これは簡単なことです。
あなたのDataSetがTClientDataSet
ある場合は、GrandTotalに向けた各データ行の貢献を表現するためにGrandTotalと計算フィールドを表現するためにTAggregateField
の 組み合わせを使用して非常に簡単にパーセント値を実装することができます。以下のコードを参照してください。
すでにTClientDataSetのを使用していない場合は、あなたのDataSetがaggregate fields
、あなたは以下のコードと同等のものを行うことができますをサポートタイプであるならば、あなたは
を含むいくつかのオプション、 を持っています。
はTDataSetProvider
のデータセットのソースとして、既存のDataSetを使用し、TClientDataSet
のProvider
として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;
大丈夫ですか –
は、グリッドにデータを供給しているTDataSetのコンポーネントのどのような分野エディタ – Marusyk
にDBGridのに計算フィールドを追加してみ? – MartynA
Zeosコンポーネントを使用しています –