Report from Double Entry Accounting [closed]

a 夏天 提交于 2020-01-07 08:03:43

问题


My reputation is not enough to comment on this post: Relational Data Model for Double-Entry Accounting.

For the data model from the linked question, can anyone explain the calculation for the closing balance on the AccountStatement, any sample SQL?

  • And a small clarification, correct me if I'm wrong. For the calculation of the closing balance for every first day of the month, I have a button that triggers on my module to calculate it?

回答1:


Since you have linked that Answer, please up-vote both that question and the answer.

can any body explain to me how the general ledger transaction table works

First, SO guidelines are, you must ask just one clear question. That one is not clear. Ask a specific question about what you do not understand (from the linked Answer).

In the hope that this is what you are seeking, that this will suffice:

  • merely INSERT LedgerTransaction ... for each real world Ledger Transaction

If you are seeking more than that, it means you need accounting basics, which cannot be answered here. Check for the free Tutorials available on the web.

also for the calculation of the closing balance on the AccountStatement any sample sql?

SQL • View

I have upgraded the View from the linked question, to obtain TotalCredit & TotalDebit columns, for all Transactions since the 1st day of the previous month.

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 • MonthEnd • Insert AccountStatement

On the 1st day of the new month, the idea is to close the previous month, dated the 1st of the new month. We use the above View which to obtains the TotalCredit & TotalDebit columns for all Transactions since the 1st day of the previous month.

This is just one Task in the Month End job, on the 1st day of the month. It would normally be run on the batch queue, for all Accounts,with proper transaction control limits (eg. SET ROWCOUNT 500), etc.

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"

It is the same for updating the LedgerStatement.

correct me if im wrong, for the calculation of the closing balance for every first day of the next month, i have a button that trigger on my module to. calculate it?

No. Whereas the GUI interface is online, an app of any reasonable complexity needs to run jobs on the back end server. Eg. Month End; Daily backups; Transaction Log roll-ups; etc. Generally there is a set up on the server to do that, else you have to write one.

There will be many Tasks that comprise Month End. This is just one of those Tasks. There is a limit to what you can do in PHP, and I wouldn't dream of doing this in PHP. For technical and modularity reasons, I would place the code for that Task, and all the other Month End Tasks, in a stored proc Account_MonthEnd_btr.

You can't do it from a button because:

  • it will hang up the GUI until the Month End Task is finished, which may be more than a few minutes (depends on the number of Accounts, LedgerAccounts, etc).

  • it will blow the Transaction Log (if the number of Ledgers or Accounts is at all large). That control as well, has to be in the back end.



来源:https://stackoverflow.com/questions/59521817/report-from-double-entry-accounting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!