sql - 尝试复式记账系统,但获取交易 list 是个问题

标签 sql sql-server

这个问题已经被问过几次了,但更多的是关于设计的。我正在尝试制作一个小型家庭财务应用程序来学习一些新技术。我采用了单双排双入口系统设计。

enter image description here

因此,日志是根事务,它有 2 个或更多事务。帐户可以是第三方(我付给我的伴侣一些现金,我得到公司的付款,我付给餐厅的晚餐费用)或银行帐户(我用信用卡付款)

这样,我就可以在两个帐户之间转账了。 (我从我的往来账户转入 200 美元到我的信用卡账户) 我可以收到钱。 (我的公司向我的往来账户付款。 我可以付钱给某人。 (我付给餐厅 20 美元的晚餐费)

那么,让我们使用最后一个例子。我用我的往来账户支付肯德基费用。 我有两个帐户要处理。肯德基,我的当前帐户。

我为此交易创建了一个日记帐。 然后,我为该日记创建了两个事务。

第一个金额为-20,帐户是我的银行帐户。 第二个是金额+20,账号是KFC。

我可以快速获取我的银行账户余额。

从日记中选择总和(金额),其中 AccountID = MyBankAccountId

完美。

但是我有一个问题。

如何显示我的银行帐户的交易列表?

enter image description here

所以我想获取 AccountId 1 的“声明”

enter image description here

但由此看来,我无法真正判断出我付给了谁,或者被付给了谁。它仅显示与帐户 1 相关的行。

上面的数据显示了我关心的帐户的交易,但是..我还需要显示其他帐户的详细信息。所以我需要以某种方式获取“SourceAccountId”和“DestinationAccountId”。

我的设计是否错误,我需要进行单行交易,源帐户 ID 和目标帐户 ID 位于同一行?

我遇到的问题是 - 我希望能够为我的交易分配预算。例如,我打算将 BudgetId 添加到 Transaction 表中,以便我将金额分配到不同的预算或类别。

(我去了五金店,花了 25 美元。这 25 美元中​​,10 美元用于我的“花园”预算,15 美元用于“内部家居装饰”预算。

所以我的交易行可能有 3 行。

1 向五金店账户存入 25 美元。 1 向我的银行账户借记 10 美元,预算 ID 为我的“花园预算”。 1 从我的银行帐户中扣除 15 美元,预算 ID 为我的“室内家居装饰”预算。

这也可能是一个问题,因为我的银行账户对账单上会出现两“行”... 一行 15 美元,另一行 10 美元。也许我可以进行一行交易,但然后...一个额外的预算分配表?

这会使获取账户余额变得更加棘手。我需要检查 SoutceAccountId 和 DestinationAccountId。

任何想法都会很棒。

最佳答案

我之前曾工作过并构建过一些 A/R 系统,这……至少可以说很有趣。通常,它的完成方式是将金额记录为正数(无论付款交易如何... 100 美元在交易级别移动到某个位置,方向无关),因此除了在其中记录 +/- 之外,我认为你的交易表没问题。不过,可能需要添加一个备注字段,以便您可以记录它的用途(即,假设您支付电费账单,您可以记录此交易是“19 年 6 月账单”)。

日记表是奇迹发生的地方。

我见过两种模型,都有效:

ID - PKey - Integer - IDENTITY
TransactionID - FKey - Integer - Indicates the parent Transaction
Amount - Decimal - The amount of the journal entry
AccountID - FKey - integer - Indicates the Account the journal entry is for
NetEffect - Bit - Flag which indicates if the item is a Credit (True) or Debit (False)

或者...

ID - PKey - Integer - IDENTITY
TransactionID - FKey - Integer - Indicates the parent Transaction
DebitAmount - Decimal - Amount of Debit
CreditAmount - Decimal - Amount of Credit
DebitAccountID - FKey - Integer - Indicates the Debit account for the item
CreditAccountID - FKey - Integer - Indicates the Credit account for the item

然后双方都会使用 Sum(Debits) - Sum(Debits) 来获得余额。

第一个应该是解释性的。第二种更接近于复式记账形式。您可以使用贷方或借方字段作为条目,但不能同时使用两者。但它也使您的预算计算更加容易。

该交易将达到 25 美元。交易记录如下:

1 -- 1 -- 00 -- 25 -- null -- {account number for garden store}
2 -- 1 -- 10 -- 00 -- {Account for Garden Budget} -- null
3 -- 1 -- 15 -- 00 -- {Internal home Budget} -- null

要分配一些预算:

4 -- 2 -- 25 -- 00 -- null -- {Account for Garden Budget}
5 -- 2 -- 25 -- 00 -- null -- {Internal hom Budget}
6 -- 2 -- 00 -- 50 -- {Your checking account} -- null

这会将 50 美元转移到您的两项预算中,其中一项预算为 25 美元,另一项预算为 25 美元,并从您的帐户中扣除。

然后你就得到报酬:

7 -- 3 -- 1000 -- 00 -- null -- {Checking account number}
8 -- 3 -- 00 -- 1000 -- {Account for employer} -- null

希望这一切都有意义。

关于sql - 尝试复式记账系统,但获取交易 list 是个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57220095/

相关文章:

SQL查询每天最新记录

php - 如何防止 PHP 中的 SQL 注入(inject)?

mysql - 用另一个表的列更新一个表的一列(一对多关系)

sql - 如果不存在行,如何让 SQL Server 返回默认值 0?

c# - 如何在不在每个过程中创建附加参数的情况下将线程文化从应用程序传递到 sql server?

sql-server - 我运行的是 32 位还是 64 位 Sql Server

sql-server - 偶发的 SQL 连接超时

javascript - 防止 JavaScript/Node.js 中的 SQL 注入(inject)

php - 如果最近插入了日期,如何恢复正确的日期

sql - 将 NVARCHAR 转换为货币值