Sql server 每行),并且它必须是正的无符号值。当你写交易时,如果你有一笔借方,你就按原样写。如果您在credit字段中有一个值,则将其反转并将其作为负数写入。数据库在每行(记录)的单个列中只看到一个带符号的值。正如任何会计都会告诉您的那样,日记账分录必须平衡,以便日记账交易行的数据库记录总和为零。应用程序代码必须确保日志必须平衡 现在考虑一个用户添加到系统的购买发票。假设我们为Widget公司开具了(不太可能)发票:

Sql server 每行),并且它必须是正的无符号值。当你写交易时,如果你有一笔借方,你就按原样写。如果您在credit字段中有一个值,则将其反转并将其作为负数写入。数据库在每行(记录)的单个列中只看到一个带符号的值。正如任何会计都会告诉您的那样,日记账分录必须平衡,以便日记账交易行的数据库记录总和为零。应用程序代码必须确保日志必须平衡 现在考虑一个用户添加到系统的购买发票。假设我们为Widget公司开具了(不太可能)发票:,sql-server,database,sql-server-2008,database-design,accounting,Sql Server,Database,Sql Server 2008,Database Design,Accounting,钢筋500英镑 一盒信封100英镑 一台车床10000英镑 2120英镑购置税 发票总额12720英镑 应用程序将单个记录写入documents表。它有到事务表的一对多链接。对于三行发票,应用程序将写入5个交易行 500英镑与销售成本挂钩,为损益总账账户。借方余额=损益表中的费用 100英镑与文具、损益总账账户挂钩。借方余额=损益表中的费用 10000英镑与机械相关,资产负债表总账账户。借方余额=资产负债表中的资产 2120英镑与bs gl账户的进项税可回收挂钩。借方余额=资产,税务员欠我们钱

钢筋500英镑

一盒信封100英镑

一台车床10000英镑

2120英镑购置税

发票总额12720英镑

应用程序将单个记录写入documents表。它有到事务表的一对多链接。对于三行发票,应用程序将写入5个交易行

500英镑与销售成本挂钩,为损益总账账户。借方余额=损益表中的费用

100英镑与文具、损益总账账户挂钩。借方余额=损益表中的费用

10000英镑与机械相关,资产负债表总账账户。借方余额=资产负债表中的资产

2120英镑与bs gl账户的进项税可回收挂钩。借方余额=资产,税务员欠我们钱

-12720英镑与债权人控制挂钩,一个bs gl账户。贷方余额=负债,这是我们欠供应商的

写入交易表的5条记录的总价值为0.00英镑。

现在考虑一个用户添加的销售发票:

250英镑购买高级小部件

标准小工具250英镑

100英镑销售税

发票总额600英镑

再次向documents表写入一条记录。对于双线发票,写入4个交易行。因为这是销售发票,所以应用程序必须在幕后反转这些值。销售发票行是记账信用,但用户不希望将其作为负值添加

250英镑-与Premium Widget Sales关联,一个损益总账账户。信用余额=损益表中的收入/利润

250英镑-与标准小部件销售挂钩,一个损益总账账户。信用余额=损益表中的收入/利润

100英镑-与应付销项税挂钩,一个bs gl账户。贷方余额=在BS中时的负债。我们欠税务员这笔钱

600英镑与债务人控制挂钩,一个bs gl账户。借方余额=资产,这是客户欠我们的

写入交易表的4条记录的总价值为0.00英镑。

如果你想对退回的东西给予信用,在销售发票上加上负数行是完全可以的。它们只是在写入事务之前与所有其他行一起反转。更常见的情况是,你会开具一张贷记单,将该行记为销售收入的借方,从而减少损益表中的销售额

如果系统进行库存控制,则数量会写入交易行,并链接到产品表

银行分录通常会使非簿记人被拒之门外。他们说,我们把钱放在银行里,这样我们就可以把钱存入账户。将银行视为企业外部的人。当你把钱交给保险公司保管时,他/她就成了债务人,必须按要求归还你的钱。因此,银行的收款记录为借项,而付款记录为贷项。当我们收到客户的付款时,我们会写两行交易:

600英镑与银行账户挂钩,一个bs gl账户。借方余额=增加资产价值,我们有更多的钱

600英镑-与债务人控制挂钩,一个bs gl账户。信贷余额=资产价值减少,我们所欠的款项减少

写入交易表的2条记录的总价值为0.00英镑。

如果您按照这一点进行操作,您将看到,在开具销售发票时,债务人控制向其写入了600英镑,在收到付款时,向其写入了600英镑。净余额=0.00英镑,这是我们客户现在欠下的金额

因此,通过正确的设计、关系和索引,所有报告都是从文档和事务的组合中完成的


就这样。每次对事务表求和时,它都应返回零。不需要维护两列。应用程序需要做两件事,需要对其进行编码,以便对各种交易类型应用正确的签名,它需要根据事务是>0还是在两列中的一列中显示事务,虽然已经有一个公认的答案,这也是问题的重点,但我也想分享我的观点,因为它可能会帮助其他人在设计数据库时做出特别的决定

总的来说,两者都有各自的优点和缺点,使用
abs()
可以很容易地结束这件事,就像在公认的答案中一样!但当你在不同的团队中交谈时,问题就来了,不同的人可能有不同的想法,相信我,保存(-ve)值实际上会造成更多的混乱,特别是当他们直接从数据库中读取值时

在大多数情况下,我并不反对在数据库中保存-ve值,但实际上,即使是作为数据库程序员,保存+ve值也会减少混淆,因为我们总是有一列说明(是借方还是贷方),谁来编写代码可以在应用程序级别轻松地转换它

唯一的例外是在数据库级别使用
sum(value)
,但实际上这是使用最少的场景,因为在会计中,我们主要显示的是运行余额,而在应用程序级别,我们可以使用(+)或(-ve)

我想提出的一点是,数据库可以从公司角度或客户角度使用,现在可以从公司角度使用
PK TransactionID - int
PK TransactionDetailSequenceID - smallint
   Amount decimal
   CreditDebitFlag char(1)