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

时间:2015-05-08 17:10:13

标签: delphi delphi-7 firebird firebird2.5 running-total

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

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连接到它。它基本上要做的是显示我的余额,当条目是信用(在数据库中指定)时使用sum,在借方(duh)时使用sub。

为此,我必须得到最后一个余额行的值,求和(或者)新条目的值,并将这个新的ammount放入新的插入中。

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

实现这一目标的简单方法是什么?

编辑: 补充我的问题。我想做的就是这样(简化表格):

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列基本上就是我正在寻找的内容 再次感谢。

1 个答案:

答案 0 :(得分:1)

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

要使用借记/贷记使用IIFtipo_movimento转换为+ 1 / -1,如果不是:

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