维护分类帐表中每行的期初和期末余额

时间:2012-05-06 14:45:24

标签: php mysql sql accounting

我知道这个问题有多种变体,但不是这种形式。我的Ledger表格以基本形式包含以下列。

TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | OpeningBalance | Amount | ClosingBalance

DateOfEntry是一个存储事务插入时间的列。 TransactionDate只存储可以手动输入的事务日期,许多事务可以具有相同的TransactionDate,因此我按此顺序排序ASC TransactionDate,DateOfEntrydate,TransactionID

我想维护每一行的上一次和最后一次余额(插入,删除或编辑时)。我正在存储这些余额,即使我知道这是不可取的,因为我需要能够追溯地知道余额,即我能够知道从日期A到日期B我的交易是什么,并且我在每笔交易后的期末余额总是给我最后的期末余额。

执行此操作以插入当前日期的交易是可以的,可以通过检查该客户的最后一条记录并将其期末余额作为新的期初余额轻松完成。

我遇到的问题是当我编辑,删除交易或插入新的“过时”交易时。我怎么知道在哪个地方插入和更新它们下面的行的余额?我知道单独使用SQL查询是不可能的。

这次我只想知道最好的方法。

许多人建议我应该在日期A之前使用金额的SUM()(通过首先检查它是借方还是贷方)来获得我在日期A之前的期初余额,但是这不适合可能是非常大的表。 (目前我这样做但想把它改成存储余额)

有什么建议吗?

UPDATE 我还想知道我是否使用SUM(),在客户端的每个事务之后动态生成开始和结束余额的最佳方法是什么,而不是将其存储在表中以获取样本数据

TransactionID | DateOfEntrydate    | TransactionDate | ClientID | TrIsDebit | Amount
225           | 2012-05-06 18:20:10| 2012-03-01      | 360      | 0         |    100
219           | 2012-05-06 18:09:16| 2012-03-31      | 360      | 1         |   1000
224           | 2012-05-06 18:19:49| 2012-03-31      | 360      | 0         |    100
218           | 2012-05-06 18:08:09| 2012-04-30      | 360      | 1         |   1000
221           | 2012-05-06 18:17:55| 2012-04-30      | 360      | 1         |   1000
222           | 2012-05-06 18:18:58| 2012-04-30      | 360      | 0         |    500
220           | 2012-05-06 18:17:10| 2012-05-01      | 360      | 1         |   1000
223           | 2012-05-06 18:19:28| 2012-05-01      | 360      | 0         |    500

显示为

TransactionID | DateOfEntrydate    | TransactionDate | ClientID | TrIsDebit | "dynamicOpeningBalance" | Amount | "dynamicClosingBalance"
225           | 2012-05-06 18:20:10| 2012-03-01      | 360      | 0         |      0                  |  100   |-100
219           | 2012-05-06 18:09:16| 2012-03-31      | 360      | 1         |   -100                  | 1000   | 900
224           | 2012-05-06 18:19:49| 2012-03-31      | 360      | 0         |    900                  |  100   | 800
218           | 2012-05-06 18:08:09| 2012-04-30      | 360      | 1         |    800                  | 1000   |1800
221           | 2012-05-06 18:17:55| 2012-04-30      | 360      | 1         |   1800                  | 1000   |2800
222           | 2012-05-06 18:18:58| 2012-04-30      | 360      | 0         |   2800                  |  500   |2300
220           | 2012-05-06 18:17:10| 2012-05-01      | 360      | 1         |   2300                  | 1000   |3300
223           | 2012-05-06 18:19:28| 2012-05-01      | 360      | 0         |   3300                  |  500   |2800

1 个答案:

答案 0 :(得分:0)

因此,您希望能够知道在任何给定时间的余额,即使从那时起交易可能已被删除或编辑?如果是这样,有几种可能的方法。

一种方法是保留一份单独的历史余额表,而不是将它们存储在同一个表中。此另一个表将存储截止日期的日期和余额。可以在查询中计算当前余额。

另一种方法可能是保持原样。但是,在这种情况下,请使用余额字段仅维护历史余额。再次,可以在查询中计算当前余额。

另一种方法,如果你真的想避免在你的查询中使用SUM()(虽然我不确定为什么)会在这个表中添加额外的字段,以保持历史和当前的余额。然而,这种方法仅限于一个历史平衡。

此外,在查询中使用SUM()获取当前余额不应该是一个问题,即使在大型表或数据库中,除非我在这里遗漏了一些东西。

如果我误解了你的问题,请告诉我。