如何使用计算字段计算现金流量?

How to calculate cash flow using calc fields?

我正在编写一个简单的现金流应用程序,使用 Delphi 7,firebird 2.5 和 InterBase 组件。有问题的 table 是这样创建的:

create table movimentos
(
id  d_inteiro not null,
date_start d_data not null,
date_end    d_data,
value   d_valor,
user    d_inteiro,
tipo_movimento d_inteiro not null, -- Indicates if it is Debit or Credit
primary key(id),
foreign key(user) references usuarios(id),
foreign key(tipo_movimento) references tipoMovimento(id)
)

我在我的 DM 中的查询中添加了一个计算字段,并将 DBGrid 连接到它。它基本上要做的是显示我的余额,当条目是贷方时使用总和(在数据库中指定)并且当借方时使用子(duh)。

为此,我必须获取最后一个余额行的值,对新条目的值求和(或减去)并将这个新的金额放入新的插入项中。

好吧,我知道如何计算同一行中的值并将其放在另一列中,但找不到有关获取上一行值并在下一行中使用它的任何信息。

实现该目标的更简单方法是什么?

已编辑: 补充我的问题。我想做的是这样的(稍微简化 table):

Id   date_start   value   balance  
1    03/05/15     +200     200  
2    03/08/15     +1000   1200  
3    03/09/15     -300     900  

现在,如果我为日期 03/06/15 添加了一个新条目,则所有行都必须重新计算,如下所示:

Id   date_start   value   balance  
1    03/05/15     +200     200
4    03/06/15     +500     700
2    03/08/15     +1000   1700  
3    03/09/15     -300    1400 

如何创建、计算和显示此 BALANCE 列基本上就是我要找的内容。
再次感谢。

InterBase组件不支持InternalCalc字段,适合这种客户端计算。尽管最好在服务器端执行此操作。

在 Firebird 中,您可以使用上下文变量来计算 运行 总数:

SELECT m.*,
  CAST(rdb$get_context('USER_TRANSACTION', 'BALANCE') AS d_valor) AS BALANCE,
  rdb$set_context('USER_TRANSACTION', 'BALANCE', COALESCE(CAST(rdb$get_context('USER_TRANSACTION', 'BALANCE') AS d_valor), 0) + m.value) AS DUMMY
FROM movimentos m
ORDER BY date_start

另一种解决方案是使用 FOR SELECT 在存储过程中进行所需的计算并迭代数据。

BALANCE = 0;

FOR SELECT id, data_start, value
FROM movimentos
ORDER BY date_start
INTO :ID, :DATA_START, :VALUE
DO
BEGIN
  BALANCE = BALANCE + VALUE;
  SUSPEND;
END

要应用 Debit/Credit 使用 IIFtipo_movimento 转换为 +1/-1,如果不是:

value * IIF(tipo_movimento = ?, +1, -1)