DBgird1 で該当する行だけの合計を出したいのですが

解決


ちゃん  2006-03-03 23:02:47  No: 20337

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になりません。
どうにもならなくなりまして質問させていただくことになりました。

よろしくお願いします。

ちゃん


HOta  2006-03-03 23:16:13  No: 20338

データーベースが何かわからないのですが、
SQL文で

select
    残,個数,金額,個数*金額 as 計,損得
from Table名
where 個数*金額 > 0

とすればどうでしょうか?


Ru  2006-03-04 00:18:58  No: 20339

そのソースはどこのイベントに記述していますか?
OnCalcFieldsイベントに記述しているならば,Query1は不要な気がします。


Ru  2006-03-04 00:19:44  No: 20340

間違えました。
Query1は不要  →  Query1.Nextは不要


HOta  2006-03-04 01:08:40  No: 20341

レコードの4行目が不要な場合は、最初から除くのがよりよい対応だと思います。


Basser  2006-03-04 01:58:09  No: 20342

>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;

なら無限ループになっていますよ


ちゃん  2006-03-04 20:04:44  No: 20343

質問を出しておきながら返事を書くのが遅くなりました。
申し訳ありません。
たまに思い出して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行目が不要な場合は、最初から除くのがよりよい対応だと思います。」
このとおりですね。

返事を書かせていただくにも冷や汗ものです。
ありがとうございます。


HOta  2006-03-05 02:52:47  No: 20344

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


ちゃん  2006-03-05 16:40:19  No: 20345

HOta  さんアドバイスいただきましてありがとうございます。
 if query1.fieldbyName('計').AsInteger<>0 then
  begin
    Sum := Sum + query1.fieldbyName('損得').AsInteger;
  end;   
  Query1.Next;    //必ず通る。
これだったんですね。こんな簡単なことをみおとすなんて?  
皆さんの質問と回答などから切り貼りでプログラムをつくっている
もんですから、いざ何か変なことがあると自分では解決できなくな
るんですね。
OnCalcFieldsイベントは理解できました。
お世話になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加