如何使用计算字段计算现金流量?
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 使用 IIF
将 tipo_movimento
转换为 +1/-1,如果不是:
value * IIF(tipo_movimento = ?, +1, -1)
我正在编写一个简单的现金流应用程序,使用 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 使用 IIF
将 tipo_movimento
转换为 +1/-1,如果不是:
value * IIF(tipo_movimento = ?, +1, -1)