重复输入会计报表

时间:2019-12-29 17:43:39

标签: php mysql database-design accounting

我的声誉不足以对这篇文章发表评论:Relational Data Model for Double-Entry Accounting

对于链接的问题中的 data model ,任何人都可以在任何示例SQL上解释AccountStatement上期末余额的计算吗?

  • 还有一点澄清,如果我错了,请纠正我。为了计算每月第一天的期末余额,我有一个按钮可以触发我的模块进行计算吗?

1 个答案:

答案 0 :(得分:3)

既然您已经链接了该答案,请同时对该问题和答案进行投票。

  

任何人都可以向我解释总账交易表的工作原理

首先,SO准则是,您必须只问一个明确的问题。那一个不清楚。询问有关您不了解的内容的特定问题(来自链接的答案)。

希望这就是您要寻找的,就足够了:

  • 每笔真实世界的账务交易仅INSERT LedgerTransaction ...

如果您要寻求更多的信息,则意味着您需要会计基础知识,此处无法回答。查看网上提供的免费教程。

  

还用于计算AccountStatement上的期末余额的任何示例sql吗?

SQL•视图

我已从链接的问题升级了“视图”,以获取自上个月第一天以来的所有交易的TotalCreditTotalDebit列。

CREATE VIEW Account_Current_V 
AS
    SELECT 
        AccountNo,
        Date = DATEADD( DD, -1, GETDATE() ), -- show previous day
        ClosingBalance,
        TotalCredit = (
            -- TotalCredit_Subquery
            SELECT SUM( Amount )
                FROM AccountTransaction
                WHERE AccountNo = @AccountNo
                    AND XactTypeCode_Ext IN ( "AC", "Dp" )
                        -- this month
                    AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
                ),
        TotalDebit = (
            -- TotalDebit_Subquery
            SELECT SUM( Amount )
                FROM AccountTransaction
                WHERE AccountNo = @AccountNo
                    AND XactTypeCode_Ext NOT IN ( "AC", "Dp" )
                    AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
                ),
        CurrentBalance = ClosingBalance + 
            <TotalCredit_Subquery> - 
            <TotalCredit_Subquery>
        FROM AccountStatement                -- 1st day of this month
        WHERE Date = CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

SQL•月末•插入AccountStatement

在新月的第一天,想法是关闭上个月的日期,即新月的第一天。我们使用上面的视图来获取自上个月第一天以来所有交易的TotalCreditTotalDebit列。

这仅是月底第一天的月结任务中的一项任务。通常,它会在所有Accounts的批处理队列上运行,并具有适当的事务控制限制(例如SET ROWCOUNT 500)等等。

INSERT AccountStatement 
    SELECT  AccountNo,
            -- Date: 1st day of this month
            CONVERT( CHAR(6), GETDATE(), 2 ) + "01",
            ACV.CurrentBalance,
            ACV.TotalCredit,
            ACV.TotalDebit
        FROM Account_Current_V    ACV
            JOIN AccountStatement ASS
                ON ACV.AccountNo = ASS.AccountNo
        -- AccountStatements that are not yet MonthEnd-ed
        -- get single row that is newest
        WHERE ASS.Date = (
            SELECT MAX( Date )
                FROM AccountStatement
                WHERE AccountNo = ASS.AccountNo
                )
                -- that is not 1st day of this month
            AND ASS.Date != CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

与更新LedgerStatement相同。

  

如果我错了,请纠正我,为了计算下个月的每个第一天的期末余额,我有一个按钮可以触发我的模块。计算吗?

不。尽管GUI界面是在线的,但任何具有合理复杂性的应用都需要在后端服务器上运行作业。例如。月末;每日备份;事务日志汇总;等等。通常在服务器上有一个设置可以执行此操作,否则您必须编写一个。

构成月末的任务很多。这只是这些任务之一。在PHP中可以执行的操作有一个限制,而我也不想在PHP中执行此操作。出于技术和模块化的原因,我将该任务以及所有其他月末任务的代码放在存储的proc Account_MonthEnd_btr中。

您不能通过按钮执行此操作,因为:

  • 它将挂起GUI直到月末任务结束,这可能要花几分钟以上(取决于AccountsLedgerAccounts等的数量。) / p>

  • 它将清除事务日志(如果LedgersAccounts的数量全都很大)。该控件也必须位于后端。