Dbgridで入力している項目の縦計をとりたい

解決


まつ  2008-06-02 14:59:46  No: 30855  IP: 192.*.*.*

Dbgridで入力していますが、
入力している列の縦計をとる方法がないでしょうか?
Whileでループさせて計算する事しか思いうかびません。

編集 削除
Ru  2008-06-02 16:37:20  No: 30856  IP: 192.*.*.*

DBGridに繋いでる方法は
TTable→TDataSource
でしょうか?
そうだとするとTTableでは不可能なので
TQueryを使用しSQLを使用すればデータの集計も出来ると思います。
統計というのがどういった物か分かりませんが,
よほど複雑でない限りSQLで間に合うと思います。

編集 削除
めじな  2008-06-02 16:42:52  No: 30857  IP: 192.*.*.*

私もループさせる方法しか思い浮かびません。

ClientDataSetを利用している事を前提で書かせて頂きます。
私はカレントレコードが移動してしまうのが気になるので
CloneCursorでクローンを作成してクローンをぐるぐる回して
処理しています。
この時、元のClientDataSetの再描画を停止(DisableControls)
させた方が処理時間は短縮されます。

参考になれば。

編集 削除
めじな  2008-06-02 16:45:36  No: 30858  IP: 192.*.*.*

補足です。
検索した結果の縦計であれば私もSQLで処理するのが一番手軽だと思います。
「入力している」との事で上のような方法を書かせてもらいました。

編集 削除
Ru  2008-06-02 17:00:34  No: 30859  IP: 192.*.*.*

失礼しました。
>>統計
勘違いしてるし書き間違いもありました。
申し訳ないです。縦計でしたね。
TClientDataSetの集合体(TAggregateField)を使うのはどうでしょうか?
ただしDelphiのバージョンによってはTClientDataSetがないかもしれません。
そうなるとやはりWhileしかない気がします。

編集 削除
HOta  2008-06-03 07:50:36  No: 30860  IP: 192.*.*.*

TQueryの選択文と合計文をUnionでつなげばできます。

編集 削除
まつ  2008-06-03 16:02:25  No: 30861  IP: 192.*.*.*

TClientDataSetを使用しています。
ただし、入力していきますのでQueryは使えないです。

>TClientDataSetの集合体(TAggregateField)を使うのはどうでしょうか?
やってみましたが、項目をSUMして取り出す方法がわかりません。

編集 削除
Ru  2008-06-03 16:36:17  No: 30862  IP: 192.*.*.*

なにが分からないのか書いて貰えると補足できるんだが・・・
とりあえず流れまとめてみました。

・集合体フィールドの作成と設定
1.TClientDataSetコンポーネントダブルクリック → 項目の新規作成
2.名前を指定。項目の種類を集合体にする
3.作成された集合体フィールドを選択しExpressionプロパティを設定する。
  例:SUM(フィールド名)
4.集合体フィールドのActiveプロパティをTrueにする。

・その他設定
1.TClientDataSet.AggregatesActiveプロパティをTrueにする。
2.TDBEdit等を貼り付けDataSourceとDataSetを集合体フィールド参照できるように設定する。

たぶんこれで表示されているデータの縦計は取れると思います。
  ※全てのレコード範囲の縦計ならばGroupingLevelの設定は無しで大丈夫でしょう。

不明な点はヘルプを参照してください。
検索キー:TAggregateField

編集 削除
まつ  2008-06-03 18:12:30  No: 30863  IP: 192.*.*.*

Ruさん丁寧な回答をありがとうございます。
手順通りにおこなっているのですが、
>2.TDBEdit等を貼り付けDataSourceとDataSetを集合体フィールド参照できるように設定する。

ここでTDBEditのプロパティにDataFieldには集合体フィールドはでてこず、
DataSetFieldは何もでてきません。試行錯誤中です。

編集 削除
Ru  2008-06-04 08:18:36  No: 30864  IP: 192.*.*.*

DataSource.DataSet.DataSetFieldじゃないですよ。

TDBEdit.DataSource ← TDataSource
TDBEdit.DataField ← 作成した集合体フィールド(ここに設定できる)

編集 削除
Ru  2008-06-04 10:30:54  No: 30865  IP: 192.*.*.*

>2.TDBEdit等を貼り付けDataSourceとDataSetを集合体フィールド参照できるように設定する。
というか書き方悪かったですね。すいません。

編集 削除
HOta  2008-06-04 10:42:04  No: 30866  IP: 192.*.*.*

TDBGridはTDataSorceからTDataSetに接続してTDataSetを編集します。
ですから集計する場合は、集計結果行が必要になります。
TTableを使う場合は、元のテーブルに集計行が必要です。

編集 削除
まつ  2008-06-04 11:37:14  No: 30867  IP: 192.*.*.*

どうしてもうまくいきません。

>TDBEdit.DataSource ← TDataSource
>TDBEdit.DataField ← 作成した集合体フィールド(ここに設定できる)

ここまでは完了したのですが。
Dbgridを一覧表示した段階で0がでます。明細は入っています。
まだ設定がたりないのでしょうか?

編集 削除
Ru  2008-06-04 11:57:36  No: 30868  IP: 192.*.*.*

今自分のPCで試しましたが計算はされるんで大丈夫とは思います。
0が表示されていれば計算機能は働いてると思うんだけどなぁ。
>>・集合体フィールドの作成と設定
>>4.集合体フィールドのActiveプロパティをTrueにする。
>>・その他設定
>>1.TClientDataSet.AggregatesActiveプロパティをTrueにする。
この部分の設定が漏れていれば0ではなくて値は何も表示されない。

Expressionプロパティの計算式の結果が0になるような式だったりしませんか?
あとTIndexDefを使用してインデックスの設定をしていると計算結果に影響する可能性があるのでご注意ください。

編集 削除
まつ  2008-06-04 13:13:20  No: 30869  IP: 192.*.*.*

Ruさん、最後までご丁寧な回答をいただいて、
深く感謝しております。

>TIndexDefを使用してインデックスの設定をしていると計算結果に影響する
>可能性があるのでご注意ください。

これでした。インデックスをはずすと結果がでました。
微妙なものですね。

編集 削除