DBgird1 で該当する行だけの合計を出したいのですが
残 個数 金額 計 損得
15 - - 0 -15 4行目
10 8 1 8 -2 3行目
8 2 2 4 -4 2行目
14 3 8 24 10 1行目
この表の場合,計の列にOnCalcFieldsを使い自動計算
損得の列も 計ー残とOnCalcFieldsを使い自動計算
この表まではできたのですが、4行目も計の列に0が
入ってしまいす。そのため損得の合計を出す場合
4行目を除くために以下のように作って見たのですが
begin
if query1.fieldbyName('計').AsInteger<>0 then
begin
Sum := Sum + query1.fieldbyName('損得').AsInteger;
Query1.Next;
end;
end;
としても、なぜかパソコンが止まってしまい計0が判断に使われていないようです。
監視式でもquery1.fieldbyName('計').AsInteger の値が0になりません。
どうにもならなくなりまして質問させていただくことになりました。
よろしくお願いします。
ちゃん
データーベースが何かわからないのですが、
SQL文で
select
残,個数,金額,個数*金額 as 計,損得
from Table名
where 個数*金額 > 0
とすればどうでしょうか?
そのソースはどこのイベントに記述していますか?
OnCalcFieldsイベントに記述しているならば,Query1は不要な気がします。
間違えました。
Query1は不要 → Query1.Nextは不要
レコードの4行目が不要な場合は、最初から除くのがよりよい対応だと思います。
>begin
> if query1.fieldbyName('計').AsInteger<>0 then
> begin
> Sum := Sum + query1.fieldbyName('損得').AsInteger;
> Query1.Next;
> end;
>end;
>としても、なぜかパソコンが止まってしまい計0が判断に使われていないようです。
>監視式でもquery1.fieldbyName('計').AsInteger の値が0になりません。
while not query1.Eof do
begin
if query1.fieldbyName('計').AsInteger<>0 then
begin
Sum := Sum + query1.fieldbyName('損得').AsInteger;
Query1.Next;
end;
end;
なら無限ループになっていますよ
質問を出しておきながら返事を書くのが遅くなりました。
申し訳ありません。
たまに思い出してDelphiをやるもんですからいつも初心者です。
Basserさんに指摘いただいた無限ループも。
そうなのか?との程度でしか理解できません。
それでパソコンが止まってしまっているのですね。ありがとうございます。
Ruさんに頂いた
「OnCalcFieldsイベントに記述しているならば,Query1.Nextは不要な気がします。」
ですが、上記の例で「損得」の合計を表計算みたいに他の場所「セル?」に出力
することがわかりませんのでDBgridの外に Editを設けています。
Edit1 <--ここに出力
損得
-15
-14
-2
10
While not Query1.Eof do
begin
Sum := Sum + query1.fieldbyName('損得').AsInteger;
query1.Next;
end;
Edit1.Text:=inttostr(Sum);
Query1.First;
これで合計は出るのですがこれですと全部の合計が出てきてしまうものですから
「個数」「金額」を入力していないのは省いて損得の合計を出したいのですが。。
HOtaさんに頂いたSQLはもう少し勉強してみます。
全体的なことが理解できてないです。
このような場合はボタンを押してSQL文で計算させるのでしょうか?
execllのように式を入れといて自動計算ができたらと思ってたものが
OnCalcFieldsをみつけたものですからプログラムを始めたしだいです。
「レコードの4行目が不要な場合は、最初から除くのがよりよい対応だと思います。」
このとおりですね。
返事を書かせていただくにも冷や汗ものです。
ありがとうございます。
if query1.fieldbyName('計').AsInteger<>0 then
begin
Sum := Sum + query1.fieldbyName('損得').AsInteger;
Query1.Next;
end;
の様に記述すると、query1.fieldbyName('計').AsInteger=0の場合、この中を通らないので、Query1.Nextを実行しません。
if query1.fieldbyName('計').AsInteger<>0 then
begin
Sum := Sum + query1.fieldbyName('損得').AsInteger;
end;
Query1.Next; //必ず通る。
OnCalcFieldsイベントを使う場合
query1を右クリックして、[項目の設定]を選びます。
項目エディターを表示しますので、項目エディターを右クリックして、[すべての項目の追加]でFieldを追加します。
ここで、計算結果を入れる項目を作ります。
項目エディターを右クリックして、[項目の新規作成]で計算項目を作ります。
ここでは、[SintokuKei]という名前でCurrency型とします。
これだけ用意しておいて、query1のOnCulcFieldイベントの中で
DataSet.FieldByName('SintokuKei').asCurrency:=
DataSet.FieldByName('個数').asInteger *
DataSet.FieldByName('金額').asCurrency;
とすれば、計算結果を表示します。
dbGridに計算項目を表示させればOK
HOta さんアドバイスいただきましてありがとうございます。
if query1.fieldbyName('計').AsInteger<>0 then
begin
Sum := Sum + query1.fieldbyName('損得').AsInteger;
end;
Query1.Next; //必ず通る。
これだったんですね。こんな簡単なことをみおとすなんて?
皆さんの質問と回答などから切り貼りでプログラムをつくっている
もんですから、いざ何か変なことがあると自分では解決できなくな
るんですね。
OnCalcFieldsイベントは理解できました。
お世話になりました。
ツイート | ![]() |