我正在编写一个简单的现金流程应用程序,使用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
列基本上就是我正在寻找的内容
再次感谢。
答案 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
要使用借记/贷记使用IIF
将tipo_movimento
转换为+ 1 / -1,如果不是:
value * IIF(tipo_movimento = ?, +1, -1)