sql >> Database teknologi >  >> RDS >> Mysql

Rapport fra dobbelt bogholderi

I håbet om, at det er det, du søger, vil det være tilstrækkeligt:

  • blot INSERT LedgerTransaction ... for hver virkelige finanstransaktion

Hvis du søger mere end det, betyder det, at du har brug for regnskabsgrundlæggende, som ikke kan besvares her. Se efter de gratis selvstudier, der er tilgængelige på nettet.

SQL • Vis

Jeg har opgraderet visningen fra det linkede spørgsmål for at opnå TotalCredit &TotalDebit kolonner, for alle Transaktioner siden den 1. dag i den foregående måned.

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 • Indsæt kontoudtog

Den 1. dag i den nye måned er det tanken at lukke den foregående måned, dateret den 1. i den nye måned. Vi bruger ovenstående visning til at opnå TotalCredit &TotalDebit kolonner for alle transaktioner siden den 1. dag i den foregående måned.

Dette er kun én opgave i månedsafslutningen, den 1. dag i måneden. Det ville normalt blive kørt på batch-køen for alle Accounts ,med korrekte grænser for transaktionskontrol (f.eks. SET ROWCOUNT 500 ), osv.

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"

Det er det samme for opdatering af LedgerStatement .

Nej. Mens GUI-grænsefladen er online, skal en app af enhver rimelig kompleksitet køre job på backend-serveren. For eksempel. Månedsafslutning; Daglige sikkerhedskopier; Oprulning af transaktionslog; osv. Generelt er der en opsætning på serveren til at gøre det, ellers skal du skrive en.

Der vil være mange opgaver, der omfatter månedsafslutning. Dette er blot en af ​​disse opgaver. Der er en grænse for, hvad du kan gøre i PHP, og jeg ville ikke drømme om at gøre dette i PHP. Af tekniske og modulære årsager ville jeg placere koden for den opgave og alle de andre månedsslutopgaver i en lagret proc Account_MonthEnd_btr .

Du kan ikke gøre det fra en knap, fordi:

  • det vil afbryde GUI'en, indtil månedsafslutningsopgaven er færdig, hvilket kan vare mere end et par minutter (afhænger af antallet af Accounts , LedgerAccounts osv.).

  • det vil sprænge transaktionsloggen (hvis antallet af Ledgers). eller Accounts er overhovedet stor). Den kontrol skal også være i bagenden.




  1. Forebyg SQL-injektionsangreb i et Java-program

  2. Mysql henter alle rækker med limit

  3. Sådan trækkes en dag fra en dato i MariaDB

  4. Hvordan kan jeg kontrollere, om der findes en MySQL-tabel med PHP?