问题:在以下情况下,我是否应该将所有金额存储为正十进制金额,然后将该金额标记为“借方”或“贷方”,而不是将借方存储为负金额,贷方存储为正金额?
在我的数据库设计中,我将“借方”存储为负数,将贷方存储为正数。
现在在报告中有时结果会出错,因为如果你这样做
TotalAmount = Amount-Fee,如果取款金额为$100,手续费为$1。
你最终会得到 -$100-$1 = -$101,这是不正确的结果!。
问题:在以下情况下,我是否应该将所有金额存储为正十进制金额,然后将该金额标记为“借方”或“贷方”,而不是将借方存储为负金额,贷方存储为正金额?
在我的数据库设计中,我将“借方”存储为负数,将贷方存储为正数。
现在在报告中有时结果会出错,因为如果你这样做
TotalAmount = Amount-Fee,如果取款金额为$100,手续费为$1。
你最终会得到 -$100-$1 = -$101,这是不正确的结果!。
正如您所发现的,对所有内容使用一列,然后对借方或贷方使用负数是行不通的。会计值不是标量——它们是包含枚举(借方或贷方)和定点十进制数(可以是正数或负数)的向量。
任何会计交易必须包含相等数量的借方和贷方。如果没有,它不是一个有效的交易。
同样,账户余额也是同一种向量。在任何时刻,会计系统中所有账户的总借方和总贷方必须彼此相等,否则就会出现问题。
另一种看待这个问题的方法是将会计价值视为一个复数,其中借方是实数,贷方是虚数。这意味着 4 借方 + 3 贷方 = 4 + 3i。这很明显,您无法通过将虚项分解为负实项来进一步简化这一点——它不是同一个数轴。这与声称 4 + 3i = 4 - 3 相同。无效的数学。
如果数据库可以原生存储复数,那么复数实际上将是存储会计数据的好方法,可能会消除程序员通常对会计的许多困惑,并会带来各种有趣的属性。例如,平衡的交易总是有 45 度的相位角,平衡的账户集也是如此。但是大多数数据库需要您在存储之前将复数分解为其实部和虚部,并将这些项存储在不同的列中——在会计领域,这两列的名称分别是“借方”和“贷方”。
PS:我知道有些人确实对贷方使用负数,对借方使用正数,但这需要非常小心才能做到正确,而且很脆弱。每次触摸任何账户时,您都必须跟踪它的正常余额——例如,由于资产账户有借方正常余额,那么您可以使用正数来增加它。但是负债账户的正常余额为负数,因此该账户价值的增加是一个负数。你不能在任何时候把这两个值加在一起——它们不是一回事。借记是您拥有的东西,而贷记是您欠的东西。将两者放在数据库表的同一列中很难闻。
由于会计全部基于日记帐分录,因此您的数据模型可能最好以此为基础。这意味着您的表中有两列,一列用于借方,一列用于贷方。然后由应用程序决定什么应该被视为“正”值,什么应该被视为“负”。(问题总是出现——从谁的角度来看是积极的?当你在银行账户之间转账时,一个账户是“消极的”,而另一个账户是“积极的”。)
自从我从事这种事情以来已经有一段时间了,但我似乎记得借方和贷方列可能同时包含正值和负值。会计师对数字的思考方式与我们程序员不同,因此在为他们编写软件时,如果您尝试遵循他们的惯例,它可以简化事情。
我使用 Sage Timberline 会计系统,它将借方保存为正金额,将贷方保存为负金额。在包括试算表在内的所有报告中,您都会进行借方 + 贷方。然后,您为借方冲销做负借方,为贷方冲销做正贷方。工作正常
好的,我参加聚会有点晚了,但这里有一些有趣的答案,我想我应该补充一下。
回答这个问题:您应该将值存储为正数并标记为借方还是贷方?
简短的回答:您不需要添加标志,因为当您以正确的签名形式保存数字时,任何系统都会自动应用标志“借方”或“贷方”。这是“-”号。您应该将值存储在借方或贷方两列之一中吗?当然不 !为什么要为系统中的每笔交易保存一个空白字段?具有正确符号值的单个列更易于管理。
问题标题的较长答案:会计和数据库设计,存储借方和贷方金额。
只要您了解复式簿记,它就非常简单和强大。当您将日记帐过帐到名义分类帐时,您为用户提供了日记帐中每一行的借方字段和贷方字段。在您的应用程序中,您只允许其中一个字段具有值(每行),并且它必须是正的、无符号的值。当你写交易时,如果你有借记,你就按原样写。如果信用字段中有值,则将其反转并将其写为负数。数据库在每行(记录)的单个列中只能看到一个带符号的值。任何会计师都会告诉您日记帐分录必须平衡,因此日记帐交易行的数据库记录加起来为零。应用程序代码必须确保日志必须是平衡的。
现在考虑用户添加到系统的采购发票。假设我们有 Widget Company 的这张(不太可能的)发票:
钢筋 500 英镑
一盒信封 100 英镑
车床10000英镑
2120 英镑的购置税
发票总额 12720 英镑
应用程序将单个记录写入文档表。它具有到事务表的一对多链接。对于三行发票,应用程序写入 5 个交易行。
500 英镑与销售成本挂钩,这是一个损益总账帐户。借方余额 = 损益表中的费用
100 英镑与损益总账账户 Stationery 相关联。借方余额 = 损益表中的费用
10000 英镑与资产负债表总分类账账户 Machinery 相关联。借方余额=在bs时的资产。
2120 英镑与可收回的进项税相关联,这是一个 bs gl 帐户。借方余额=资产,我们被税务人欠了钱
- 12720 英镑链接到 Creditors Control,一个 bs gl 帐户。贷方余额=负债,我们欠供应商
写入事务表的 5 条记录的总价值为 0.00 英镑。
现在考虑用户添加的销售发票:
高级小部件 250 英镑
标准小部件 250 英镑
100 英镑的销售税
发票总额 600 英镑
再次将单个记录写入文档表。对于两行发票,写入 4 个交易行。因为这是一张销售发票,所以应用程序必须在后台反转值。销售发票行是簿记信用,但用户不希望将它们添加为负值。
250 英镑 - 链接到 Premium Widget Sales,一个损益表帐户。贷方余额 = 损益时的收入/利润
250 英镑 - 与标准小部件销售挂钩,这是一个损益表帐户。贷方余额 = 损益时的收入/利润
100 英镑 - 链接到应付销项税,一个 bs gl 帐户。信用余额 = 在 BS 中的负债。我们欠纳税人这笔钱。
600 英镑与 Bs gl 帐户 Debtors Control 相关联。借方余额=资产,这是客户欠我们的。
写入事务表的 4 条记录的总价值为 0.00 英镑。
如果您想对退回的东西给予信用,在销售发票中添加负数行是完全可以的。在编写交易之前,它们只是与所有其他行相反。更常见的是,您会签发一张贷方票据,其中的行记为销售收入的借方,从而减少损益表中的销售价值。
如果系统进行库存控制,数量将写入交易行,并将它们链接到产品表。
银行分录经常把非簿记员赶出去。他们说,我们把钱存入银行,所以我们记入了账户。将银行视为企业外部的人。当您交出钱以妥善保管时,她/他将成为债务人,并且必须按要求归还您的钱。因此,银行的收入记录为借方,而支付的款项记录为贷方。当我们收到客户的付款时,我们会编写两条交易行:
600 英镑链接到银行账户,一个 bs gl 账户。借方余额=增加资产的价值,我们有更多的钱。
600 英镑 - 与 bs gl 帐户 Debtors Control 相关联。贷方余额=降低资产的价值,我们欠我们的钱更少。
写入事务表的 2 条记录的总价值 0.00 英镑。
如果您按照此操作,您会看到在提出销售发票时,Debtors Control 已写入 600 英镑,在收到付款时已写入 600 英镑。净余额 = 0.00 英镑,这是我们的客户现在所欠的。
因此,通过正确的设计、关系和索引,所有的报告都是从文档和交易的组合中完成的。
就是这样。每次对事务表求和时,它都应始终返回零。无需维护两列。应用程序需要做两件事,需要对其进行编码,以便将正确的签名应用于各种交易类型,并且需要根据交易是 >0 还是 <0 在两列之一中呈现交易。因此,您可以将试算表、客户和供应商分类账、银行和现金账户以及总账很好地格式化为借方和贷方列。
建立一个将复式录入双方记录在一个交易中的系统很有吸引力。如果单笔交易失败,它不会使账户失衡。您仍然只有一列的值,已签名。您将为每笔交易记录两个 gl 外键,一个用于记录您记录的值,可以是表示借方或贷方的正值或负值,另一个 gl 外键用于记录您发布的帐户反对('双重输入')值。您可能还需要为两个税控帐户记录 gl fk,一个用于销项税控制帐户,一个用于进项税控制帐户。因此,您最终可能会将您的交易行链接到四个 gl 帐户,而不仅仅是一个(加上客户的链接,适用于这两种方法的供应商和产品表)。控制账户将有大量与之相关的交易。一张 10 行的发票将有 10 个交易链接,而不是每个文档只有一个。您必须单独计算每个发票行的税项,而不是作为文档的总计(无论如何您都可以这样做)。最后,您必须对日记账分录文档进行特殊安排,其中可能包括 10 行作为借方,所有借方作为贷方抵消,因此单交易方法在这里不起作用。您必须单独计算每个发票行的税项,而不是作为文档的总计(无论如何您都可以这样做)。最后,您必须对日记账分录文档进行特殊安排,其中可能包括 10 行作为借方,所有借方作为贷方抵消,因此单交易方法在这里不起作用。您必须单独计算每个发票行的税项,而不是作为文档的总计(无论如何您都可以这样做)。最后,您必须对日记账分录文档进行特殊安排,其中可能包括 10 行作为借方,所有借方作为贷方抵消,因此单交易方法在这里不起作用。
You can use the ABS function within sql server to get the absolute value. This would allow you to treat negative numbers as positive ones.
eg:
select ABS(-100)
returns 100
, not -100
.
这是一本名为“The Data Model Resource Book”的好书的交易细节模式。此模式无需使用两列即可满足所有记录要求。
PK TransactionID - int
PK TransactionDetailSequenceID - smallint
Amount decimal
CreditDebitFlag char(1)
简单而有效,并且不像这里的其他答案所建议的那样使用无关的列。一列存储所有数值数据,并且仍然使您能够正确跟踪资产和负债帐户。
虽然已经有一个公认的答案,这也是问题的重点,但我也想分享我的意见,因为它可以帮助其他人在设计数据库时做出特别决定!
总体而言,两者都有各自的优缺点,并且可以通过使用abs()
as 在接受的答案中轻松结束问题!但是当你跨团队交谈时,问题就来了,不同的人可能有不同的想法,相信我保存(-ve)值实际上会引起更多的混乱,特别是如果他们直接从数据库中读取值!
在大多数情况下,我不反对在借记时将 -ve 值保存在数据库中,但保存 +ve 实际上会减少混淆,即使作为数据库程序员也是如此,因为我们总是有一列告诉(是借记还是贷记)以及谁是打算写代码可以很容易地在 App Level 转换它。
唯一的例外是sum(value)
在数据库级别使用,但实际上这是最少使用的场景,因为在会计中,我们主要显示运行余额,而在应用程序级别,我们可以使用 (+) 或 (-ve)。
我想提出的一点是,数据库可以用于公司视角或客户视角,现在公司拥有从两个角度思考的数据分析师,一旦我们只保存 +ve 数字,它就会变得更容易记住,因为我们已经有了一个标志知道什么是什么价值!