基本sql复式记账分类账-如何拆分日记账分录

qvk1mo1f  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(425)

使用以下要点中的基本sql模式:https://gist.github.com/nykevin/9433376 ,如何创建拆分日记账分录?
我明白为什么 entries 表中有一个单独的金额,带有指向要贷记/借记的账户的指针-这迫使复式记账保持一致,并便于余额的计算。
但这似乎使得拆分日记账分录变得不可能。一个简单的例子就是在一个£1200购买:

1. Credit "Creditors control" account with £1200
2. Debit "VAT" account with £200
3. Debit "Purchases" account with £1000

一个更为复杂的例子是工资,其中有一个借记工资支出,另一个借记工资税支出,贷记现金和各种扣除账户。
这个sql模式是否不足以满足这些目的,或者是否有一种方法可以从要点中使用sql来实现这一点?

a0x5cqrl

a0x5cqrl1#

你说得对,gist中的示例模式使拆分日记账分录变得不可能。
您需要的是一个模式,该模式在每个单独的日记条目上都有一行。这是一个更灵活的设计,将适应复杂的情况下,你正在寻找。

示例

架构

我建议至少提供三张table来满足您的要求:

CREATE TABLE account(
    account_id serial PRIMARY KEY,
    account_name text NOT NULL
);

CREATE TABLE financial_transaction (
    financial_transaction_id serial PRIMARY KEY,
    datetimestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    description text NOT NULL
);

CREATE TABLE journal(
    journal_id serial PRIMARY KEY,
    financial_transaction_id INTEGER REFERENCES financial_transaction(financial_transaction_id),
    account_id INTEGER REFERENCES account(account_id),
    amount NUMERIC(20, 2) NOT NULL,
    is_credit boolean NOT NULL
);

帐户设置

我们将为您的示例创建三个帐户。尽管你可能不会硬编码 id ,我们这样做是为了演示

INSERT INTO account (account_id, account_name) VALUES (1, 'Creditors control');
INSERT INTO account (account_id, account_name) VALUES (2, 'VAT');
INSERT INTO account (account_id, account_name) VALUES (3, 'Purchases');

采购交易示例

每一个金融交易都有一行插入到 financial_transaction 表中至少插入两行 journal 表和这些行的贷方和借方之和必须平衡。

INSERT INTO financial_transaction (financial_transaction_id, description)
VALUES (1, 'Purchase of widget');

INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 1, 1200, TRUE);

INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 2, 200, FALSE);

INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 3, 1000, FALSE);

注意事项

您可以看到如何轻松地适应这种结构拆分日记账。可以方便地查询结构,并且可以为不同的目的聚合事务或帐户。
如果我在构建它,我可能会创建一个触发器,在任何交易结束时强制执行它,即它的贷方和借方的总和 journal 条目平衡。我可能还想定义某些类型的事务,以及这些事务类型可以记录到哪些类型的帐户,这取决于我的系统有多复杂或严格。
最后,我将创建一个规则、触发器或配置权限,以确保这些表中的行不会被删除或更新。在这样的系统中,所有的更正都应该通过额外的事务进行。

相关问题