Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 维护分类账表中每行的期初和期末余额_Php_Mysql_Sql_Accounting - Fatal编程技术网

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

Php 维护分类账表中每行的期初和期末余额,php,mysql,sql,accounting,Php,Mysql,Sql,Accounting,我知道这个问题有多种变体,但不是以这种形式。我的分类账表,基本形式有以下列 TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | OpeningBalance | Amount | ClosingBalance DateOfEntry是存储事务插入时间的列。TransactionDate只存储可以手动输入的事务的日期,许多事务可以具有相同的TransactionDate,因此我按Transactio

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

TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | OpeningBalance | Amount | ClosingBalance
DateOfEntry是存储事务插入时间的列。TransactionDate只存储可以手动输入的事务的日期,许多事务可以具有相同的TransactionDate,因此我按TransactionDate、DateOfEntrydate、TransactionID的顺序对ASC进行排序

我想为每一行(插入、删除或编辑时)保留以前的余额和最终余额。我储存这些余额,即使我知道这是不可取的,因为我需要能够追溯了解余额,即我能够知道从A日到B日的交易是什么,并且每次交易后我的期末余额总是给我最后的期末余额

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

我有一个问题是当我编辑、删除交易或插入新的“过期”交易时。我如何知道在哪个位置之后插入和更新它们下面的行的余额?我知道单凭SQL查询是不可能做到这一点的

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

许多人建议我应该在a日之前使用金额的总和()来获得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()来获取当前余额不应该是一个问题,即使是在大型表或数据库中,除非我在这里遗漏了什么


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

总和查询需要多少行才能对其性能产生影响?这是我在不久的将来唯一关心的事。我也更新了问题。如果我使用SUM,我希望得到这样的结果。Thanks我不认为对性能有任何“影响”,因为太多的记录不会因为算法的问题而使性能减慢。据我所知,它只会随着要求和的记录数线性降低。数万条记录应该在几秒钟内完成。我见过500万或600万条记录的报告只花了20秒左右。真正的问题是您的表设计得有多好,以及您要求查询完成的其他事情。好的。知道了。那么,您能否生成sql查询来动态获取上述示例的期初余额和期末余额?