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

标签 php mysql sql accounting

我知道这个问题有多种变体,但不是这种形式。我的分类帐表的基本形式有以下列。

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

DateOfEntry 是存储事务插入时间的列。 TransactionDate 仅存储可以手动输入的交易日期,许多交易可以具有相同的 TransactionDate,因此我按照 TransactionDate、DateOfEntrydate、TransactionID 的顺序对 ASC 进行排序

我想维护每行的先前和最终余额(在插入、删除或编辑时)。我存储这些余额,即使我知道这是不可取的,因为我需要能够回顾性地了解余额,即我能够知道从日期 A 到日期 B 的交易以及每次交易后我的期末余额总是给我最后期末余额。

这样做可以插入当前日期的交易,并且可以通过检查该客户的最后记录并将其期末余额作为新的期初余额来轻松完成。

当我编辑、删除交易或插入新的“回溯”交易时,我遇到了问题。我如何知道在哪个位置之后插入和更新它们下面的行的余额?我知道仅使用 SQL 查询这是不可能的。

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

许多人建议我应该在日期 A 之前使用金额的 SUM()(首先检查是借方还是贷方)来获取日期 A 之前的期初余额,但这对于 来说是不可取的可能是非常大的表。 (目前我正在这样做,但想将其更改为存储余额)

大家有什么建议吗?

更新 我还想知道如果我使用 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

最佳答案

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

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

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

如果您确实想避免在查询中使用 SUM() (尽管我不确定为什么),另一种方法是向该表添加其他字段,以保留历史和当前余额。然而,这种方法仅限于单一历史余额。

此外,在查询中使用 SUM() 来获取当前余额实际上应该不是问题,即使在大型表或数据库中也是如此,除非我在这里遗漏了一些内容。

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

关于php - 维护分类帐表中每一行的期初和期末余额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471412/

相关文章:

javascript - 使用 Jquery 动态加载新内容

php - 如何以html形式发送动态值?

sql - 如何在 SQL 中过滤每个 id 仅具有初始行的行?

Java 类路径找不到 MySQL 驱动程序

mysql - 仅选择表中的公共(public)字段

多个表上的 SQL 计数(*)

php - 在尝试查询数据库时,我得到了我认为是表头名称而不是值的信息

Controller 数组中的 Javascript 不起作用

PHP/mysql - 我的时间戳不喜欢在大于 (>) 语句中

mysql - 需要帮助了解 MySQL 死锁的位置