Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Bericht aus der doppelten Buchhaltung

In der Hoffnung, dass dies das ist, was Sie suchen, dass dies ausreicht:

  • nur INSERT LedgerTransaction ... für jede reale Ledger-Transaktion

Wenn Sie mehr suchen, brauchen Sie Buchhaltungsgrundlagen, die hier nicht beantwortet werden können. Suchen Sie nach den kostenlosen Tutorials, die im Internet verfügbar sind.

SQL • Anzeigen

Ich habe die Ansicht der verknüpften Frage aktualisiert, um TotalCredit zu erhalten &TotalDebit Spalten, für alle Transaktionen seit dem 1. Tag des Vormonats.

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 • Monatsende • Kontoauszug einfügen

Am 1. Tag des neuen Monats soll der vorherige Monat mit dem Datum 1. des neuen Monats abgeschlossen werden. Wir verwenden die obige Ansicht, um den TotalCredit zu erhalten &TotalDebit Spalten für alle Transaktionen seit dem 1. Tag des Vormonats.

Dies ist nur eine Aufgabe im Monatsende-Job am 1. Tag des Monats. Es würde normalerweise für alle Accounts in der Stapelwarteschlange ausgeführt , mit angemessenen Transaktionskontrolllimits (z. B. SET ROWCOUNT 500 ) usw.

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"

Das Gleiche gilt für die Aktualisierung des LedgerStatement .

Nein. Während die GUI-Schnittstelle online ist, muss eine App mit angemessener Komplexität Jobs auf dem Back-End-Server ausführen. Z.B. Monatsende; Tägliche Backups; Transaktionsprotokoll-Rollups; usw. Im Allgemeinen gibt es dafür eine Einrichtung auf dem Server, ansonsten müssen Sie eine schreiben.

Es wird viele Aufgaben geben, die das Monatsende umfassen. Dies ist nur eine dieser Aufgaben. Es gibt eine Grenze für das, was Sie in PHP tun können, und ich würde nicht im Traum daran denken, dies in PHP zu tun. Aus technischen und modularen Gründen würde ich den Code für diese Aufgabe und alle anderen Aufgaben zum Monatsende in einer gespeicherten Prozedur Account_MonthEnd_btr platzieren .

Sie können dies nicht über eine Schaltfläche tun, weil:

  • Es wird die GUI auflegen, bis die Monatsende-Aufgabe abgeschlossen ist, was mehr als ein paar Minuten dauern kann (abhängig von der Anzahl der Accounts , LedgerAccounts usw.).

  • es wird das Transaktionsprotokoll löschen (wenn die Anzahl der Ledgers oder Accounts überhaupt groß ist). Auch diese Kontrolle muss sich im Backend befinden.