2011-01-24 3 views
0

私はDBGridを持っていますが、私は請求シートを作成しようとしていますが、計算をしないことがあります。どうすればそれを避けることができますか?Dbgrid計算

私はあなたが(いくつかのグリッド列がフォーカスを失うのイベントのような)ユーザーインタラクションロジックで(合計を計算するなど)、ビジネスロジックを混合しているし、それはあなたのアプリケーションの誤動作の原因だと思う
procedure TOrcamentos.DBGridEh1ColExit(Sender: TObject); 
var 
    percent: double; 
    Unid: double; 
    tot: currency; 
    vaz: string; 
begin 
    if Dorcamen_SUB.DataSet.State in [dsEdit, dsInsert] then 
    try 
     Dorcamen_SUB.DataSet.Post; 
    finally 
     vaz := DBGridEh1.Columns[3].Field.text; 
     if (vaz<> '') then 
     try 
      Torcamen_SUB.Edit; 
      Unid := (Torcamen_SUB.FieldByName('QT').AsFloat); 
      tot := (Torcamen_SUB.FieldByName('Precovenda').AsFloat); 
      percent := (Torcamen_SUB.FieldByName('Desconto').AsFloat); 
      try 
      tot := tot+(tot * percent)/ 100; 
      finally 
      Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot; 
      Torcamen_SUB.Post; 
      Orcamentos.TotalExecute(self); 
      end; 
     except 
     end; 
    end; 
end; 

答えて

2

計算を実装するより良い方法は、実際にはグリッドがリンクされているTTableコンポーネントに計算を移動することです。 Totalフィールドは、実際にはデータベースのフィールドではなく、他のフィールドの値に基づく計算フィールドです。テーブルのフィールドエディタを使用して余分なフィールドを追加するだけで、フィールド名Totalにデータ型を入力し、正しいデータ型を選択してフィールドタイプをCalculatedとして選択します。 [OK]をクリックし、テーブルのOnCalcFieldイベントのために、このようなコードを追加します。

Torcamen_SUB.FieldByName( '合計')AsFloat:。。= Torcamen_SUB.FieldByName( 'QT')AsFloat *( Torcamen_SUB.FieldByName( 'Precovenda')。AsFloat +(Torcamen_SUB.FieldByName( 'Precovenda')。AsFloat * Torcamen_SUB.FieldByName( 'Desconto')。AsFloat)/ 100);

実際に必要でない限り、計算された値をデータベースに保存しないでください。計算フィールドとしてそれらをデータセットに追加し、グリッドをデータセットにリンクするだけです。計算されたすべてのフィールドがグリッドに表示され、各行にはその行の値に基づいて正しい計算値が表示されます。

1

あなたはそれが起こる場所と起こらない場所が分からないように見えます。

この種の計算を実行するには、Fieldのイベント(OnChangeイベントなど)を使用することを検討してください。

あなたはちょうどdeclare what you want in a TAggregateFieldであり、 "手作業で"計算することを忘れているので、あなたは集計機能(TClientDataSetなど)を持つデータセットを使用している場合は幸いです。

ないあなたの質問けど...あなたはまた、/ついに試しを使用している方法に注意してください...例えば、コードのこのビットに:

try 
    tot := tot+(tot * percent)/ 100; 
finally 
    Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot; 
    //other things 
end; 

場合のためにあることに注意してください何らかの理由でtryとfinally節の間の行に例外が発生すると、変数totは未定義の値を持ちます(この場合は前の割り当ての結果)ので、Torcamen_SUB.totalフィールドへの代入は間違っていますすべて。本当にあなたが望むものなのかどうかは分かりません。

+0

あなたはあなたが正しいとタックはsayngです。私はプロセスに再ありがとうございます。 –

+0

私はMdbを使用しています。データベースと私がTAggregateFieldを作ることを望むとき、それは私がリンクのようにそれをすることを許す。それには道がありますか? –

+0

@ml ClientDataSetsを使用していますか? – jachguate