001*_*001 10 database sql-server accounting database-design sql-server-2008
问题:在下面的情况下,我是否应将所有金额存储为正数小数,然后将金额标记为"借方"或"贷方",而不是将借方存入负数和贷方作为正数?
在我的数据库设计中,我将"借记"存储为负数,将信用存储为正数.
现在报告有时结果出错了,因为如果你这样做了
TotalAmount =金额 - 费用,如果提款金额为100美元,费用为1美元.
你最终会得到 - $ 100- $ 1 = - $ 101,这是不正确的结果!
ste*_*egt 10
正如您所发现的那样,使用一列用于所有内容然后使用负数进行借记或贷记不起作用.会计值不是标量 - 它们是包含枚举(借方或贷方)和定点十进制数(可以是正数或负数)的向量.
任何会计交易必须包含相同数量的借方和贷方.如果没有,则不是有效的交易.
同样,帐户余额也是同一种向量.在任何时刻,会计系统中所有账户的总借方和总贷方必须彼此相等,否则就会出现问题.
另一种看待这种情况的方法是将会计价值视为一个复数,其中借方是真实的,而贷方是虚构的.这意味着4个借方+3个筹码= 4 + 3i.这很明显,你不能通过将虚拟术语折叠成负实数术语来进一步简化它 - 它不是相同的数字线轴.声称4 + 3i = 4 - 3就是一样的.不是有效的数学.
如果数据库本身可以存储复杂的数字,那么复数实际上是存储会计数据的好方法,可能会清除程序员通常对会计的许多困惑,并会导致各种有趣的属性.例如,平衡交易总是具有45度的相位角,就像一组平衡的账户一样.但是大多数数据库需要您在存储之前将复数分解为其实数和虚数,并将这些项存储在不同的列中 - 在会计世界中,这两列的名称分别是"借方"和"贷方".
PS:我知道有些人确实使用负数来获得积分,而积极地用于借记,但这需要非常谨慎地做好,并且很脆弱.每次触摸时,您都必须跟踪任何帐户的正常余额 - 例如,由于资产帐户具有借方正常余额,因此您可以使用正数来增加它.但负债账户的正常余额为负,因此该账户价值的增加为负数.你不能在任何时候将这两个值加在一起 - 它们不是一回事.借记是您拥有的,而信用是您欠的.将两者放在数据库表中的同一列中会闻起来很糟糕.
由于会计都基于日记帐分录,因此您的数据模型可能最好遵循.这意味着您的表中有两列,一列用于借记,一列用于信用.然后,您将其留给应用程序以确定应该被视为"正"值以及应该被视为"否定"的内容.(问题总是出现 - 从谁的观点来看是积极的?当你在银行账户之间转账时,对一个账户来说是"负面",对另一个账户来说是"正面".)
自从我处理这类事以来已经有一段时间了,但我似乎记得借记和贷记列可能包含正值和负值.会计师对数字的思考方式与我们的程序员不同,因此在为他们编写软件时,如果您尝试使用他们的约定,它可以简化事情.
小智 6
好的,我参加聚会有点晚了,但这里有一些有趣的答案,我想我应该添加我的看法。
回答这个问题:您应该将值存储为正数并标记为借方还是贷方?
简短的回答:您不需要添加标志,因为当您以正确的签名形式保存数字时,任何系统都会自动应用标志“借方”或“贷方”。这是“-”号。您应该将值存储在借方或贷方两列之一中吗?当然不 !为什么要为系统中的每个交易保存一个空字段?具有正确签名值的单个列更容易管理。
问题标题的较长答案:会计和数据库设计,存储借方和贷方金额。
只要您了解复式簿记,它就非常简单和强大。当您将日记帐过帐到名义分类帐时,您为用户提供了日记帐中每一行的借方字段和贷方字段。在您的应用程序中,您只允许其中一个字段具有值(每行),并且它必须是一个无符号的正值。当您编写交易时,如果您有借方,您只需按原样编写即可。如果您在贷项字段中有一个值,则将其反转并将其写为负数。数据库在每行(记录)的单列中只看到一个带符号的值。正如任何会计师都会告诉您日记帐分录必须平衡,因此日记帐交易行的数据库记录加起来为零。应用程序代码必须确保期刊必须是平衡的。
现在考虑用户添加到系统中的采购发票。假设我们有 Widget 公司的这张(不太可能)发票:
钢筋 500 英镑
一盒信封 100 英镑
车床 10000 英镑
£2120 购置税
发票总额 12720 英镑
应用程序将单个记录写入文档表。它具有到交易表的一对多链接。对于三行发票,应用程序写入 5 个事务行。
500 英镑与销售成本相关,这是一个盈亏总账账户。借方余额 = 损益中的费用
100 英镑与文具相关,这是一个盈亏总账账户。借方余额 = 损益中的费用
10000 英镑与机械,资产负债表总分类帐帐户相关联。借方余额 = bs 时的资产。
2120 英镑与可收回的进项税相关,一个 bs gl 帐户。借方余额=资产,我们欠税人的钱
-£12720 与 Creditors Control 相关联,一个 bs gl 账户。信用余额 = 负债,我们欠供应商
写入交易表的 5 条记录的总价值为 0.00 英镑。
现在考虑用户添加的销售发票:
高级小部件 250 英镑
标准小部件 250 英镑
100 英镑的销售税
总共 600 英镑的发票
再次将单个记录写入文档表。对于两行发票,写入了 4 个交易行。因为这是一张销售发票,应用程序必须在后台反转值。销售发票行是簿记信用,但用户不希望将它们添加为负值。
250 英镑 - 与溢价小部件销售相关,一个盈亏账户。贷方余额 = 损益时的收入/利润
250 英镑 - 与标准小部件销售相关,一个盈亏账户。贷方余额 = 损益时的收入/利润
100 英镑 - 与应付销项税相关,一个 bs gl 帐户。信用余额 = BS 中的负债。我们欠税务人员这笔钱。
600 英镑与债务人控制相关,一个 bs gl 账户。借方余额 = 资产,这是客户欠我们的。
写入交易表的 4 条记录的总价值为 0.00 英镑。
如果您想为退回的东西提供信用,在销售发票中添加负行是完全可以的。在写入事务之前,它们只是与所有其他行颠倒。更常见的是,您会发出贷方通知单,其中将行写为销售收入的借方,从而减少损益中的销售价值。
如果系统进行库存控制,则将数量写入交易行,并将它们链接到产品表。
银行分录经常让非簿记员出局。他们说,我们把钱存入银行,所以我们记入了账户。将银行视为业务外部的人。当您交出钱以妥善保管时,他/她就成了债务人,必须按要求将钱还给您。因此,银行的收款记录为借方,而支付的款项记录为贷方。当我们收到客户的付款时,我们会写两个交易行:
600 英镑与银行账户相关联,一个 bs gl 账户。借方余额 = 增加资产价值,我们有更多的钱。
600 英镑 - 与债务人控制(bs gl 帐户)相关联。信用余额 = 降低了资产的价值,我们欠的钱减少了。
写入交易表的 2 条记录的总价值为 0.00 英镑。
如果您按照此进行操作,您会看到在提出销售发票时,Debtors Control 已写入 600 英镑,并在收到付款时写入 600 英镑。净余额 = £0.00,这是我们的客户现在所欠的。
因此,通过正确的设计、关系和索引,所有报告都是通过文档和交易的组合完成的。
就是这样。任何时候对交易表求和时,它都应始终返回零。无需维护两列。应用程序需要做两件事,它需要进行编码,以便将正确的签名应用于各种交易类型,并且需要根据交易是 >0 还是 <0 在两列之一中呈现交易。因此,您可以将试算表、客户和供应商分类账、银行和现金账户以及总分类账都很好地格式化为借方和贷方列。
建立一个系统,在一次交易中记录双面记账的系统很有吸引力。如果单个交易失败,它不会使帐户失衡。您仍然只有一列已签名的值。你会为每笔交易记录两个 gl 外键,一个是你所记录的值,它可以是正值或负值来表示借方或贷方,另一个 gl 外键来记录你发布的账户反对('双重输入')值。您可能还需要为两个税收控制帐户记录 gl fk,一个用于输出税收控制帐户,另一个用于输入税收控制帐户。因此,您最终可能会将您的交易行链接到四个 gl 帐户,而不仅仅是一个(加上客户的链接,适用于这两种方法的供应商和产品表)。控制账户将有大量的交易与之相关联。一张 10 行的发票将有 10 笔交易与其相关联,而不是每个单据只有一笔。您必须单独计算每个发票行的税收元素,而不是作为文档的总计(无论如何您都可以这样做)。最后,您必须对日记账分录文档进行特殊安排,其中可能包括 10 行作为借方,所有行都被作为贷方抵消,因此单笔交易方法在这里不起作用。您必须单独计算每个发票行的税收元素,而不是作为文档的总计(无论如何您都可以这样做)。最后,您必须对日记账分录文档进行特殊安排,其中可能包括 10 行作为借方,所有行都被作为贷方抵消,因此单笔交易方法在这里不起作用。您必须单独计算每个发票行的税收元素,而不是作为文档的总计(无论如何您都可以这样做)。最后,您必须对日记账分录文档进行特殊安排,其中可能包括 10 行作为借方,所有行都被作为贷方抵消,因此单笔交易方法在这里不起作用。