sql >> Database >  >> RDS >> Mysql

Rapport van Double Entry Accounting

In de hoop dat dit is wat u zoekt, dat dit zal volstaan:

  • slechts INSERT LedgerTransaction ... voor elke echte grootboektransactie

Als u meer zoekt dan dat, betekent dit dat u basiskennis van boekhouding nodig heeft, die hier niet kan worden beantwoord. Kijk voor de gratis zelfstudies die beschikbaar zijn op internet.

SQL • Bekijken

Ik heb de weergave van de gekoppelde vraag geüpgraded om TotalCredit te verkrijgen &TotalDebit kolommen, voor alle transacties sinds de 1e dag van de vorige maand.

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> - 
            <TotalDebit_Subquery>
        FROM AccountStatement                -- 1st day of this month
        WHERE Date = CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

SQL • MonthEnd • AccountStatement invoegen

Op de 1e van de nieuwe maand is het de bedoeling om de vorige maand af te sluiten, namelijk de 1e van de nieuwe maand. We gebruiken de bovenstaande weergave om de TotalCredit . te verkrijgen &TotalDebit kolommen voor alle transacties sinds de 1e dag van de vorige maand.

Dit is slechts één taak in de taak van het einde van de maand, op de 1e dag van de maand. Het zou normaal gesproken worden uitgevoerd in de batch-wachtrij, voor alle Accounts ,met de juiste transactiecontrolelimieten (bijv. SET ROWCOUNT 500 ), enz.

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"

Hetzelfde geldt voor het bijwerken van de LedgerStatement .

Nee. Terwijl de GUI-interface online is, moet een app van enige redelijke complexiteit taken uitvoeren op de back-endserver. bijv. Einde van de maand; Dagelijkse back-ups; Transactielogboekoverzichten; enz. Over het algemeen is er een instelling op de server om dat te doen, anders moet je er een schrijven.

Er zullen veel taken zijn die het einde van de maand omvatten. Dit is slechts een van die taken. Er is een limiet aan wat je kunt doen in PHP, en ik zou er niet aan denken om dit in PHP te doen. Om technische en modulariteitsredenen zou ik de code voor die taak en alle andere maandeindtaken in een opgeslagen proces plaatsen Account_MonthEnd_btr .

Je kunt het niet met een knop doen omdat:

  • het zal de GUI ophangen totdat de taak voor het einde van de maand is voltooid, wat meer dan een paar minuten kan duren (afhankelijk van het aantal Accounts , LedgerAccounts , enz.).

  • het zal het transactielogboek opblazen (als het aantal Ledgers of Accounts helemaal niet groot is). Die controle moet ook aan de achterkant zitten.




  1. MySQL:dateert van vóór 1970

  2. .patch_storage

  3. Tijdzones gebruiken in een PHP-webtoepassing

  4. Wat betekent de volgende Oracle-fout:ongeldige kolomindex