【问题标题】:do oncalculate fields in one table using values from another table使用另一个表中的值计算一个表中的字段
【发布时间】:2015-06-16 15:30:21
【问题描述】:

我正在我的 KLOG 表中进行计算。 但是,我的 PRICES 表有我在 KLOG 表中计算所需的数据。

示例: KLOG 表有 PRICE_ID 字段(整数)。 PRICES 表也是如此。

所以我正在尝试做这样的事情(KLOG 表的 oncalculatefields ):

if KLOG.FieldByName('PRICE_ID') = 1 then begin
KLOG.FieldByName('calculated_field_value_1').Value := KLOG.FieldByName('calculated_field_value_2').Value +5;

然而,这 (+5) 是我的 PRICES 表中 PRICE_ID =1 的字段值 (BONUS)。

那么如何在 KLOG 表的 oncalculate 事件中引用此 BONUS 字段? 你可以使用 SELECT 吗?类似的东西:

KLOG.FieldByName('calculated_field_value_1').Value := KLOG.FieldByName('calculated_field_value_2').Value + (select BONUS from PRICES where PRICES.PRICE_ID = KLOG.PRICE_ID);

不确定我是否正确地写了这篇文章。

【问题讨论】:

  • 能否将 BONUS 字段作为返回 KLOG 表数据的原始查询的一部分返回?
  • 只需添加第二个查询并从您的 PRICES 表中查找 BONUS。在关闭和重新打开之前使用参数并检查 PRICE_ID 参数的现有值。
  • 如果可能,请不要在客户端进行任何计算。几乎所有 DBMS 都是为服务器端的计算而开发的,并且不会干扰客户端 PC。

标签: delphi


【解决方案1】:

您没有告诉我们您使用的是什么数据访问组件。

推荐的方法是使用查询组件(TSQLQueryTADOQueryTIBQuery、...),然后让该查询的 SQL 检索所有必要的信息。您想在OnCalcFields() 中访问的所有字段都应该在该查询中。

应该是这样的

select * from KLOG, PRICES
where KLOG.PRICE_ID=PRICES.PRICE_ID

将 * 替换为您实际需要的字段名称。
如果你愿意,你甚至可以在查询中进行简单的计算,例如像

select [..], PRICES.PRICE*KLOG_QUANTITY as TotalPrice from KLOG, PRICES
where KLOG.PRICE_ID=PRICES.PRICE_ID

无论如何,使用查询组件而不是表组件是一种好习惯; (连同TClientDataSet...)它通常允许您检索比整个表更少的数据。

【讨论】:

  • 啊,我明白了....您必须首先运行查询以获取结果,然后将结果传递给表的计算字段。我使用了 Jans 的第一个建议。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多