首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dbgrid计算

Dbgrid计算
EN

Stack Overflow用户
提问于 2011-01-25 06:26:30
回答 2查看 4.3K关注 0票数 0

我有一台DBGrid,我正在试着做一个账单,但有时它不能进行计算。我该如何避免这种情况??

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-25 11:54:39

实现计算的更好方法实际上是将计算移动到网格链接到的TTable组件。Total字段实际上不应该是数据库中的一个字段,因为它应该是一个基于其他字段的值的计算字段。只需使用表的字段编辑器添加一个额外的字段,键入字段名称Total,选择正确的数据类型,然后选择作为计算的字段类型。单击Ok,然后为表的OnCalcField事件添加类似以下内容的代码:

Torcamen_SUB.FieldByName(‘Torcamen_SUB.FieldByName('Desconto').AsFloat)/100)’).AsFloat := Torcamen_SUB.FieldByName('QT').AsFloat * (Torcamen_SUB.FieldByName('Precovenda').AsFloat +Total*Total;

一般的经验法则是,除非确实需要,否则不应将计算值保存到数据库中。最好是简单地将它们作为计算字段添加到数据集中,然后将网格链接到数据集。然后,所有计算字段都将显示在网格中,并且每行都将根据该行的值显示正确的计算值。

票数 2
EN

Stack Overflow用户

发布于 2011-01-25 07:29:32

我认为您将业务逻辑(如计算总数)与用户交互逻辑(如某些网格列失去焦点的事件)混合在一起,这就是应用程序不稳定行为的根源。

看起来连你都不知道它在哪里发生,在哪里没有发生。

考虑使用字段的事件(例如,OnChange事件)来执行这种计算。

如果您正在使用具有聚合功能的数据集(如TClientDataSet),那么您就很幸运了,因为您可以只使用declare what you want in a TAggregateField,而不需要“手动”进行计算。

不是你的问题,而是...使用try/finally的方式也要小心……例如,在下面这段代码中:

代码语言:javascript
复制
try
  tot := tot+(tot * percent)/ 100;
finally
  Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot;
  //other things
end;

请注意,如果由于某种原因在try和finally子句之间的行上发生异常,变量tot将有一个未定义的值(在本例中,是前一次赋值的结果),因此对Torcamen_SUB.total字段的赋值毕竟是错误的。我不确定这是否真的是你想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4787938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档